Где хранятся данные программ Андроид

Это перевод серии статей от Mark Murphy из CommonsWare, широко известного на stackoverflow, а так же автора книг “The Busy Coder’s Guide to Android Development”, “Android’s Architecture Components”. Некоторые термины оставлены не переведенными специально.

Internal Storage

Существует много путаницы в отношении модели хранилища Android. Путаницы стало значительно больше с изменениями Android 4.4 в Storage Model, и с тех пор ситуация не улучшилась. Есть бесчисленное множество вопросов на Stack Overflow и тому подобных ресурсах, где люди явно не совсем разбираются в различных моделях хранилищ Android.

То, что пользователи считают Internal Storage

В зависимости от модели вашего устройства пользователи в конечном итоге придут в «Настройки» —> «Хранилище на этом устройстве» (Settings —> Storage on their device) или в эквивалентном месте, и могут видеть экран, который описывает «Внутреннее хранилище».

Пользователь думает, что вся встроенная флешка — это «внутреннее хранилище» (Internal Storage). К счастью, Google начал менять этот термин с Android 8.0, перейдя к «general storage» вместо «internal storage».

Им о тебе известно ВСЁ! Именно здесь Google собирает и хранит все данные о тебе! 12 ГБ информации

Тем не менее, пользователи могут по-прежнему видеть «внутреннее хранилище» в таких местах, как окно проводника в Windows, когда их устройство подключено через USB.

Что Google считает Internal Storage

Увы, то, что видят пользователи это не то же самое, что Android SDK считает «внутренним хранилищем», что приводит к некоторой путанице. Если вы читали документацию на Android по внутреннему хранилищу, то это описание … как минимум туманно (прим. текст изменился со времени написания статьи):

Вы можете сохранять файлы непосредственно во внутренней памяти устройства. По умолчанию файлы, сохраненные во внутреннем хранилище, являются приватными для вашего приложения, и другие приложения не могут получить к ним доступ (также как и пользователь). Когда пользователь удаляет приложение, эти файлы удаляются.

По правде говоря, Android SDK определяет «внутреннее хранилище» как особый каталог, уникальный для вашего приложения, где ваше приложение может размещать файлы. Как было предложено в документации, эти файлы по умолчанию предназначены для чтения и записи для вашего приложения и запрещены для любого другого приложения (исключение: пользователи, работающие с файловыми менеджерами с привилегиями суперпользователя на rooted устройствах могут получить доступ ко всему).

В Context есть несколько базовых методов, которые предоставляют вам доступ к внутреннему хранилищу, в том числе:

  • getCacheDir()
  • getDir()
  • getDatabasePath()
  • getFilesDir()
  • openFileInput()
  • openFileOutput()

Другие методы будут опираться на них, такие как openOrCreateDatabase() . Другие классы также будут полагаться на них, такие как SQLiteOpenHelper и SharedPreferences .

Где хранится Internal Storage … Иногда

Если вы просматриваете различные сообщения в блогах, ответы на StackOverflow и книги, выпущенные в 2012 году или ранее, вам сообщается, что «внутреннее хранилище» вашего приложения находится по адресу: /data/data/your.application.package.name .

Здесь вы НАЙДЕТЕ все личные данные о себе, которые GOOGLE собирает и хранит.

Внутри будут некоторые каталоги, автоматически созданные Android, поскольку вы используете некоторые из методов Context. Например, getFilesDir() возвращает объект File , указывающий на каталог files/ во внутреннем хранилище вашего приложения.

Где хранится Internal Storage … Остальное время

Однако не всегда внутреннее хранилище вашего приложения находится в указанном месте. Для разработчиков есть одно правило, которое вы должны усвоить из этой серии сообщений в блоге, это:

NEVER HARDCODE PATHS.

Время от времени я вижу, что разработчики делают что-то вроде этого:

File f=new File(«/data/data/their.app.package.name/files/foo.txt»);

Это не преступление, это хуже, это — ошибка.

Правильный ход, да и писать меньше:

File f=new File(getFilesDir(), «foo.txt»);

