Android: программное копирование apk в / system / app

Я пытаюсь установить системное приложение из своего java-кода, и пока у меня ничего не получилось.

Вот что я сделал до сих пор:

  1. Мое устройство внедрено.
  2. Мое приложение-установщик установлено как системное приложение. (скопировал его вручную в/system/app)
  3. Я подписал apk установщика ключом платформы, и у меня есть android: sharedUserId = "android.uid.system" в манифесте.
  4. Я пытался (и пытался, а потом еще немного) для 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.
  5. Я запросил разрешение 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

Раджу К
16 мая 2020 г. · 3 мин чтения

Надеюсь, вы сможете построить пользовательский эмулятор 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. Если он совпадает, поздравляем, ваше приложение теперь является системным.

Оцените статью
clickpad.ru
Добавить комментарий