установка / удаление APKs программным способом (PackageManager vs Intents)
мое приложение устанавливает другие приложения, и ему нужно отслеживать, какие приложения он установил. Конечно, это может быть достигнуто путем простого сохранения списка установленных приложений. Но в этом нет необходимости! Ответственность за поддержание отношения installedBy(a, b) должна лежать на менеджере пакетов. На самом деле, согласно API это:
абстрактный строку getInstallerPackageName(String packageName) — получить имя пакета приложения, установки пакета. Это определяет, с какого рынка пришел пакет.
нынешний подход
установить APK с помощью Intent
Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(apkUri, «application/vnd.android.package-archive»); startActivity(intent);
удалить APK с помощью намерения:
Intent intent = new Intent(Intent.ACTION_DELETE, Uri.fromParts(«package», getPackageManager().getPackageArchiveInfo(apkUri.getPath(), 0).packageName,null)); startActivity(intent);
это, очевидно, не так, например, Android Market устанавливает / удаляет пакеты. Они используют более богатую версию PackageManager. Это можно увидеть по загрузка исходного кода Android из репозитория Android Git. Ниже приведены два скрытых метода, которые соответствуют подходу Intent.
com.google.android.packageinstaller | com google android package installer
К сожалению, они недоступны для внешних разработчиков. Но, может быть, они будут в будущем?
лучший подход
установка APK с помощью PackageManager
удаление APK с помощью Диспетчер пакетов
различия
- при использовании intents локальный менеджер пакетов не осведомлен о том, из какого приложения возникла установка. В частности, getInstallerPackageName(. ) возвращать null.
- скрытый метод installPackage(. ) принимает имя пакета установщика в качестве параметра и, скорее всего, способен установить это значение.
вопрос
можно ли указать имя установщика пакета с помощью intents? (возможно, имя пакета установщика можно добавить в качестве дополнительного к намерению установки?)
Совет: Если вы хотите загрузить исходный код Android, вы можете выполнить шаги, описанные здесь: загрузка исходного дерева. Чтобы извлечь *.java-файлы и поместите их в папки в соответствии с иерархией пакетов вы можете проверить этот аккуратный скрипт: просмотр исходного кода Android в Eclipse.
автор: Håvard Geithus
10 ответов
в настоящее время это недоступно для сторонних приложений. Обратите внимание, что даже использование отражения или других трюков для доступа к installPackage() не поможет, потому что только системные приложения могут использовать его. (Это связано с тем, что это низкоуровневый механизм установки, после того, как разрешения были одобрены пользователем, поэтому для обычных приложений небезопасно иметь доступ.)
также аргументы функции installPackage() часто изменялись между выпусками платформы, поэтому все, что вы делаете, пытаясь получить доступ к нему, потерпит неудачу в различных других версиях платформы.
What is a Google Android PackageInstaller?
также стоит отметить, что этот installerPackage был добавлен совсем недавно на платформу (2.2?) и первоначально не использовался для отслеживания того, кто установил приложение-он используется платформой для определения того, кого запускать при сообщении об ошибках с приложением, для реализации обратной связи Android. (Это также был один из аргументов метода API измененный.) По крайней мере, долгое время после его введения рынок все еще не использовал его для отслеживания приложений, которые он установил (и он может все еще не использовать его), но вместо этого просто использовал это, чтобы установить приложение обратной связи Android (которое было отделено от рынка) в качестве «владельца», чтобы заботиться о обратной связи.
автор: hackbod
Intent intent = new Intent(Intent.ACTION_DELETE); intent.setData(Uri.parse(«package:com.example.mypackage»)); startActivity(intent);
для удалить. Кажется проще.
автор: JohnyTex
API level 14 представил два новых действия:ACTION_INSTALL_PACKAGE и ACTION_UNINSTALL_PACKAGE. Эти действия позволяют вам пройти EXTRA_RETURN_RESULT boolean дополнительно, чтобы получить (un)уведомление о результате установки.
пример кода для вызова диалога удаления:
String app_pkg_name = «com.example.app»; int UNINSTALL_REQUEST_CODE = 1; Intent intent = new Intent(Intent.ACTION_UNINSTALL_PACKAGE); intent.setData(Uri.parse(«package:» + app_pkg_name)); intent.putExtra(Intent.EXTRA_RETURN_RESULT, true); startActivityForResult(intent, UNINSTALL_REQUEST_CODE);
и получить уведомление в вашем действие#onActivityResult способ:
автор: Pir Fahim Shah
Если у вас есть разрешение владельца устройства (или владельца профиля, я не пробовал), вы можете молча устанавливать/удалять пакеты с помощью API владельца устройства.
public boolean uninstallPackage(Context context, String packageName) < ComponentName name = new ComponentName(MyAppName, MyDeviceAdminReceiver.class.getCanonicalName()); PackageManager packageManger = context.getPackageManager(); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) < PackageInstaller packageInstaller = packageManger.getPackageInstaller(); PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); params.setAppPackageName(packageName); int sessionId = 0; try < sessionId = packageInstaller.createSession(params); >catch (IOException e) < e.printStackTrace(); return false; >packageInstaller.uninstall(packageName, PendingIntent.getBroadcast(context, sessionId, new Intent(«android.intent.action.MAIN»), 0).getIntentSender()); return true; > System.err.println(«old sdk»); return false; >
и установить пакет:
public boolean installPackage(Context context, String packageName, String packagePath) < ComponentName name = new ComponentName(MyAppName, MyDeviceAdminReceiver.class.getCanonicalName()); PackageManager packageManger = context.getPackageManager(); if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) < PackageInstaller packageInstaller = packageManger.getPackageInstaller(); PackageInstaller.SessionParams params = new PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL); params.setAppPackageName(packageName); try < int sessionId = packageInstaller.createSession(params); PackageInstaller.Session session = packageInstaller.openSession(sessionId); OutputStream out = session.openWrite(packageName + «.apk», 0, -1); readTo(packagePath, out); //read the apk content and write it to out session.fsync(out); out.close(); System.out.println(«installing. «); session.commit(PendingIntent.getBroadcast(context, sessionId, new Intent(«android.intent.action.MAIN»), 0).getIntentSender()); System.out.println(«install request sent»); return true; >catch (IOException e) < e.printStackTrace(); return false; >> System.err.println(«old sdk»); return false; >
автор: Ohad Cohen
единственный способ получить доступ к этим методам через отражение. Вы можете получить ручку на
автор: HandlerExploit
согласно исходному коду Froyo, намерение.EXTRA_INSTALLER_PACKAGE_NAME дополнительный ключ запрашивается для имени пакета установщика в PackageInstallerActivity.
автор: njzk2
на корневом устройстве вы можете использовать:
String pkg = context.getPackageName(); String shellCmd = «rm -r /data/app/» + pkg + «*.apkn» + «rm -r /data/data/» + pkg + «n» // TODO remove data on the sd card + «syncn» + «rebootn»; Util.sudo(shellCmd);
автор: 18446744073709551615
Если вы передаете имя пакета в качестве параметра любой из ваших пользовательских функций, используйте следующий код:
Intent intent=new Intent(Intent.ACTION_DELETE); intent.setData(Uri.parse(«package:»+packageName)); startActivity(intent);
автор: Rashwin S M
Если вы используете Kotlin, API 14+, и просто хотите показать диалог удаления для вашего приложения:
startActivity(Intent(Intent.ACTION_UNINSTALL_PACKAGE).apply < data = Uri.parse(«package:$packageName») >)
Вы можете изменить packageName на любое другое имя пакета, если вы хотите предложить пользователю удалить другое приложение на устройстве
автор: Louis CAD
обязательное условие:
ваш APK должен быть подписан системой, как правильно указано ранее. Один из способов добиться этого-создать образ AOSP самостоятельно и добавить исходный код в сборку.
код:
после установки в качестве системного приложения, вы можете использовать методы диспетчер пакетов для установки и удаления APK с как следующий:
public boolean install(final String apkPath, final Context context) < Log.d(TAG, «Installing apk at » + apkPath); try < final Uri apkUri = Uri.fromFile(new File(apkPath)); final String installerPackageName = «MyInstaller»; context.getPackageManager().installPackage(apkUri, installObserver, PackageManager.INSTALL_REPLACE_EXISTING, installerPackageName); return true; >catch (Exception e) < e.printStackTrace(); return false; >>
public boolean uninstall(final String packageName, final Context context) < Log.d(TAG, «Uninstalling package » + packageName); try < context.getPackageManager().deletePackage(packageName, deleteObserver, PackageManager.DELETE_ALL_USERS); return true; >catch (Exception e) < e.printStackTrace(); return false; >>
чтобы иметь обратный вызов после установки/удаления APK, вы можете использовать это:
Источник: askdev.ru
com.google.android.packageinstaller — gossipfunda
Com.google.android.packageinstaller: The установщик пакетов точно известен как Установщик пакетов Android, который чаще всего обозначается как «APK-файл‘На обычном языке. Это аналог zip файл и используется Android на вашем телефоне для загрузки или установки всех приложений. Сам Android дополнительно сжимает этот zip-файл для облегчения установки.
Для установки любого конкретного приложения установщик пакета сначала должен извлечь приложение. После того, как извлечение будет завершено, приложение будет готово на вашем телефоне или планшете, что угодно. Возможно, на многих смартфонах эта установка может занять немного больше времени, так как после этого также может потребоваться проверка безопасности.
Проще говоря, установщик пакетов не только используется для установки новых приложений на ваш телефон, но также может обновлять приложения. Это слишком ответственно за деинсталляцию приложений с телефона или планшета.
com.google.android.packageinstaller
Ваш смартфон может обновлять ваши приложения ежедневно без вашего ведома, и это происходит с помощью установщика пакетов. Это можно увидеть в истории ваших приложений. Этот установщик пакетов Android является службой Google, и эта служба предоставляет поддержку в двух формах: в виде монолитного APK-файла или в виде разделенного APK-файла для приложений. В общем, не беспокойтесь, если вы видите какое-либо слово APK в истории телефона. С вашим телефоном ничего плохого не произошло.
Теперь этот APK загружает приложение небольшими пакетами, и поэтому он получил это имя установщика пакетов. Это приложение по умолчанию на вашем телефоне, и вы не можете удалить его со своего устройства. Установщик пакетов предоставляет пользователю платформу для управления приложениями.
Установщик пакета запрашивает разрешение у InstallAppProgress на получение инструкций, данных пользователем, которым мы являемся. Далее, это УстановитьAppProgress снова просит своего руководителя, то есть службы диспетчера пакетов, установить пакет / приложение. Этот процесс выполняется установить.
Installd: Процесс «установить», Процессы с«d”В конце — это демон, который подразумевает, что он работает в фоновом режиме и управляет функциями системы.
Теперь пришло время установить демон в картину. Этот установить собирает запрос от диспетчера пакетов через сокет Linux. Они уже должны присутствовать на вашем мобильном телефоне. Эта установка должна выполнить несколько шагов, необходимых для установки APK.
- com.android.browser.home
- com.lge.launcher3: программа запуска Android
Разница между установщиком и менеджером
- Место расположения — менеджер пакетов находится в центральной базе данных установки, тогда как расположение установщика пакетов полностью зависит от него самого. Это может быть файл в операционной системе вашего телефона или файл в самом приложении.
- Перевозки- установщик пакетов поставляется с каждой компьютерной программой, но менеджер пакетов обычно поставляется вместе с операционной системой.
- техническое обслуживание — объем обслуживания установщика пакетов — это то, с чем он был связан, но для диспетчера пакетов это все пакеты в операционной системе.
- Разработка — установщик пакетов разработан многочисленными разработчиками установщиков, тогда как у менеджера пакетов есть только один поставщик.
По сути, менеджер пакетов немного отличается и отвечает за распространение данных и программного обеспечения. Каждый раз, когда мы устанавливаем какой-либо файл APK на наше устройство, этот менеджер пакетов анализирует файл и выдает вам подтверждение. И как только вы нажмете кнопку «ОК», менеджер начнет звонить в службу «installPackage метод.«Этот метод имеет четыре параметра: Ури, Наблюдатель, installFlags, и installPackageName.
Теперь диспетчер пакетов запускает услугу «пакет». Найдите «InstallAppProgress.java» в исходном коде установщика, чтобы узнать, что происходит с этой службой.
Хранение файлов APK
Теперь следующий вопрос в нашей голове должен быть где хранятся эти файлы? Так что есть несколько способов и ответов на этот вопрос. Не все приложения работают одинаково.
Одна категория — это категория предварительной установки, которая есть в нашей камере, календаре, браузере. В этих приложениях APK хранится в / system / app /
Во-вторых, категория — это категория установки пользователя, и в эту категорию попадают следующие несколько вещей: ApiDemo, any.do и т. Д. Эти файлы хранятся в / данные / приложение.
В третьей категории диспетчер пакетов создает каталог для всех типов данных. Эти данные включают общие настройки, данные кеша и собственные библиотеки. Все это хранится в / data / data / имя пакета> /. Иногда вы можете увидеть, что ваш APK-файл заканчивается на *. Odex file. Это немного другое дело и в настоящее время не имеет отношения к этой теме.
Процесс установки
- Пользователь добавит пакет / приложение за его установку на свой телефон в очереди.
- Следующим шагом будет анализ местоположения приложения или пакета.
- Затем нажмите установить или обновить
- После этого вам нужно скопировать файл APK в другое место или в каталог.
- Теперь найдите идентификатор пользователя приложения.
- Спросите о установочный процесс.
- Подготовьте каталог приложения, а затем исправьте разрешения.
- В конце концов, это извлекает код dex в другой каталог кеша.
- Следующий шаг — отразить packages.list / система / данные / пакеты.xml с его последним обновленным статусом.
- Затем передайте его в систему с названием полного пакета.
- intent.ACTION_PACKAGE_ADDED
Хранение данных
Менеджер пакетов хранит данные в трех формах:
1- packages.xml
- Один из них разрешение
- Во-вторых, это пакет / приложение
Эти разрешения хранятся в теге разрешений на вашем устройстве. И для каждого разрешения в основном есть три атрибута. Эти атрибуты — имя, защита и пакет. Начнем с первого атрибута, т. Е. Name, который содержит имя разрешения, которое мы используем в AndroidManifest.xml. Затем идет атрибут защиты, который используется для описания безопасности пакета.
В-третьих, идет атрибут пакета, который показывает разрешения, предоставленные пакету.
Тег пакета содержит около десяти атрибутов, а также несколько вложенных тегов.
читайте также: Команды Fastboot
Десять атрибутов
- Имя — он включает название пакета.
- NativeLibraryPath — это собственная библиотека, путь по умолчанию которой / data / data / package name> / lib /.
- CodePath — его можно определить как место установки файла APK.
- Идентификатор пользователя — это ID / имя пользователя Linux.
- Версия — это код версии файла AndroidManifest.xml.
- ShareUserId — это тот UID Linux, который будет использоваться разными приложениями.
- футов — метка времени в шестнадцатеричном формате.
- Это — метка времени в шестнадцатеричном формате при первой установке.
- ут — метка времени в шестнадцатеричном формате с последним обновлением.
- Флаги — хранит информацию о флагах приложений.
Подтеги
1. Sigs: Хранит информацию о подписи. Кроме того, счетчик контролирует количество тегов сертификатов в файле.
2. Cert: Сертификат состоит из множества ключей сертификации. Кроме того, индекс проверяет индекс сертификации. Это значение увеличивается при установке новых сертификатов вместе с приложениями.
3. Пермь: предоставляет информацию о разрешениях, которые разработчики установили в AndroidManifest.xml файл.
xКак установить apk файл с помощью ADB и списка всех пакетов | Управление пакетами с помощью ADB
2- package.list
Это можно определить как простой текстовый файл, который просто содержит имена пакета, идентификатор пользователя, флаги и т. Д. Нет убедительных доказательств, но единственный опыт, с которым я могу сказать этот пакет. Список быстрее ищет предустановленные пакеты. Единственная причина этого в том, что он хранит только самые важные данные.
3- Пакеты-stoped.xml
Этот метод включает пакеты, которые находятся в остановленном состоянии или состоянии. Эти приложения в остановленном состоянии не получают никакого сигнала. Есть так много приложений для установки пакетов, которые доступны в Интернете. Ниже приводится список лучших установщиков пакетов.
Лучшие установщики пакетов
- Установщик APK Pro — Это одно из лучших приложений в категории установщиков пакетов. Он получил 3,8 балла, что является самым высоким показателем по сравнению со всеми остальными. Он доступен в двух версиях: одна — это бесплатная версия, которая содержит рекламу, а другая — это покупка в приложении, которая предоставит вам услугу без рекламы.
- Установщик APK — Это приложение является отличным вариантом по сравнению с предыдущим, так как его общая оценка почти равна 3,8. Это 2,2 МБ хранилища. Это просто бесплатная версия с рекламой. Никаких других покупок в приложении нет. Его также скачали более 10 миллионов человек.
- Установщик APK / менеджер APK / APK-файл — Это новое приложение из галереи предоставляет больше, чем просто установщик. Его общий рейтинг — 3,7, количество скачиваний — около 100 тысяч. Это приложение размером 3,2 МБ также содержит рекламу без дополнительных покупок в приложении.Это также дает вам возможность резервного копирования APK.
читайте также: окей гугл не работает
Вывод
Итак, в основном, если вы видите com.google.android.packageinstaller в любом месте вашей истории Google вам не о чем беспокоиться. Это обычный процесс, который проходит ваше устройство и загружает файлы APK. Этот установщик пакетов просто выполняет свою работу по установке, удалению и обновлению приложений.
Похожие сообщения:
- Как перенести картинки на sd карту?
- com.motorola.launcher3
- com.samsung.android.app.galaxyfinder: The S Finder
- com.coremobility.app.vnotes: Что это такое | Б / у |…
- Приложение
- Pixel 5: новая версия Google
Источник: ru.teetalent.com
Блог
У меня есть приложение для Android, опубликованное в Google Play.
В прошлом у меня были некоторые проблемы с хакерами и пиратством [люди, которые декомпилируют, изменяют и перекомпилируют приложение, а затем публикуют его где-нибудь]
Чтобы уменьшить проблему, одной из мер, которые я принял, было прекращение работы приложения, если я обнаружу, что оно было установлено не из Google Play, а откуда-то еще. Код очень прост
context.getPackageManager().getInstallerPackageName(context.getPackageName());
если он был установлен из Google Play, он возвращается com.android.vending
если что — то возвращается, я регистрирую исключение и прерываю выполнение, прося пользователя переустановить из Google Play
Это работает очень хорошо, но недавно некоторые пользователи были пойманы с com.google.android.packageinstaller
Я пытался поискать вокруг, но не смог найти хорошего объяснения ТОГО, ЧТО ЭТО ЗА ПАКЕТ, это настоящий продукт Google? есть ли какая-либо официальная документация, подтверждающая это?
Ответ №1:
com.android.vending это название пакета магазина Google Play. Однако в Android приложения, установленные вне Google Play (из файла apk), устанавливаются через другое системное приложение, встроенное в каждый телефон Android. Он называется установщиком пакетов. com.google.android.packageinstaller представляет собой системное приложение установщика пакетов, поэтому вы можете полностью сказать, что пользователи, с com.google.android.packageinstaller которыми столкнулись, — это те, кто установил приложение из файла apk, загруженного из любого другого места.
1. у вас есть источник этой информации?
2. Я тоже не смог найти никакой четкой документации по этому поводу, но эта информация основана на моем собственном опыте и результатах тестов. если вы используете adb и пытаетесь зарегистрировать имя пакета каждого установленного приложения с телефона Android, вы всегда получаете приложение «com.google.android.packageinstaller». Предположим, у вас есть другое приложение на вашем Android, которое может обрабатывать или устанавливать файлы apk. если вы нажмете на apk, Android покажет вам диалоговое окно, хотите ли вы открыть этот apk через установщик пакетов или другое приложение. Если вы выберете Установщик пакетов , Android отобразит приглашение на установку.
Вам также может понравиться
как отключить кнопку изменения размера в графическом приложении tkinter?
11 января, 2022
«Сбой базового поставщика при открытии» при достижении базы данных sql azure с помощью службы данных WCF внутри webrole
24 августа, 2022
Как я могу определить, соответствует ли каждое значение в списке критериям или нет?
8 января, 2022
- О нас
- Онлайн игры
- Конвертеры
- Base64 конвертер онлайн
- Оформление кода JavaScript CSS HTML Онлайн
- URL Encoder (кодировщик) / Decoder (декодировщик) онлайн
- Конвертер регистров
- Рассчитать количество дней между датами
- Генератор ключей и паролей
- Генератор QR кодов
- Преобразование времени
- Преобразование микросекунд в секунды
- Преобразование микросекунд в миллисекунды
- Преобразование миллисекунд в микросекунды
- Преобразование миллисекунд в секунды
- Преобразование миллисекунд в минуты
- Преобразование миллисекунд в часы
- Преобразователь миллисекунд в дату
- Преобразование секунд в миллисекунды
- Преобразование секунд в минуты
- Преобразование секунд в часы
- Преобразование секунд в дни
- Преобразование минут во время
- Преобразование минут в миллисекунды
- Преобразование минут в секунды
- Преобразование минут в часы
- Преобразование часов в миллисекунды
- Преобразование часов в секунды
- Преобразование часов в минуты
- Преобразование часов в дни
- Преобразование дней в часы
- Преобразование из часы в недели
- Конвертация из недели в часы
- Через несколько часов калькулятор
- Преобразование времени AM/PM в 24-часовое
- Преобразование Военного Времени
- Время до десятичного калькулятора
- Безопасность
- Финансы
- Энциклопедия
Источник: programbox.ru
Android PackageInstaller не устанавливает APK
У меня есть приложение для Android, не входящее в Play Маркет. Он обновляется, загружая новый APK и вызывая диалоговое окно установщика с помощью Intent. Функция обновления больше не работает на Android 10.
Мне сейчас нужно использовать PackageInstaller API на Android 10, но я не могу заставить его работать. Мое приложение не является владельцем устройства или профиля, но поскольку мне не нужна автоматическая установка, я думаю, что все будет в порядке.
Моя проблема в том, что как только я фиксирую сеанс, ничего не происходит.
PackageInstaller installer = activity.PackageManager.PackageInstaller; PackageInstaller.SessionParams sessionParams = new PackageInstaller.SessionParams(PackageInstallMode.FullInstall); int sessionId = installer.CreateSession(sessionParams); PackageInstaller.Session session = installer.OpenSession(sessionId); var input = new FileStream(pfad, FileMode.Open, FileAccess.Read); var packageInSession = session.OpenWrite(«package», 0, -1); input.CopyTo(packageInSession); packageInSession.Close(); input.Close(); //That this is necessary could be a Xamarin bug. GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); Intent intent = new Intent(activity, activity.Class); intent.SetAction(«com.example.android.apis.content.SESSION_API_PACKAGE_INSTALLED»); PendingIntent pendingIntent = PendingIntent.GetActivity(activity, 0, intent, 0); IntentSender statusReceiver = pendingIntent.IntentSender; // Commit the session (this will start the installation workflow). session.Commit(statusReceiver);
Я взглянул на DDMS и не нашел ничего значимого. Одна вещь, которая может быть интересна, заключается в том, что когда я Dispose() просматриваю потоки, я получаю IOException: write failed (EBADF) bad file descriptor , что указывает на плохой APK. Но я сомневаюсь, что это так, потому что я могу без проблем установить APK с помощью файлового менеджера. Погуглить ошибку ни к чему не привело.
Как я могу решить эту проблему?
Источник: question-it.com