2011-07-01 32 views
9

Bir NDK Uygulamasını /system/app dizinine önceden yüklemeye çalışıyoruz. Bir ZIP dosyası yöneticisinde apk dosyasını açarsam, .so dosyası lib dizininin içinde. Ancak, apk dosyasını önceden yüklediğimizde, apk .so dosyasının, system/lib dizinine kopyalanmaması, uygulamanın aygıtta başlatıldığında başarısız olmasına neden olur. .so dosya APK dosyasından çıkarılan ve system/lib dizinine kopyalanacaktır böyleceAndroid Ön Yükleme NDK Uygulaması

kimse APK dosyası için Android.mk ayarlanmalıdır gerektiğini söyleyebilir misin? Uygulamayı sistem görüntüsüne dahil etmeliyiz.

Herhangi bir geri bildirim büyük takdir edilecektir.

sayesinde artsylar

+0

Teknik olarak, ben /data/data/com.yourpackage.name/lib dizinine .so dosyasının kopyalanması gerektiğine inanıyorum, ancak önceden yüklenmiş uygulamalarda aynı sorunu yaşıyorum bunu kopyalamak değil APK. – Devunwired

+0

Ne yaptığımız sadece 7zip gibi herhangi bir zip araçları kullanarak el ile bu dosyayı APK'dan çıkardık. Ardından, android kaynak kodunu derlerken dosyaları /out/..../system/lib dizinine kopyalayacak bir make dosyası oluşturduk. Bizim durumumuzda, bir yerel uygulama tarafından ihtiyaç duyulduğundan ROM görüntüsüne dahil etmek istiyoruz, bu yüzden/system/lib dizinine kopyalamamız gerekiyor. – artsylar

+0

bu foruma başvurabilirsiniz https://groups.google.com/group/android-ndk/browse_thread/thread/2d08a95b3038e532?hl=ja Onlar bizimki gibi aynı sorunu vardı – artsylar

cevap

4

Aynı ihtiyaç vardı ve ağır araştırmaların 2 gün sonra, bu soruna bir çözüm geldi. Bu basit değildir ve Android Sistem kodunu da değiştirebilmenizi gerektirir.

Temel olarak PackageManagerService, sistem uygulamalarının, güncelleştirilmemişlerse, yerel ikili dosyalarını (.so dosyaları) paketlerinden açmasını engeller. Bu yüzden bunu düzeltmenin tek yolu, PMS.java'yı değiştirerek (bu problemi çözmek için denediğimden beri uygun bir ruh haline soktu). Sistemin ilk açılışta üzerinde

, bir isPackageNative (PackageParser.Package pkg) yazarak yerli ikili için her sistem paketi kontrol fonksiyonu:

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; 
    } 

Bu fonksiyon kontrolleri her paket bir yerli kütüphane için ve varsa Bir tane açarım. PMS bu denetimi scanPackageLI (....) içinde yapar. yönteminde aşağıdaki kodu arayın:

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

ve isPackageNative (pkg) işareti eklenir. Gerekli diğer küçük değişiklikler var ama muhtemelen bu yöne sahip olduğunuzda bunu anlayacaksınız. Umarım yardımcı olur!

+0

+1 bu. Bu yardımcı oldu. – Halsafar

+0

Vay teşekkürler! Şimdilik bunu denemek için bir şansım olmasa da, bu şimdiye kadar ki en iyi cevap. ama bunu yapmanın en iyi yolu gibi görünüyor, ben de bunu cevap olarak kabul ediyorum. Teşekkürler! – artsylar

1

Sen "adb push" .so dosyayı kendiniz gerekecektir. Ayrıca, kütüphanenizi system/lib'a zorlamanız gerekmez (klasör sizi yine de izninizi reddedebilir). Çoğu

düzenlenmek suretiyle data/app itin ve ardından yüklemek
System.load("/data/app/<libName>.so"); 
+0

teşekkürler @ digitalmouse12. Ancak, uygulamayı, sistem resmiyle bütünleştirerek, adb kullanmadan ön yüklememiz gerekir. – artsylar

+0

Bu yazıyı [bağlantı] (http://groups.google.com/group/android-porting/browse_thread/thread/aff028eff3d680a4/342691bc1145389a?lnk=gst&q=boot+so+apk#342691bc1145389a) buldum ve orada yazıyor "İlk önyükleme dizisi sırasında (örneğin, emülatör başlatılırken bir silme verildikten sonra veya bir aygıtta bir fabrika sıfırlamadan sonra), sistem/system/app/ .apk altındaki birlikte verilen uygulamalar için tarama yapar ve yüklenir Onları birer birer. " – artsylar

+0

Aynı zamanda kütüphane dosyalarının (* .so)/system/lib dizinine çıkarılacağı anlamına mı geliyor? Ama neden aynı zamanda "Sistem ile paketlenmiş uygulamalar _should_ sistem kütüphanelerini/system/lib altına yerleştiriyor" diyor? – artsylar

2

Sana salt okunur olarak monte edilir Android'in/sistem bölümünde varsayılan olarak bunu yapamaz düşünün!

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"); 
} 

:

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

Yani bir köklü telefonunuz varsa uygulamanızda bu kod ekleyebilirsiniz: Bu komut ile yazma ayrıcalığı/system monte edileceği şekilde bir köklü telefon lazım Aksi takdirde, digitalmouse12'nin verdiği çözümü takip etmelisiniz ..

+0

Bu, telefonun kurulumunu değiştirmekten bahsetmiş olduğunuzdan gerçekten alakalı değildir, ancak poster, telefona yüklenmeden önce, yüklenecek sistem görüntüsünde bir şey eklemekten bahsediyor. –

+0

Teşekkür ederim Thanasis. Ancak, Chris doğrudur. Bilmek istediğim, önceden oluşturulmuş bir apk dosyasını önceden yüklenmiş .so dosyaları ile sistem görüntüsüne nasıl yükleyeceğiniz. – artsylar

+0

Evet, şimdi sorunu anlıyorum ama çözümü bilmiyorum .. Eğer bir şey bulursam size haber vereceğim! Bu cevap eksik olsa da, bu –

0

Muhtemelen bir yerde belgeler var, ancak bunu bulamıyorsanız, önceden yüklenmiş bir uygulama ile ilişkili bir jni kütüphanesi .so tanımlamayı ve android kaynakları incelemenizi tavsiye ederim. veya ilgili sistem resmi veya Nasıl ele alındığını görmek için update.zip. örnek Başka bir deyişle, programlama olarak

...