Что еще более важно, внутреннее хранилище не всегда находится в одном месте. Примечательно, что у нас есть понятие отдельных профилей пользователей (separate user profiles), начиная с Android 4.2 для планшетов и Android 5.0 для телефонов. Каждый пользователь получает свое собственное «внутреннее хранилище». Хотя вышеупомянутый каталог по-прежнему используется для основного пользователя, не гарантируется, что он же будет использоваться для вторичных учетных записей.

Исследуем Internal Storage

Device File Explorer tool в Android Studio 3.0+ может просматривать все внутренние хранилища на эмуляторе, а также внутреннее хранилище отлаживаемых приложений на продакшн устройствах.

В командной строке вы можете использовать adb с опцией run-as .

Например, чтобы загрузить базу данных из внутреннего хранилища основного пользователя на вашу девелоперскую машину, вы можете использовать:

adb shell ‘run-as your.application.package.name cp /data/data/your.application.package.name/databases/dbname.db /sdcard’

Обратите внимание, что:

  • Вам нужно будет изменить пункт назначения туда, где на вашем устройстве монтируется внешнее хранилище (показано здесь как /sdcard/ , которое не будет одинаковым на всех устройствах)
  • Возможно, вам придется использовать cat вместо cp на старых устройствах
  • После того, как файл будет находиться на внешнем хранилище, вы сможете использовать adb pull , чтобы загрузить его на свой компьютер, или получить доступ к нему другими обычными способами (например, путем монтирования устройства в качестве диска).
Читайте также:
Как открыть программу на двух мониторах

Ограничения внутреннего хранилища

На старых устройствах Android 1.x и 2.x внутреннее хранилище обычно находилось в выделенном разделе файловой системы, и этот раздел обычно был довольно крошечным. HTC Dream (a.k.a., T-Mobile G1), оригинальное Android-устройство, обладал огромными 70 МБ встроенной памяти для использования всеми приложениями (это не опечатка, в то время мы измеряли память в мегабайтах).

К тому времени, когда вышли 2.3 устройства, внутреннее хранилище могло быть размером 1 ГБ.

Android 3.0 изменил модель хранилища, так как внутреннее хранилище стало больше объемом. У устройств, которые рекламируют как имеющее 4 ГБ, 8 ГБ, 16 ГБ и т.д. пространства для хранения, обычно имелось все это (минус существующее содержимое) доступное для внутреннего хранилища. Мы рассмотрим, что изменилось в Android 3.0 и его влияние на модель хранилища в следующих постах про внешнее хранилище.

Для Android 1.x и 2.x внутреннее хранилище было действительно только для небольших файлов, и вам нужно было использовать внешнее хранилище для всего остального. Android 3.0+ означает, что для большинства устройств и большинства пользователей внутреннее хранилище отлично подходит для файлов, которые не предназначены для обычного использования другими приложениями или доступны пользователю независимо от вашего приложения. Однако некоторые опытные пользователи обнаруживают, что даже on-board flash недостаточна для того, что они хотят хранить, поэтому они переходят на съемные хранилища… которые представляют собой банку с червями (прим. имеются в виду ἕλμινς) — источник многих непредсказуемых и сложных проблем.

F.A.Q. по Internal Storage

Должен ли я делать файлы во внутреннем хранилище World-Readable или World-Writeable?

О, $БОГИ, нет. Используйте FileProvider и обслуживайте этот контент с помощью реализации ContentProvider . После этого вы, по крайней мере, имеете возможность использовать систему разрешений Android для управления доступом к этим файлам, в отличие от вашего варианта, когда любое приложение в системе может испортить эти файлы.

Ну, а как насчет android:sharedUserId ?

android: sharedUserId — это атрибут, который вы можете поместить в манифест, который указывает логический идентификатор пользователя, который будет использоваться для вашего приложения. Любое другое приложение, которое установлено, которое подписывается одним и тем же ключом подписи и запрашивает тот же android:sharedUserId будет использовать одного и того же пользователя Linux с точки зрения безопасности. Эффект заключается в том, что эти два приложения смогут безнаказанно работать с файлами друг друга, так как эти файлы принадлежат одному и тому же пользователю Linux.

