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.
- OpenCV Android - No se puede resolver la función JNI correspondiente
- Error: Su proyecto contiene archivos C ++ pero no está utilizando un sistema de generación nativo compatible
- Depuración remota del programa C puro con GDB
- Cómo comprobar el registro de bloqueo usando android ndk en cocos2d-x
- Software Android NDK código nativo c perfil en los teléfonos Android real
Cualquier regeneración será apreciada grandemente.
Gracias, artsylar
- ¿Están soportados Vertex Array Objects en Android OpenGL ES 2.0 usando extensiones?
- Cómo convertir archivos .mp3 a archivos .bin en android?
- Cómo construir OpenSSL para generar libcrypto.a con Android NDK y Windows
- Android NDK: load_library: no se puede localizar srand
- Android ndk ninguna regla para hacer objetivo
- ¿Alguna posibilidad de reducir el tiempo de obturación con el acceso a la cámara NDK de Android?
- Android ndk-gdb no carga símbolos
- Error: 'to_string' no es un miembro de 'std'
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 …