Aplicación de NDK de Android para la preinstalación

Estamos intentando preinstalar una aplicación NDK en el directorio /system/app . Si abro el archivo apk en un gestor de archivos ZIP, el archivo .so encuentra dentro del directorio lib. Sin embargo, cuando preinstalamos el archivo apk , el archivo .so del apk no se copia en el directorio system/lib , causando que la aplicación falle cuando lo lanzamos al dispositivo.

¿Puede alguien decirme por favor qué debe ser fijado en el Android.mk para el archivo de APK de modo que el archivo .so sea ​​extraído del archivo de APK y copiado al directorio del system/lib ? Necesitamos incluir la aplicación en la imagen del sistema.

Cualquier regeneración será apreciada grandemente.

Gracias, artsylar

Tuve la misma necesidad y después de 2 días de pesada investigación, me surgió una solución a este problema. No es simple y requiere que puedas modificar el código del sistema Android también.

Básicamente PackageManagerService impide que las aplicaciones del sistema desempaqueten sus binarios nativos (archivos .so), a menos que se hayan actualizado. Así que la única manera de arreglar esto es mediante la modificación de PMS.java (adecuadamente nombrado desde intentar resolver este problema me puso en un estado de ánimo terrible).

En el primer arranque del sistema, compruebo cada paquete de sistema para binarios nativos escribiendo una función 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; } 

Esta función comprueba cada paquete para una biblioteca nativa y si tiene uno, lo descomprime. PMS realiza esta comprobación en scanPackageLI (….). Busque el siguiente código en el método:

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

Y agregue la comprobación isPackageNative (pkg). Hay otras pequeñas modificaciones necesarias, pero probablemente lo descubrirá una vez que tenga esta dirección. ¡Espero eso ayude!

Creo que no se puede hacer por defecto como Android / partición del sistema se monta como de sólo lectura! Necesita un teléfono enraizado para montar el sistema / con privilegios de escritura a través de este comando:

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

Por lo tanto, si tiene un teléfono con raíz puede agregar en su aplicación este código:

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

De lo contrario, tienes que seguir la solución que digitalmouse12 dio ..

Usted tendrá que "empujar adb" el archivo .so mismo. Además, no necesariamente tiene que empujar su biblioteca en system/lib (la carpeta puede denegarle permiso de todos modos). La mayoría lo empujan a data/app y luego cargan mediante la emisión

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

Probablemente hay documentación en algún lugar, pero si no puedes encontrarla, sugeriría identificar una aplicación preinstalada con una biblioteca jni asociada .so y examinar las fuentes de android o la correspondiente imagen del sistema o update.zip para ver cómo se maneja.

En otras palabras, la programación por ejemplo …

  • Eclipse se compila con éxito, pero todavía da errores semánticos
  • Cómo inyectar la biblioteca en el proceso Android zygote?
  • Ejecutar código nativo en segundo plano
  • Compartir el contexto EGL2.0 entre 2 GLSurfaceViews causó EGL_BAD_ACCESS en las tabletas Android
  • Android 4.2 ndk: error de carga de la biblioteca: load_library (linker.cpp: 750) || soinfo_link_image || libhoudini.so || opencv
  • ¿Qué parte de los dispositivos Android beneficia de las optimizaciones de Libjpeg-turbo?
  • Posible anular la biblioteca del sistema .so en la aplicación
  • Versión Qt / QML del kernel
  • Android NDK C ++ JNI (no se ha encontrado ninguna implementación para el nativo ...)
  • Depurar código nativo en Android Studio
  • Java.lang.UnsatisfiedLinkError: No se pudo cargar eposprint: findLibrary returned null
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.