- Полный список
- Каким должно быть имя пакета приложения Android?
- 6 ответов
- Получение списка приложений в Android
- Класс PackageManager
- Где хранятся файлы APK на Android?
- Как PackageManager хранит информацию о приложении?
- packages.xml
- packages.list
- package-stopped.xml
- Получаем список приложений
- Получение списка приложений в Android : 4 комментария
Полный список
— разбираемся, что такое Package для приложения
Package можно перевести как пакет. Этот вариант перевода я и буду использовать в уроке.
Пакет приложения мы прописываем в визарде создания приложения.
Потом его можно найти в манифесте.
Он же по дефолту становится пакетом для Java-классов
Как-то не особо значимая цель .
Может быть он используется как-то еще? Оказывается да. Более того, пакет — это крайне важная вещь при создании приложения. Пакет является идентификатором приложения в системе. Т.е. когда вы устанавливаете приложение, система смотрит его пакет и ищет уже установленное приложение с таким пакетом. Если не нашлось, то все ок и приложение устанавливается.
А вот если нашлось, то тут в дело вступает механизм подписи приложения ключом, который мы рассмотрели на прошлом уроке. Система проверяет, если установленное и устанавливаемое приложения подписаны одним и тем же ключом, то, вероятнее всего, это означает, что оба приложения создал один автор. И устанавливаемое приложение является обновлением установленного, т.к. их пакеты и ключи одинаковы. Система устанавливает новое приложение, заменяя старое — т.е. обновляет старое.
Если же система определила, что приложения были подписаны разными ключами, то это значит, что приложения были созданы разными авторами, пакеты совпали случайно, и новое вовсе не является обновлением старого. В этом случае при установке нового, старое было бы заменено, а значит потеряно (а не обновлено), т.к. приложения абсолютно разные. И система не дает поставить новое приложение, пока не будет вручную удалено старое.
Проведем пару тестов. Я создам два приложения Package1 и Package2 с одинаковым пакетом.
Установлю первое. Оно появилось в списке.
Теперь не удаляя первое, установлю второе.
Первое исчезло. Осталось только второе.
Система решила, что второе является обновлением первого (т.к. пакеты и ключи совпадают), поэтому первое благополучно снесла и заменила вторым. Собственно, это и происходит при обычном обновлении.
Теперь подпишу Package2 другим ключом, чем оно было подписано изначально и попробую обновить через adb.
Параметр r здесь означает, что приложение надо переустановить, если оно уже существует.
Видим ошибку Failure [INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]. Система сверила ключи у установленного и устанавливаемого приложений, увидела, что они разные и решила, что это будет не обновление, а просто приложение от другого разработчика ломится с тем же пакетом. И вполне разумно решила не удалять имеющееся приложение, а предупредить пользователя, что не совпадают ключи.
Если закинуть это приложение на эмулятор и поставить через файловый менеджер, получим примерно то же сообщение.
Из вышесказанного можно сделать следующий вывод: ваш ключ, которым вы подписываете приложение ни в коем случае нельзя терять или давать кому-либо.
Если вы ключ потеряете, то ваше приложение навсегда потеряет возможность быть обновленным. Даже если вы создадите новый ключ с тем же алиасом, паролем и данными владельца, это все равно будет другой ключ. И подписанная им следующая версия приложения будет рассматриваться системой не как обновление, а как попытка приложения от другого разработчика заменить ваше приложение и не даст его установить, пока не удалите установленное.
Если же вы ключ кому-то предоставите, то этот человек сможет сделать обновление для вашего приложения без вашего участия. И если этот человек имеет доступ и к вашей учетке разработчика в маркете, то он сможет залить туда свою версию вашего приложения.
Также не забывайте пароли от хранилища и от ключа. Это будет равносильно тому, что вы потеряли ключ. В общем, относитесь к вашим ключам со всей серьезностью.
И в конце урока небольшой ликбез. Пакет имеет еще одно значение. Как вы уже наверно заметили по вкладке Devices в Eclipse, пакет используется в качестве имени процесса, в котором запускается приложение. При этом, под каждое приложение система создает пользователя. Это позволяет разграничить доступ к данным. Каждое приложение запускается и работает со своими данными в отдельном процессе под отдельным пользователем. Соответственно, другие приложения не имеют к этим данным доступа, т.к. запущены под другими пользователями.
На следующем уроке:
— разбираемся с ViewPager
Присоединяйтесь к нам в Telegram:
— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.
— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование
— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня
— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме
Источник
Каким должно быть имя пакета приложения Android?
Я хочу знать, что должно быть имя пакета приложения для android? Значит обычно мы использовали com.appname или com.имя_организации.appName, но когда мы отправляем наше приложение на рынок, иногда он показывает ошибки, связанные с именем пакета, которые — пожалуйста, измените имя пакета. Его не следует запускать с com и т. д..
Я хочу знать, почему это happnes? И как правильно название пакета для Android?
Если кто знает причина или ответ на этот вопрос, пожалуйста, дайте мне знать.
6 ответов
Как указано здесь: имена пакетов записываются в нижнем регистре, чтобы избежать конфликтов с именами классов или интерфейсов.
компании используют свое обратное доменное имя Интернета, чтобы начать свои имена пакетов-например, com.example.mypackage for a package named mypackage created by a programmer at example.com .
коллизии имен, которые происходят в одной компании, должны обрабатываться соглашением внутри этой компании, возможно, путем включения региона или имени проекта после названия компании (например, com.образец.регион.пакета mypackage).
пакеты на самом языке Java начинаются с java. или javax.
в некоторых случаях имя домена интернета может быть недопустимым именем пакета. Это может произойти, если имя домена содержит дефис или другой специальный символ, если имя пакета начинается с цифры или другого символа, который незаконно использовать в качестве начала имени Java, или если имя пакета содержит зарезервированное ключевое слово Java, такое как «int». В этом случае предлагаемое соглашение заключается в добавлении подчеркивания. Например:
Android следует тем же соглашениям об именах, что и Java,
Именования
имена пакетов записываются в нижнем регистре, чтобы избежать конфликтов с именами классов или интерфейсов.
компании используют свое обратное доменное имя Интернета, чтобы начать свои имена пакетов-например, com.образец.mypackage для пакета с именем mypackage, созданного программистом на example.com.
конфликты имен, которые происходят в пределах одного компания должна обрабатываться по соглашению внутри этой компании, возможно, путем включения региона или названия проекта после названия компании (например, com.образец.регион.пакета mypackage).
пакеты на самом языке Java начинаются с java. или javax.
в некоторых случаях имя домена интернета может быть недопустимым именем пакета. Это может произойти, если имя домена содержит дефис или другой специальный символ, если имя пакета начинается с цифры или другого символа, который запрещено использовать в качестве начала имени Java, или если имя пакета содержит зарезервированное ключевое слово Java, такое как «int». В этом случае предлагаемое соглашение должно добавить подчеркивание. Например:
Легализация Имен Пакетов:
Как вы заявили, имена пакетов обычно находятся в форме ‘com.имя_организации.appName’ — все строчные и без пробелов. Похоже, имя пакета, которое вы ввели при загрузке приложения, отличалось от имени, объявленного в AndroidManifest.
В настоящее время имя пакета, начинающееся с «com.пример » не разрешается загружать в app-store. В противном случае все остальные имена пакетов, начинающиеся с «com», разрешены .
имя пакета с 0 может вызвать проблему для sharedPreference.
(OK) con = createPackageContext(«com.example.android.sf1», 0);
(проблема, но без ошибок)
посетить https://developers.google.com/mobile/add и попробуйте заполнить «имя пакета Android». В некоторых случаях он может написать ошибку: «недопустимое имя пакета Android».
и хотя идентификатор приложения выглядит как традиционный пакет Java имя, правила именования для идентификатора приложения немного больше ограничительный:
- он должен иметь по крайней мере два сегмента (одну или несколько точек).
- каждый сегмент должен начинаться с буквы.
- все символы должны быть буквенно-цифровыми или подчеркиванием [a-zA-Z0-9_].
Итак, «0com.образец.app » и » com.1example.приложение» ошибки.
Источник
Получение списка приложений в Android
Android SDK предоставляет много средств для работы с системой. В том числе он позволяет получать список приложений, которые установлены на устройстве. Это может быть полезно, когда нужно получить сведения о сторонних приложениях (размер APK, путь до приложения, имя пакета и т.д.). Например, в наших приложениях получение списка, содержащего сторонние приложения, играет большую роль: в GreenBro с помощью этого списка выводятся сведения о приложениях, а также выполняются различные действия.
В Менеджере системных приложений и APK Extractor же список приложений необходим, чтобы удалять приложения и извлекать APK из приложений соответственно.
В этой статье мы рассмотрим, как можно получать список приложений, установленных на устройстве, а также как происходит установка приложений на устройство.
Класс PackageManager
PackageManager предоставляет API, который фактически управляет установкой, удалением и обновлением приложений. Когда мы устанавливаем файл APK, PackageManager анализирует этот APK и выводит результат.
Получить экземпляр класса PackageManager можно с помощью метода getPackageManager(). PackageManager предоставляет методы для запросов к установленным пакетам и соответствующим разрешениям.
Где хранятся файлы APK на Android?
В зависимости от типа данных, на Androiid файлы могут храниться в следующих местах:
- Предустановленные и системные приложения (Камера, Браузер и т.д.) хранятся в /system/app/
- Установленные пользователем приложения хранятся в /data/app/
- PackageManager создаёт каталог /data/data/ / для хранения базы данных, файлов с предпочтениями, нативных библиотек и кеша.
Как PackageManager хранит информацию о приложении?
Менеджер пакетов хранит информацию о приложении в трёх файлах, расположенных в /data/system.
packages.xml
Этот XML-файл содержит список разрешений и пакеты\приложения. Он хранит две вещи: разрешения и пакет. Например:
Разрешения хранятся в теге
. Каждое разрешение имеет три атрибута: name, package и protection. Атрибут name это имя разрешения, которое мы используем в AndroidManifest.xml. Атрибут package указывает на пакет, которому принадлежит разрешение, в большинстве случаев это «android». Атрибут protection указывает на уровень безопасности.
содержит 10 атрибутов и несколько подтегов.
Атрибут | Описание |
name | Имя пакета |
codePath | Путь установки APK |
nativeLibraryPath | Нативная библиотека, расположенная по умолчанию в /data/data/ /lib |
flag | Хранит флаги ApplicationInfo |
ft | Время в шестнадцатtричном формате |
lt | Время установки в шестнадцатеричном формате |
ut | Время последнего обновления в шестнадцатеричном формате |
version | Код версии из AndroidManifest.xml |
sharedUserId | Идентификатор пользователя Linux, который будет использоваться совместно с другими приложениями. |
userId | Идентификатор пользователя Linux |
Подтеги же здесь следующие:
- представляет собой информацию о сигнатуре, атрибут count — количество тегов .
- это ключ сертификата, атрибут index представляет собой глобальный индекс сертификата.
содержат разрешения, которые разработчик установил в AndroidManifest.xml
packages.list
Это простой текстовый файл, содержащий имя пакета, идентификатор пользователя, флаги и каталог data.
package-stopped.xml
Этот файл содержит список пакетов, которые были остановлены. Остановленные приложения не могут принимать широковещательные сообщения.
Получаем список приложений
Рассмотрим получение списка установленных приложений на примере GreenBro.
При запуске приложения запускается AsyncTask, внутри которого получаем экземпляр PackageManager и затем копируем в список List все данные об установленных приложениях.
Метод getInstalledApplications() принимает в качестве параметра флаг GET_META_DATA, который определяет, что нам нужные метаданные каждого пакета.
Результатом является список объектов ApplicationInfo для каждого установленного приложения. Класс ApplicationInfo предоставляет подробную информацию о пакете, собранную из тега в AndroidManifest.xml, нам оттуда нужны лишь самые важные данные.
Поэтому в цикле проверяем каждый объект из полученного списка и записывать данные в собственный класс AppInfo, чтобы затем использовать в основном потоке.
Здесь с помощью метода getPackageInfo() класса PackageManager мы получаем общую информацию о приложении по заданному имени пакета. После эта информация объединяется с информацией, полученной от getInstalledApplications() и сохраняется в объекте AppInfo со следующими полями:
- title — название приложения
- packageName — имя пакета
- sourceDir — полный путь до APK приложения
- publicSourceDir — путь до общедоступных частей sourceDir
- versionName — имя версии
- isSystem — определяет, является ли приложение системным
- size — размер приложения (в удобной форме)
- longSize — размер приложения в long
- dataDir — полный путь к каталогу data
- nativeLibraryDir — путь до нативных библиотек
- modified — дата последнего изменения
- firstInstallTime — дата установки
- lastUpdateTime — дата последнего обновления
- enabled — определяет, включено ли приложение
Чтобы узнать название приложения, можно также воспользоваться PackageManager, как показано ниже.
Проверка же на то, является ли приложение системным, тоже достаточно проста и показана ниже.
В конце работы AsyncTask возвращает результат обратно в основной поток. Вот и всё, мы загрузили себе список всех установленных на устройстве приложений и можем продолжить с ним работу.
Получение списка приложений в Android : 4 комментария
Подскажите пожалуйста, в конструкции:
final PackageManager pm = context.getPackageManager();
List apps = new ArrayList();
List packages = pm.getInstalledApplications(PackageManager.GET_META_DATA);
Чем является «context»?
Это локальная переменная, Вы можете передавать контекст из активити или фрагмента
» List packages = pm.getInstalledApplications( »
а есть ли функция наподобие getRunnedApplications(), которая выдает список запущенных последних приложений?
как отличить приложение от сервиса? Проверка на системное приложение не помогает
Источник