Этот атрибут реально предназначен для предварительно установленных приложений, таких как software suite предварительно загруженный производителем устройства, мобильным оператором или разработчиком модифицированной ROM прошивки. В частности, как только вы единожды установите свое приложение, вы не сможете затем безболезненно изменить свое значение android:sharedUserId не заблокировав при этом доступ пользователю к любым существующим файлам… поскольку Android не изменяет права владельца на существующие файлы при изменении учетной записи пользователя Linux, под которой запускается приложение.

Существуют различные риски при одновременном доступе нескольких процессов к файлам. Некоторые подсистемы, такие как SQLite, имеют встроенную логику для решения этой проблемы. Но если вы сами организуете свой собственный доступ к файлу (например, через File и Java I/O), вам нужно что-то делать с одновременным доступом, а это сложно.

Вам также нужно обрабатывать ситуацию, когда одно приложение деинсталлируется, удаляя файлы, которые использовало другое приложение. В модели hub-and-spoke, например, с приложением и набором плагинов, возможно, это не так рискованно. В других моделях, где приложения более равноправны, вы не можете позволить себе потерять данные своего приложения только потому, что пользователь решил удалить какое-то отдельное приложение.

Наконец, вы не знаете, что может принести будущее. Прямо сейчас вы можете рассматривать свой набор приложений в виде набора с тесной связью. Кто-то, кто приобретает эти приложения или приобретает вашу фирму, может пожелать пойти другим путем. Использование возможностей совместного доступа к данным, которые более слабо связаны, например ContentProvider , дает вам большую гибкость. В идеальном мире ваше приложение должно относиться к другим приложениям как к достаточно надежному, но не всегда доступному ресурсу, так же, как к вашему собственному веб-сервису.

Как запретить пользователям rooted устройств доступ к моим файлам во внутреннем хранилище?

Просто не помещайте файлы во внутреннее хранилище. Пользователи rooted устройств могут получить доступ к тому, что им нужно на устройстве, поэтому единственный способ предотвратить их доступ к вашим данным — не иметь их на устройстве.

Некоторые разработчики попытаются зашифровать свои файлы с помощью жестко запрограммированного пароля, чтобы пользователи rooted устройств не могли использовать эти файлы. Это создаст эффект «лежачего полицейского» на короткое время. Все, что требуется, — это один заинтересованный в реверс-инжиниринге вашего приложения человек, определивший, как расшифровать эти файлы, а затем написавший сообщение в блоге или форуме о том, как это сделать.

В целом, относительно мало людей с rooted устройствами — я оцениваю их на уровне менее 1%. ИМХО, вы преуспеете больше, сосредоточив свою инженерную работу на написании лучшего приложения, вместо того, чтобы тратить время на защиту от рутованных устройств.

  • android
  • разработка под android

Источник: habr.com

Где находятся сохранения игр на Android и как их перенести на другой телефон

Играя на телефоне, мы проходим сюжетную линию или повышаем виртуальный уровень. Согласитесь, совсем не хочется потерять все эти достижения после выполнения сброса настроек или переезда на новое устройство. Чтобы не начинать прохождение с первой миссии, необходимо перенести сохранение игры. Но прежде всего важно понять, как оно работает и где находится в телефоне. Ответы на эти и другие вопросы ждут вас в сегодняшнем материале.

Читайте также:
Как пользоваться программой семь дорог

Где находятся сохранения игр на Android и как их перенести на другой телефон. Не хотите начинать игру сначала на новом смартфоне? Тогда перенесите сохранения! Фото.

Не хотите начинать игру сначала на новом смартфоне? Тогда перенесите сохранения!

Как работает сохранение игр на Андроид

Сохранение игр на Андроид бывает локальным и облачным. В первом случае данные о вашем виртуальном прогрессе располагаются в памяти устройства, а во втором — на облаке, то есть на серверах конкретной игры или сервиса, объединяющего множество проектов. Локальное сохранение игры на телефоне — штука редкая, так как подавляющее большинство шутеров, гонок и аркад являются на 100% сетевыми. Практически весь процесс завязан на онлайн-баталиях, а потому логично сохранять данные в интернете.

⚡ Подпишись на Androidinsider в Дзене, где мы публикуем эксклюзивные материалы

