Я пытаюсь установить системное приложение из своего java-кода, и пока у меня ничего не получилось.
Вот что я сделал до сих пор:
- Мое устройство внедрено.
- Мое приложение-установщик установлено как системное приложение. (скопировал его вручную в/system/app)
- Я подписал apk установщика ключом платформы, и у меня есть
android: sharedUserId = "android.uid.system"
в манифесте. -
Я пытался (и пытался, а потом еще немного) для
Runtime.getRuntime.exec ("su") код>. Я собираюсь смонтировать системный раздел как
rw
, сделатьcat
для apk, а затем сделать системный разделro
. Ниже приведен список команд:mount -o remount, rw -t yaffs2/dev/block/mtdblock3/system
cat/sdcard/application.apk>/ system/app/application.apk
mount -o remount, ro -t yaffs2/dev/block/mtdblock3/system
application.apk - это приложение, устанавливаемое из установщика. Это приложение также подписано с помощью ключа платформы и имеет настроенный sharedUserId. - Я запросил разрешение
INSTALL_PACKAGES
в manifest.
Я пробовал несколько вариантов формата exec («»), включая использование 'su -c'
с каждой командой . Я получил исключение Broken Pipe и Security. Иногда я не получаю исключения, но файл не копируется.
Пожалуйста, дайте мне знать, что мне здесь не хватает. У кого-нибудь это работает?
Спасибо!
Я продолжал копать, и вот результаты:
- Android имеет эту проверку в su.c: [«корень источника android»/system/extras/su/su.c]
/* Пока у нас не будет чего-то лучше, su. */myuid = getuid (); if (myuid! = AID_ROOT && myuid! = AID_SHELL) {fprintf (stderr, " su: uid% d не разрешено su n ", myuid); return 1;}
ChainsDD (SuperUser) и мод cyanogen обходят это, реализуя собственный su.c: https://github.com/CyanogenMod/android_system_su /blob/master/su.c
-
Что особенного в
/system/app
? Похоже, что это факт, что раздел доступен только для чтения на некорневых устройствах, что предотвращает модификацию/удаление приложений, размещенных там. https://android.stackexchange.com/questions/17871/what-are-the-differences-between-a-system-app-and-user-app - Приложение, подписанное с помощью ключа платформы и
sharedUserId = system
, «достаточно хорошо» для моих целей, мне не нужно специально копировать его в/system/app.
Я пока принимаю это как ответ.
- Разработка системных приложений с помощью эмулятора
- Развертывание системных приложений на эмуляторе AOSP
- Настройка ОС для устройства XR
- Устройства XR нуждаются в настройке ОС для поддержки потребностей предприятия. Делюсь своим опытом создания собственного Android…
- medium.com
- Шаг 1. Настройка эмулятора
- Шаг 2. Манифест приложения
- Шаг 3 — Запись в системный раздел эмулятора
- Шаг 4 - Подтверждение статуса системного приложения
Разработка системных приложений с помощью эмулятора
Развертывание системных приложений на эмуляторе AOSP

Надеюсь, вы сможете построить пользовательский эмулятор AOSP, как описано в следующей статье:
Настройка ОС для устройства XR
Устройства XR нуждаются в настройке ОС для поддержки потребностей предприятия. Делюсь своим опытом создания собственного Android…
medium.com
Пришло время развернуть приложения как системные приложения в этом настроенном или любом существующем эмуляторе.
Цикл Разработка → Тестирование → Отладка для системного приложения Android намного длиннее, чем обычный цикл разработки приложения. В этой статье описывается настройка эмулятора и несколько удобных скриптов для ускорения цикла разработки.
Шаг 1. Настройка эмулятора
Если вы используете Android Studio, например Для меня, AVD-менеджер студии Android поставляется с множеством предварительно настроенных параметров AVD для создания виртуального устройства. Но большинство из них предназначены для общей разработки приложений. нам действительно нужно уделять внимание при создании виртуального устройства для разработки системных приложений. Вы можете выбрать любую конфигурацию устройства, которая соответствует вашим требованиям. Но при выборе образа системы для виртуального устройства нам нужно выбрать образ, который НЕ включает «API Google» . Это связано с тем, что, если вы используете изображения с «API Google», мы не сможем подписывать наши системные приложения тем же ключом, что и Google API, поскольку он нам недоступен. В то время как простые изображения AOSP без API Google, мы можем получить ключи платформы из репозитория AOSP и использовать их для подписи наших системных приложений. Изображение, выделенное зеленым, является правильным для AOSP Oreo 8.1.

В случае, если у вас есть эмулятор с «Google API» и вы пытаетесь подписать системное приложение ключами платформы AOSP, будьте уверены, что он НЕ работает.
Шаг 2. Манифест приложения
Если вы собираетесь запускать свое приложение как системный процесс, тогда важно включить атрибут android: sharedUserId в файл AndroidManifest.xml
android: sharedUserId =" android.uid.system "
package =" ">
После добавления этого атрибута обратите внимание, что это приложение можно установить только как системное приложение. Если вы попытаетесь установить его как обычное приложение, произойдет сбой.
Шаг 3 — Запись в системный раздел эмулятора
Чтобы сделать приложение системным, его необходимо установить в папку «/system/app/». Системный раздел эмулятора доступен только для чтения, и вы, возможно, не сможете выполнить adb push напрямую. Чтобы сделать системный раздел доступным для записи, нам нужно перезапустить эмулятор с флагом «-writable-system»
emulator -avdПосле перезапуска эмулятора в режиме системы с возможностью записи используйте следующий фрагмент, чтобы подписать приложение ключами AOSP и развернуть его в system
adb root
adb remount
знак apksigner --key platform.pk8 --cert platform.x509.pem
adb shell mkdir/system/app/
adb push /system/app//
adb rebootПриведенный выше фрагмент установит ваше приложение как системное приложение, и после перезагрузки эмулятора вы увидите, что ваше приложение установлено как системное.
Чтобы удалить приложение, нам просто нужно удалить папку Applications из «/system/app/». Пример фрагмента показан ниже
adb root
adb remount
adb shell rm -rf/system/app/
adb rebootШаг 4 - Подтверждение статуса системного приложения
Как мы можем проверить, действительно ли наше приложение работает как системное приложение?
Есть несколько способов, один из которых заключается в том, что если вы откроете «Информация о приложении» приложения, не будет возможности «Удалить» его, поскольку это системное приложение. Но надежный способ - добавить журнал отладки для печати uid процесса после запуска приложения. Добавьте этот фрагмент кода в код действия
ApplicationInfo ai = getApplicationInfo ();
Log. e (TAG, "Application UID:" + ai.uid + ", SYSTEM_UID:" + Process. SYSTEM_UID );Если ваше приложение работает как системный процесс, оно будет печатать
Application UID: 1000, SYSTEM_UID: 1000, что означает, что uid вашего процесса совпадает с идентификатором Process.SYSTEM_UID. Если он совпадает, поздравляем, ваше приложение теперь является системным.