Intereting Posts
Использование Android WebView для подключения к защищенному серверу с сертификатом клиента Как предотвратить автозаполнение Android Studio, удалив соседний токен Как получить моментальный снимок карты из активности выбора места? Состояние возврата Retrofit Android 500 внутренняя ошибка сервера Простая вкладка, использующая фрагментацию, а не tabactivity Как отправить событие из службы на активность с помощью шины событий Otto? Как обновить предыдущий фрагмент после закрытия активности, которая была запущена внутри адаптера? Кнопка плавающего действия и белый фон Анимация слайдов и слайдов для макета Отключить пул соединений FireBase Cloud Messaging не работает Как добавить ключевые слова для оптимизации поиска моего приложения для Android в магазине google play Разрешение MarshMallow для gmaps Оптимальное столкновение пикселей с Config.ALPHA_8 AlphabetIndexer setCursor не обновляет свой кеш

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, чтобы узнать, как он обрабатывается.

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