Android-предустановка приложения NDK - PullRequest
9 голосов
/ 01 июля 2011

Мы пытаемся предварительно установить приложение NDK в каталог /system/app. Если я открою файл apk в менеджере файлов ZIP, файл .so будет находиться в каталоге lib. Однако, когда мы предварительно устанавливаем файл apk, файл apk .so не копируется в каталог system/lib, что приводит к сбою приложения при запуске его на устройстве.

Может кто-нибудь сказать, что нужно установить в Android.mk для файла APK, чтобы файл .so был извлечен из файла APK и скопирован в каталог system/lib? Нам нужно включить приложение в образ системы.

Любая обратная связь будет принята с благодарностью.

Спасибо, artsylar

Ответы [ 4 ]

4 голосов
/ 21 июля 2012

У меня была такая же потребность, и после 2 дней тяжелых исследований я нашел решение этой проблемы.Это не просто и требует, чтобы вы также могли изменять системный код Android.

В основном PackageManagerService не позволяет системным приложениям распаковывать свои собственные двоичные файлы (файлы .so), если они не были обновлены.Таким образом, единственный способ исправить это - изменить PMS.java (названный метко, поскольку попытка решить эту проблему приводит меня в ужасное настроение).

При первой загрузке системы я проверяю каждый системный пакет на наличие собственных двоичных файловнаписав функцию isPackageNative (PackageParser.Package pkg):

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

Эта функция проверяет каждый пакет на наличие собственной библиотеки, и, если она есть, я ее распаковываю.PMS выполняет эту проверку в scanPackageLI (....).Найдите следующий метод в методе:

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

и добавьте проверку isPackageNative (pkg).Требуются другие небольшие модификации, но вы, вероятно, поймете это, как только у вас появится это направлениеНадеюсь, это поможет!

2 голосов
/ 04 июля 2011

Я думаю, вы не можете сделать это по умолчанию, так как раздел Android / system монтируется только для чтения!Вам нужен рутированный телефон, чтобы смонтировать / system с правами записи с помощью этой команды:

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

Итак, если у вас есть рутированный телефон, вы можете добавить в свое приложение этот код:

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

В противном случае вы должны следовать решению, которое дал digitalmouse12 ..

1 голос
/ 01 июля 2011

Вам придется самостоятельно "нажать adb" файл .so. Кроме того, вам не обязательно помещать вашу библиотеку в system/lib (папка в любом случае может лишить вас разрешения). Большинство выдвигает его на data/app, а затем загружает, выдав

System.load("/data/app/<libName>.so");
0 голосов
/ 04 июля 2011

Возможно, где-то есть документация, но если вы не можете ее найти, я бы посоветовал определить предустановленное приложение со связанной библиотекой jni .so и изучить исходники Android или соответствующий образ системы или update.zip, чтобы увидеть, как оно обрабатывается.

Другими словами, программирование на примере ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...