Чаще всего облачное сохранение игры осуществляется через сервис Play Игры, объединяющий тысячи проектов в Google Play. При первом запуске гонка или стрелялка просит вас привязать прогресс к своей учетной записи Google, а затем каждый последующий вход будет сопровождаться значком сервиса, который свидетельствует об успешной синхронизации.

Как работает сохранение игр на Андроид. Данные игр, подключенных к Google Play, сохраняются в облаке. Фото.

Данные игр, подключенных к Google Play, сохраняются в облаке

Вместе с тем есть игры, использующие облачное сохранение на серверах разработчиках. В таком случае игроку предлагают создать дополнительный аккаунт в рамках приложения. Существует и альтернативный вариант — привязка данных с прогрессом к одной из социальных сетей.

Где находятся сохранения игр

Даже при условии, что облачное сохранение осуществляется за счет Play Игр, найти файл с данными практически невозможно. Иногда его удается встретить на Google Drive, но это большая редкость, а потому такой вариант поиска файла сохранения игры мы рассматривать не будем. Тем более, что в нем нет особого смысла, поскольку перенести прогресс получится и без него.

Иначе обстоят дела с офлайн-играми, использующими локальное сохранение. Прогресс не синхронизируется с облачным сервисом и находится во внутренней памяти устройства. Поэтому вам придется самостоятельно искать папку сохранений игры. Как правило, она располагается по пути Android/data, но для надежности рекомендую обратиться к приложению App Inspector:

  1. Запустите App Inspector.
  2. Введите название игры.
  3. Откройте ее страницу.
  4. Изучите сведения, представленные в пунктах «Package name» (имя папки с игрой) и «Data directory» (расположение каталога).
  5. Откройте указанную папку через файловый менеджер. Если доступ заблокирован, воспользуйтесь сторонним проводником наподобие Total Commander.

Где находятся сохранения игр. Доступ к папке через стандартный проводник может быть заблокирован. Фото.

Доступ к папке через стандартный проводник может быть заблокирован

К сожалению, внутри вы вряд ли найдете конкретный файл сохранения игры, а потому в процессе переноса прогресса придется копировать всю папку. Впрочем, это не сильно осложнит выполнение задачи.

❗ Поделись своим мнением или задай вопрос в нашем телеграм-чате

Как перенести игру с телефона на телефон

Теперь поговорим о том, как перенести сохранения игры с Андроида, рассмотрев два варианта переноса. Если данные находились в облаке, то для копирования прогресса вам понадобится просто авторизоваться в том же аккаунте Гугл и выбрать его основным в Google Play, либо войти в учетную запись конкретного проекта. Сделать это можно как при запуске игры, так и в ее настройках.

Как перенести игру с телефона на телефон. Аккаунт можно изменить через настройки игры. Фото.

Аккаунт можно изменить через настройки игры

В случае с локальными данными действовать нужно по-другому, хотя авторизация в Google Play тоже не будет лишней, так как после этого на новом устройстве сразу отобразятся игры, перенесенные на Андроид. После установки приложения откройте путь, где хранится папка игры, и отправьте ее на второй телефон любым удобным способом:

Как перенести игру с телефона на телефон. На выбор будет предложено много способов отправки каталога с сохранениями. Фото.

На выбор будет предложено много способов отправки каталога с сохранениями

Если вам не удалось найти ни один подходящий вариант, прочитайте наш текст с рассказом о том, как передать файл с телефона на телефон. В конце не забудьте разместить папку с игрой по правильному пути. После запуска все сохранения должны автоматически загрузиться.

⚡ Подпишись на Androidinsider в Пульс Mail.ru, чтобы получать новости из мира Андроид первым

Как удалить сохранения игры

Несмотря на то, что главная тема нашего материала — это перенос данных, не лишним будет рассказать о способах, как удалить сохранения игры. Справиться с задачей можно разными способами. В случае с локальными данными действуйте следующим образом:

  1. Откройте настройки устройства.
  2. Перейдите в раздел «Приложения», а затем — «Все приложения».
  3. Откройте страницу игры.
  4. Нажмите кнопку «Очистить» и подтвердите удаление всех данных.

