Android- Uso de DexClassLoader para cargar el archivo apk

He golpeado un pedazo de una pared. Cualquier ayuda sería apreciada. Tengo una aplicación que quiero usar DexClassLoader para cargar otro archivo apk.

Aquí está mi código:

DexClassLoader dLoader = new DexClassLoader("/sdcard/download/test.apk","/sdcard/download",null,ClassLoader.getSystemClassLoader().getParent()); Class calledClass = dLoader.loadClass("com.test.classname"); Intent it=new Intent(this, calledClass); it.setClassName("com.test", "com.test.classname"); startActivity(it); 

Ahora ya había instalado test.apk así que cuando funcioné el código antedicho trabajó muy bien y lanzó la aplicación. Sin embargo, quiero ser capaz de ejecutar esto sin test.apk que ya está instalado (como que derrotaría el punto entero de la aplicación). Así que lo desinstalé y cuando corrí mi aplicación de nuevo me sale este error:

 android.content.ActivityNotFoundException: Unable to find explicit activity class {com.test/com.test.classname}; have you declared this activity in your AndroidManifest.xml. 

Así que estoy un poco perplejo aquí. Esta actividad se declara en el Manifiesto del apk que estoy tratando de ejecutar. No puedo declararlo en mis solicitudes Manifiesto. ¿Algunas ideas?

Gracias, Craig

Trate de usar el PathClassLoader de Android:

  String packagePath = "com.mypackage"; String classPath = "com.mypackage.ExternalClass"; String apkName = null; try { apkName = getPackageManager().getApplicationInfo(packagePath,0).sourceDir; } catch (PackageManager.NameNotFoundException e) { // catch this } // add path to apk that contains classes you wish to load String extraApkPath = apkName + ":/path/to/extraLib.apk" PathClassLoader pathClassLoader = new dalvik.system.PathClassLoader( apkName, ClassLoader.getSystemClassLoader()); try { Class<?> handler = Class.forName(classPath, true, pathClassLoader); } catch (ClassNotFoundException e) { // catch this } 

Aunque la pregunta es vieja, contestaré porque luché un poco para encontrar una respuesta clara para su misma pregunta para mí. En primer lugar, me gustaría destacar que un requisito claro en su pregunta es cargar una clase de un .apk que no está ya instalado en el dispositivo. Por lo tanto, llamar al gestor de paquetes utilizando getPackageManager () y proporcionarle la ruta del paquete llevará claramente a NameNotFoundException porque el .apk que tiene el paquete no está instalado en el dispositivo.

Por lo tanto, la forma de realizar cargas de clases desde un archivo .apk que no está instalado en el dispositivo (es decir, sólo tiene el archivo .apk almacenado en un directorio en su SDCARD) está utilizando DexClassLoader de la siguiente manera:

1- Asegúrese de tener el archivo .apk en un directorio de su SDCARD. Tengo el mío Offloadme.apk en la carpeta de descarga de mi SDCARD.

2- Agregue permiso de lectura en su AndroidManifest.xml para permitir que su aplicación lea del manifiesto.

 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> 

3- Utilice las siguientes definiciones para definir la ruta de acceso de .apk, el nombre de clase dentro del apk y el nombre del método en la clase que desea invocar:

 final String apkFile =Environment.getExternalStorageDirectory().getAbsolutePath()+"/Download/Offloadme.apk"; String className = "com.khaledalanezi.offloadme.SimpleCalculator"; String methodToInvoke = "add"; 

4- Utilice el DexClassLoader para cargar el .apk y llame al método add en la clase SimpleCalculator usando la reflexión como sigue:

  final File optimizedDexOutputPath = getDir("outdex", 0); DexClassLoader dLoader = new DexClassLoader(apkFile,optimizedDexOutputPath.getAbsolutePath(), null,ClassLoader.getSystemClassLoader().getParent()); try { Class<?> loadedClass = dLoader.loadClass(className); Object obj = (Object)loadedClass.newInstance(); int x =5; int y=6; Method m = loadedClass.getMethod(methodToInvoke, int.class, int.class); int z = (Integer) m.invoke(obj, y, x); System.out.println("The sum of "+x+" and "+"y="+z); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvocationTargetException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Tenga en cuenta que en mi ejemplo simple, he añadido dos números utilizando el método add disponible en la clase SimpleCalculator cargado desde el archivo Offloadme.apk almacenado en mi SDCARD y pude imprimir la respuesta correcta que es 11.

No puedes hacer eso. Incluso si eres capaz de acceder a las clases de archivos externos, Android todavía no los conoce. Y no se ejecutan las actividades directamente, pero al solicitar a Android para ejecutarlos, por lo que tienen que ser registrados / instalados en el sistema.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.