2012-05-21 4 views
7

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

Ниже то, что я сделал до сих пор:Android: программное копирование apk в/system/app

  1. Мое устройство укоренено.
  2. Приложение "installer" установлено как системное приложение. (скопировал его вручную в/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<br> 
    cat /sdcard/application.apk > /system/app/application.apk<br> 
    mount -o remount,ro -t yaffs2 /dev/block/mtdblock3 /system<br><br>The application.apk here is the app being installed from the installer app. This app is also signed with platform key, and has the sharedUserId configured. 
    
  5. Я запросил разрешение INSTALL_PACKAGES в манифесте.

Я пробовал несколько вариантов формата exec (""), включая использование 'su -c' с каждой командой. Я получил исключение Broken Pipe и исключение безопасности. Иногда я не получаю исключения, но файл не копируется.


Пожалуйста, дайте мне знать, что мне не хватает здесь. Кто-нибудь получил эту работу?

Спасибо!

+0

относительно заметки, в чем разница между приложением, подписанным с ключом платформы, и с sharedUserId = system; и приложение, присутствующее в/system/app? – Chaitanya

+0

Приложения в/system/app имеют доступ к уровням разрешений 2 (не 1, насколько я знаю). Независимо от разрешений *, предоставленных *, приложения с sharedUserId системы наследуют разрешения, предоставляемые «родительскому» приложению, и, кроме того, выполняются в одном и том же идентификаторе процесса, что и «родительский». Различные API проверяют идентификатор процесса приложения и запрещают доступ к ним, если они не имеют определенного типа. Хотя они в основном тесно связаны друг с другом, они не всегда * идут рука об руку.Это нетехнический способ описать его, я уверен, что другие люди сделают лучшую работу ... – slinden77

ответ

4

я продолжал копать, и вот результаты:

  • Android имеет эту проверку в su.c: [ "корень андроида источника" /system/extras/su/su.c]
/* Until we have something better, only root and the shell can use su.*/ 
myuid = getuid(); 
if (myuid != AID_ROOT && myuid != AID_SHELL) { 
    fprintf(stderr,"su: uid %d not allowed to su\n", myuid); 
    return 1; 
} 

ChainsDD (суперпользователя) и циан мод обойти эту проблему путем реализации их собственных 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.

Я принимаю это как ответ на данный момент.

+0

может ли приложение скопировать себя в системную папку вместо использования внешнего приложения? Можете ли вы прояснить команды, используемые для копирования приложения? Кроме того, как я могу получить ключ платформы? Спасибо. – Dania