¿Es posible cargar dinámicamente una clase de actividad de una biblioteca jar en el sdCard y realmente usarla?

Tengo 1 archivo de .jar en sdCard (utilizé la herramienta de dx para compilar un .jar usual a dex. De lo contrario android se quejará en tiempo de ejecución)

La clase que quiero usar es en realidad una actividad y por "uso" me refiero a inflar!

A) he notado que si cargue clase como esta, la clase cargada tendrá como paquete parrent el paquete de parrent-class (el que ejecute el código: ejemplo: real-package de la clase en jar library: "com .something "& my-app-package:" com.wonderfull "-> carga clase está en" com.wonderfull.com.something ":)) -> retested: mantiene el paquete original, al igual que en la biblioteca

B) En el caso "mejor", obtengo este error:

No se puede instanciar la actividad ComponentInfo {com.appno2 / com.appno1.futureLib.LibActivity}: java.lang.ClassNotFoundException: com.appno1.futureLib.LibActivity en loader dalvik.system.PathClassLoader [/data/app/com.appno2-1 .apk]

C) En el manifiesto he puesto la Actividad (la que se va a cargar dinámicamente) así:

Actividad android: nombre = "com.appno1.futureLib.LibActivity" android: label = "@ string / app_name"> / activity>

Así que repito la pregunta desde el título: ¿es posible dinamically cargar una clase de actividad de una biblioteca jar en el sdCard y realmente lo utilizan?

En caso de "¿Por qué quieres esto?" – sólo curiosidades! + Como un concepto: la posibilidad de descargar el código real de la aplicación (en forma de un frasco de algo) justo después de que el usuario introdujo una licencia válida

Actualización: – esta ideea funciona con fragmentos (el significado de la clase a importar es un fragmento)

Conclusión actual: – es posible tener: las clases lame java o incluso las clases relacionadas con la interfaz de usuario de android en un .jar externo (en sdCard por ejemplo, o para ser descargado desde internet..etc) y cargarlos dinamically a la necesidad. Oh yeah: usted no puede trabajar de esta manera esta actividades: (.. probablemente ni siquiera los servicios ..

Más información # 1: ¿Es posible cargar dinámicamente una biblioteca en tiempo de ejecución desde una aplicación de Android?

Más información # 2: http://android-developers.blogspot.ro/2011/07/custom-class-loading-in-dalvik.html

En cuanto a URLClassLoader : esto funciona (sin involucrar a DalvikClassLoader – ClassNotFoundException && obviosly: todavía no puedo inflar una actividad cargada como esta)

File file = new File("/sdcard/myLib.jar"); File tmpDir = getDir("dex", 0); ClassLoader loader = new URLClassLoader(new URL[]{file.toURI().toURL()}, this.getClass().getClassLoader()); DexClassLoader classloader = new DexClassLoader(file.getAbsolutePath(), tmpDir.getAbsolutePath(), null, loader); Class<Object> classref = (Class<Object>) classloader.loadClass("packageInLib.ClassName"); Object myInstance = classref.getConstructor().newInstance(); Or instead of "loadClass" Class<?> classref = Class.forName("packageInLib.ClassName", true, dalvikClassLoader); 

2 Solutions collect form web for “¿Es posible cargar dinámicamente una clase de actividad de una biblioteca jar en el sdCard y realmente usarla?”

Puede escanear archivos JAR para su contenido y cargar clases con URLClassloader. Es Java estándar (tengo una implementación de JavaSE si desea echar un vistazo), pero está incluido en la API de Android, así que creo que debería funcionar bien.

URLClassloader en developer.android.com

Básicamente se obtiene un ClassLoader (advertencia de código sucio!):

 File file = new File("/sdcard/jars/myDynamicLib.jar"); ClassLoader loader = new URLClassLoader(new URL[]{file.toURI().toURL()}, this.getClass().getClassLoader()); 

Usted necesita sus metadatos XML o lo que sea que describa qué cargar:

 jar.getInputStream(jar.getEntry("myMetaData.xml")); 

Carga la información (la forma de analizarla depende del formato que use: también puede cargarla con su aplicación) – ahora tiene el nombre de la clase.

Y ahora sólo intenta cargar:

 Class<?> classref = Class.forName(className, true, loader); instance = (MyType) classref.getConstructor().newInstance(); 

Una vez más, aunque no he probado esas cosas en Droid, creo que esto debería funcionar bien.

Eso lo compone. Necesita la ruta de acceso al archivo JAR y el nombre de la clase a cargar. El cargador de clase sacará las clases del JAR para usted.

Tengo escenarios similares.

Si u no pone debajo de los códigos en AndroidManifest.xml

 <activity android:name="com.appno1.futureLib.LibActivity" android:label="@string/app_name" > </activity> 

U obtendrá por debajo del error.

 10-21 17:04:25.860: E/AndroidRuntime(11050): Caused by: android.content.ActivityNotFoundException: Unable to find explicit activity class {... ...}; have you declared this activity in your AndroidManifest.xml? 

Pero si u registra la actividad en su aplicación cliente, entonces se obtendrá java.lang.ClassNotFoundException.

El cargador intentó buscar com.appno1.futureLib.LibActivity en [/data/app/com.appno2-1.apk]. Obviamente esto no se espera. Creo que com.appno.futureLib.LibActivity se encuentra en el archivo .jar.

Si hay una manera de permitir que el cargador busque LibActivity en el archivo .jar, el problema puede resolverse.

  • Uso de Groovy en Android
  • Error de Gradle después de actualizar a Android Studio a 2.0 Preview y usar Instant Run:
  • Usando .aar NoClassDefFoundError pero la clase existe y es Dexed
  • Uso de SimpleXML con Android y Gradle
  • Android / Scala proyecto en IntelliJ 14 compila, pero se bloquea cuando se inicia no encontrar la clase Scala
  • Se ha producido un error en la conversión al formato Dalvik: No se puede ejecutar dex: Se sobrepasó el límite superior de GC
  • Transformación automática del código dex de Android
  • El número de referencias de método en un archivo .dex supera los 64K
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.