2012-05-21 27 views
7

Próbuję zainstalować systemową aplikację z mojego kodu Java i jak dotąd nie odniosłem żadnego sukcesu.

Oto, co zrobiłem do tej pory:Android: programowo kopiuje apk do/system/app

  1. Moje urządzenie jest zrootowane.
  2. Moja aplikacja "instalator" jest instalowana jako aplikacja systemowa. (skopiowałem go ręcznie do/system/app)
  3. Podpisałem plik instalacyjny APK z kluczem platformy, a w Manifeście mam android:sharedUserId="android.uid.system".
  4. Próbowałem (i próbowałem, a potem trochę więcej) dla Runtime.getRuntime.exec("su"). Zamierzam zamontować partycję systemową jako rw, zrobić cat dla apk, a następnie utworzyć partycję systemową ro. Poniżej znajduje się lista poleceń:

    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. Poprosiłem o pozwolenie INSTALL_PACKAGES w manifeście.

Próbowałem wielu odmian formatu exec (""), w tym przy użyciu 'su -c' przy każdym poleceniu. Dostałem wyjątek od Broken Pipe i Security. Czasami nie dostaję wyjątku, ale plik nie jest kopiowany.

Proszę dać mi znać, czego tu brakuje. Czy ktoś to działa?

Dzięki!

+0

na pokrewnej notatce, jaka jest różnica między aplikacją podpisaną przy użyciu klucza platformy a funkcją sharedUserId = system; i aplikacja obecna w/system/app? – Chaitanya

+0

aplikacje w/system/app mają dostęp do poziomu uprawnień 2 (nie 1, o ile wiem). Bez względu na uprawnienia * przyznane *, aplikacje z sharedUserId systemu dziedziczą uprawnienia nadawane aplikacji "nadrzędnej", a ponadto działają w tym samym id procesowym, co "parent". Różne interfejsy API sprawdzają identyfikator procesu aplikacji i odmawiają dostępu do nich, jeśli nie należą do określonego rodzaju. Chociaż 2 są w większości ściśle ze sobą powiązane, nie zawsze * idą w parze.To jest sposób nietechnologiczny, aby to opisać, jestem pewien, że inni ludzie wykonaliby lepszą robotę ... – slinden77

Odpowiedz

4

Ciągle na kopanie, a oto wyniki:

  • Android ma tę kontrolę w su.c: [ "korzeniem android źródła" /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 (SuperUser) i CyanogenMod to obejść poprzez wdrożenie własnej su.c: https://github.com/CyanogenMod/android_system_su/blob/master/su.c

Na razie akceptuję to jako odpowiedź.

+0

czy aplikacja może skopiować się do folderu systemowego, zamiast korzystać z zewnętrznej aplikacji? Czy możesz wyjaśnić polecenia użyte do skopiowania aplikacji? W jaki sposób mogę uzyskać klucz platformy? Dziękujemy. – Dania