Как удалить сохранения игры. Так вы удалите только локальные данные, сохраненные в памяти устройства. Фото.

Так вы удалите только локальные данные, сохраненные в памяти устройства

Если вы из тех, кто ищет ответ на вопрос, как удалить сохранение в Play Играх, действуйте иначе:

  1. Запустите приложение Play Игры.
  2. Откройте вкладку «Профиль».
  3. Нажмите на «три точки» и перейдите в «Настройки».
  4. Откройте раздел «Удалить аккаунт Play Игр и данные».
  5. Нажмите кнопку «Удалить» на против интересующей игры и подтвердите свое действие.

Как удалить сохранения игры. Так удаляются сохранения из Play Игр. Фото.

Так удаляются сохранения из Play Игр

Загляни в телеграм-канал Сундук Али-Бабы, где мы собрали лучшие товары с Алиэкспресс

Напомню, что прогресс может сохраняться не только через сервисы Google, но и на серверах самой игры. Тогда для удаления необходимо выполнить другие шаги:

  1. Запустить игру.
  2. Открыть ее настройки.
  3. Перейти в раздел «Синхронизация».
  4. Нажать кнопку «Удалить аккаунт».

Как удалить сохранения игры. иногда приходится удалять сохранения через аккаунт в самой игре. Фото.

иногда приходится удалять сохранения через аккаунт в самой игре

После удаления учетной записи пропадет и весь прогресс. Если ваша цель — начать игру заново на телефоне, прочитайте отдельный текст, посвященный этой теме. В нем вы найдете несколько менее радикальных вариантов очистки прогресса.

Оставить комментарий в Telegram. Поделитесь мнением в чате читателей Androidinsider.ru

Теги

  • Google Play
  • Игры для Android
  • Новичкам в Android

Наши соцсети

Новости, статьи и анонсы публикаций

Свободное общение и обсуждение материалов

Лонгриды для вас

Читайте также:
Как проектировать отопление программа

Несмотря на то, что почти все приложения в Google Play условно бесплатные, в магазине есть отдельная категория игр и программ, которые можно скачать за деньги. Такого рода софт лишен рекламы и встроенных транзакций, а стоит порой несколько сотен рублей. Если вы испытываете потребность в приложении и уважаете труды разработчиков, то, безусловно, купите интересующую программу. Вот только с 2022 года сделать это в России не получится даже при всем желании, так как покупки в Google Play для нас заблокированы.

Наверное, никому из наших читателей не нужно объяснять, где кнопка питания на телефоне, ведь мы пользуемся ей по несколько десятков раз в день. Однократное нажатие блокирует экран, а удержание в течение пары секунд вызывает меню, позволяющее выключить устройство. Но это далеко не все ее функции. Сегодня разберемся, какие еще возможности предлагает кнопка включения телефона и как их настроить.

Ни один смартфон не в состоянии решать даже базовые задачи без специальных приложений. Именно программное обеспечение позволяет нам, в частности, задействовать камеру устройства, выполнять банковские переводы, читать книги, смотреть фильмы и общаться. Поэтому каждый без исключения владелец смартфона должен знать, как установить приложение на Андроид. Сегодня мы разберем все способы, которые вы без труда сможете реализовать.

Источник: androidinsider.ru

Android с нуля: как хранить данные приложения локально

Ashraff Hathibelagal

Ashraff Hathibelagal Last updated Jul 20, 2016

Read Time: 7 min
This post is part of a series called Android From Scratch.

Когда доходит до сохранения данных приложений локально, разработчики Android определённо избалованы выбором. Помимо прямого доступа к внутренним и внешним областям хранения Android-устройства, платформа Android предлагает базы данных SQLite для хранения реляционных данных и специальные файлы для хранения пар ключ-значение. Более того, приложения для Android также могут использовать сторонние базы данных, которые предлагают поддержку NoSQL.

В этом уроке я покажу вам, как использовать все эти параметры хранения в приложениях для Android. Я также помогу вам понять, как выбрать наиболее подходящий вариант хранения данных.

Вам проще учиться по видео? Почему бы не посмотреть наш курс:

Getting Started With Android
Paul Trebilcox-Ruiz

