Intereting Posts
Возврат данных из AsyncTask без блокировки пользовательского интерфейса Модернизация Более медленное время отклика в реальных устройствах Android по сравнению с эмулятором и сетью Установка значений и отображение текста в Android Spinner Java.lang.IllegalArgumentException: просмотр не подключен к менеджеру окон Очистить историю (недавняя папка) в Android-селекторе Android 5+ (ACTION_OPEN_DOCUMENT_TREE) ListRragment "показ контента еще не создан" в Rotate Могу ли я «использовать» Java 8 с Android Development сейчас? Могу ли я получить онлайн-пользователей в списке друзей через Smack? Использование AndroidAnnotations с Scala и Gradle Назад и вперед для веб-просмотра в Android. как? Каков список задач, которые выполняет ConnectedAndroidTest? InApp Purchase RESTORE_TRANSACTIONS, я не могу вычислить код Нужен ли мне собственный сервер для использования интерфейса Stripe? Передовые методы асинхронного программирования Как сохранить объект в базе данных sqlite?

Android Предварительная установка приложения NDK

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

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

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

Спасибо, artylar

Solutions Collecting From Web of "Android Предварительная установка приложения NDK"

У меня была такая же потребность, и после двух дней тяжелых исследований я придумал решение этой проблемы. Это не просто и требует, чтобы вы также могли модифицировать код системы 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). Требуются и другие небольшие модификации, но вы, вероятно, узнаете это, как только у вас есть это направление. Надеюсь, поможет!

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

 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 ..

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

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

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

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