2011-07-01 15 views
9

Próbujemy wstępnie zainstalować aplikację NDK w katalogu /system/app. Jeśli otworzę plik APK w menedżerze plików ZIP, plik .so znajduje się w katalogu lib. Jednak po wstępnym zainstalowaniu pliku apk plik apk o numerze .so nie jest kopiowany do katalogu system/lib, co powoduje awarię aplikacji po jej uruchomieniu na urządzeniu.Android Wstępne instalowanie aplikacji NDK

Czy ktoś może mi powiedzieć, co należy ustawić w Android.mk dla pliku APK tak, że plik .so zostaną wyodrębnione z pliku APK i kopiowane do system/lib katalogu? Musimy uwzględnić aplikację w obrazie systemu.

Wszelkie uwagi będą bardzo mile widziane.

Dzięki, artsylar

+0

Pod względem technicznym sądzę, że plik .so powinien zostać skopiowany do katalogu/data/data/com.yourpackage.name/lib, ale mam ten sam problem w wstępnie zainstalowanych aplikacjach, które nie kopiują tego pliku APK. – Devunwired

+0

to, co zrobiliśmy, po prostu rozpakowaliśmy plik z APK ręcznie za pomocą dowolnego narzędzia zip, takiego jak 7zip. Następnie stworzyliśmy plik make, który skopiuje pliki do katalogu /out/..../system/lib podczas kompilowania kodu źródłowego Androida. W naszym przypadku chcielibyśmy umieścić go w obrazie ROM, ponieważ jest potrzebny natywnej aplikacji, dlatego musimy skopiować go do katalogu/system/lib. – artsylar

+0

możesz odnieść się do tego forum https://groups.google.com/group/android-ndk/browse_thread/thread/2d08a95b3038e532?hl=ja mieli ten sam problem co nasz – artsylar

Odpowiedz

4

miałem te same potrzeby i po 2 dniach ciężkich badań, wpadłem na rozwiązanie tego problemu. Nie jest to proste i wymaga modyfikacji kodu systemu Android.

Zasadniczo usługa PackManagerService uniemożliwia aplikacjom systemowym rozpakowanie ich macierzystych plików binarnych (plików .so), o ile nie zostały one zaktualizowane. Jedynym sposobem na naprawienie tego jest modyfikacja PMS.java (trafnie nazwana, ponieważ próba rozwiązania tego problemu wpędziła mnie w okropny nastrój).

Na pierwszym uruchomieniu systemu, sprawdzić każdą paczkę systemową dla natywnych plików binarnych pisząc isPackageNative (PackageParser.Package pkg) funkcja:

private boolean isPackageNative(PackageParser.Package pkg) throws IOException { 
    final ZipFile zipFile = new ZipFile(pkg.mPath); 
    final Enumeration<? extends ZipEntry> privateZipEntries = zipFile.entries(); 
    while (privateZipEntries.hasMoreElements()) { 
     final ZipEntry zipEntry = privateZipEntries.nextElement(); 
     final String zipEntryName = zipEntry.getName(); 
     if(true) Log.e(TAG, " Zipfile entry:"+zipEntryName); 
     if (zipEntryName.endsWith(".so")) { 
      zipFile.close(); 
      return true; 
     } 
    } 
    zipFile.close(); 
    return false; 
    } 

Funkcja ta sprawdza każdy pakiet dla natywnej biblioteki i jeśli ma jeden, rozpakowuję go. PMS wykonuje tę kontrolę w scanPackageLI (....). Wyszukaj następujący kod w metodzie:

if (isSystemApp(pkg) && !isUpdatedSystemApp(pkg)) 

i dodaj test isPackageNative (pkg). Potrzebne są inne małe modyfikacje, ale prawdopodobnie zorientujesz się, że masz już ten kierunek. Mam nadzieję, że to pomoże!

+0

+1, mimo że odpowiedź jest niekompletna. Pomogło. – Halsafar

+0

wow thanks! to jest jak dotąd najlepsza odpowiedź, chociaż na razie nie mam szansy jej wypróbować. ale wygląda na to najlepszy sposób, więc przyjmuję to jako odpowiedź. dzięki! – artsylar

1

Trzeba będzie "adb push" .so złożyć samemu. Ponadto, nie musisz koniecznie przesuwać biblioteki do system/lib (folder i tak może odmówić Ci pozwolenia). Większość przesunąć do data/app a następnie załadować wydając

System.load("/data/app/<libName>.so"); 
+0

dzięki @ digitalmouse12 za komentarz. Musimy jednak zintegrować aplikację z obrazem systemu, co oznacza, że ​​musimy ją wstępnie zainstalować bez użycia adb. – artsylar

+0

Znalazłem ten wpis [link] (http://groups.google.com/group/android-porting/browse_thread/thread/aff028eff3d680a4/342691bc1145389a?lnk=gst&q=boot+so+apk#342691bc1145389a) i jest tam napisane "Podczas pierwszej sekwencji rozruchowej (np. po danych -wipe przy uruchomieniu emulatora lub przywróceniu ustawień fabrycznych urządzenia), system wyszuka pakiety aplikacji w katalogu/system/app/ .apk i zainstaluje jeden po drugim. ". – artsylar

+0

Czy oznacza to również, że pliki biblioteki (* .so) zostaną wyodrębnione do katalogu/system/lib? Ale dlaczego jest tam napisane, że "Aplikacje, które są dołączone do systemu, powinny umieścić swoje biblioteki systemowe w katalogu/system/lib"? – artsylar

2

myślę, że nie może tego zrobić domyślnie jako partycji/system Android jest zamontowana jako tylko do odczytu! Potrzebny jest zakorzenione telefon tak, aby zamontować/systemu z uprawnieniami zapisu przez polecenie:

mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system. 

Tak więc, jeśli masz zakorzenione telefonu można dodać w aplikacji ten kod:

Process p; 
try { 
    // Preform su to get root privledges 
    p = Runtime.getRuntime().exec("su"); 
    // Attempt to write a file to a root-only 
    DataOutputStream os = new DataOutputStream(p.getOutputStream()); 
    // gain root privileges 
    os.writeBytes("mount -o rw,remount -t yaffs2 /dev/block/mtdblock3 /system\n"); 
    // do here the copy operation you want in /system/lib file, for example: 
    os.writeBytes("mv /sdcard/mylib.so /system/lib/\n"); 

    // Close the terminal 
    os.writeBytes("exit\n"); 
    os.flush(); 

} catch (IOException e) { 
    toastMessage("could not get root access"); 
} 

W przeciwnym razie musisz postępować zgodnie z rozwiązaniem, które dało digitalmouse12 ..

+0

To nie jest naprawdę istotne, ponieważ mówisz o modyfikacji instalacji na telefonie, ale plakat mówi o włączeniu czegoś do obrazu systemu, który ma być zainstalowany, zanim zostanie zainstalowany w telefonie. –

+0

Dziękuję Thanasis. Jednak Chris ma rację. Chciałbym wiedzieć, jak wstępnie zainstalować wstępnie skompilowany plik APK z dołączonymi plikami .so do obrazu systemu. – artsylar

+0

Tak, teraz rozumiem problem, ale nie znam rozwiązania. Jeśli coś znajdę, to dam ci znać! :) –

0

Prawdopodobnie jest gdzieś dokumentacja, ale jeśli nie możesz tego znaleźć, sugerowałbym identyfikację wstępnie zainstalowanej aplikacji z powiązaną biblioteką jni .to sprawdzanie źródeł Androida lub odpowiadający obraz systemu lub update.zip, aby zobaczyć, jak jest obsługiwany.

Innymi słowy, programowanie przez przykład ...