1. Хранение пар ключ-значение

Если вы ищете быстрый способ хранения нескольких строк или номеров, вам следует рассмотреть возможность использования файла настроек (preferences). Активити и службы Android могут использовать метод getDefaultSharedPreferences() класса PreferenceManager , чтобы ссылаться на объект SharedPreferences , который может быть использован и для чтения, и для записи в файл настроек по умолчанию.

SharedPreferences myPreferences
= PreferenceManager.getDefaultSharedPreferences(MyActivity.this);

Чтобы начать запись в файл настроек, вы должны вызвать метод edit() объекта SharedPreferences , который возвращает объект SharedPreferences.Editor .

SharedPreferences.Editor myEditor = myPreferences.edit();

Объект SharedPreferences.Editor имеет несколько интуитивных методов, которые можно использовать для хранения новых пар ключ-значение в файле настроек. Например, вы можете использовать метод putString() , чтобы поместить пару ключ-значение со значением типа String . Аналогично, вы можете использовать метод putFloat() , чтобы поместить пару ключ-значение, чьё значение типа float . Следующий пример кода создаёт три пары ключ-значение:

myEditor.putString(«NAME», «Alice»);
myEditor.putInt(«AGE», 25);
myEditor.putBoolean(«SINGLE?», true);

После того, как вы добавили все пары, вы должны вызвать метод commit() объекта SharedPreferences.Editor , чтобы сохранить их.

myEditor.commit();

Чтение из объекта SharedPreferences гораздо проще. Всё, что вам нужно сделать, так это вызвать соответствующий метод get*() . Например, чтобы получить пару ключ-значение, чьё значение является String , вы должны вызывать метод getString() . Вот фрагмент кода, который извлекает все значения, которые мы добавили ранее:

String name = myPreferences.getString(«NAME», «unknown»);
int age = myPreferences.getInt(«AGE», 0);
boolean isSingle = myPreferences.getBoolean(«SINGLE?», false);

Как вы видите из кода выше, второй параметр всех методов get*() ожидает значение по-умолчанию, которое является значением, которое должно быть возвращено, если ключ не существует и файле настроек.

Обратите внимание, что файлы настроек ограничены только строками и примитивными типами данных. Если вы хотите сохранить более сложные типы данных или двоичные данные, вы должны выбрать другой вариант хранения.

2. Использование базы данных SQLite

Каждое приложение для Android может создавать и использовать базы данных SQLite для хранения больших объемов структурированных данных. Как вы уже знаете, SQLite не только лёгкая, но и очень быстрая. Если у вас есть опыт работы с системами управления реляционными базами данных и вы знакомы как с SQL, что является сокращением для Structured Query Language, и JDBC, что является сокращением для Java Database Connectivity, это может быть предпочтительным вариантом хранения.

Чтобы создать новую базу данных SQLite или открыть уже существующую, вы можете использовать метод openOrCreateDatabase() внутри своей активити или службы. В качестве аргументов вы должны передать имя своей базы данных и режим, в котором вы хотите её открыть. Наиболее часто используемый режим MODE_PRIVATE , который гарантирует, что база данных доступна только для вашего приложения. Например, вот как вы можете открыть или создать базу данных с именем my.db:

SQLiteDatabase myDB =
openOrCreateDatabase(«my.db», MODE_PRIVATE, null);

После создания базы данных вы можете использовать метод execSQL() для запуска SQL-инструкций. В следующем коде показано, как использовать оператор SQL CREATE TABLE для создания таблицы названной user, которая имеет три столбца:

myDB.execSQL(
«CREATE TABLE IF NOT EXISTS user (name VARCHAR(200), age INT, is_single INT)»

Хотя можно вставить новые строки в таблицу с помощью метода execSQL() , лучше использовать метод insert() . Метод insert() ожидает объект ContentValues , содержащий значения для каждого столбца таблицы. Объект ContentValues очень похож на объект Map и содержит пары ключ-значение.

Вот два объекта ContentValues , которые вы можете использовать с таблицей user :

ContentValues row1 = new ContentValues();
row1.put(«name», «Alice»);
row1.put(«age», 25);

Источник: code.tutsplus.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru