Cargador de clases personalizado para android?
Estoy escribiendo una biblioteca de instrumentación que me gustaría trabajar en escritorio y móvil (Android).
Funciona por:
- ¿Es posible cargar dinámicamente una biblioteca en tiempo de ejecución desde una aplicación de Android?
- Cómo acceder a setPreferredNetworkType en la fuente de Android
- Reflexión Java: implementa la interfaz y pasa a otra clase
- Android / Java: ¿Llamar a un método usando reflexión?
- Uso de jarras que utilizan clases java.beans (Introspector, BeanInfo o PropertyDescriptor)
- Exponiendo un main que toma un solo parámetro, el principal de la clase target
- Instalar un cargador de clases que intercepta todas las clases a medida que se cargan y los instrumentos de ellos
Al igual que:
// Expects args[0] to contain the name of the INNER main public static void main(String[] args) throws Throwable { String className = args[0]; String [] newArgs = new String[0]; if(args.length > 1) { newArgs = Arrays.copyOfRange(args, 1, args.length-1); } System.out.println("Bootstrapping " + className); Loader s = new Loader(ClassLoader.getSystemClassLoader().getParent()); Class<?> c = s.loadClass(className); c.getDeclaredMethod("main", new Class[] { String[].class }).invoke( null, new Object[] { newArgs }); }
La pregunta es la siguiente:
¿Cómo puedo hacer aproximadamente lo mismo para una aplicación para Android?
Una idea es modificar el manifiesto android para sustituir las actividades existentes por actividades "wrapper", que luego instalan cargadores de clases y llaman a la actividad subyacente original. ¿Hay una mejor manera?
- UnsuppotedOperationException.getCause se devuelve
- Compruebe si el objeto tiene un método en Java?
- Reflexión para un campo que va mal
- Android getOnTouchListener con la versión del API> = 15
- Interceptar llamadas de método
- Soporte de la clase Robolectric de Android. Cómo tener las referencias de la clase de biblioteca R desde el proyecto de aplicación
- ¿Se considera reflexión y en qué grado?
- Android: cómo codificar dependiendo de la versión de la API?
Hay un proyecto llamado droidbox para detectar malware android. Hay un código que puede ayudarte mucho.
package com.loader; import dalvik.system.DexClassLoader; import android.app.Activity; import android.content.Intent; import android.os.Bundle; public class LoaderActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); DexClassLoader dLoader = new DexClassLoader("/sdcard/DroidBoxTests.apk","/sdcard/", null, ClassLoader.getSystemClassLoader().getParent()); Class calledClass = null; try { calledClass = dLoader.loadClass("droidbox.tests.DroidBoxTests"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } Intent it=new Intent(this, calledClass); it.setClassName("droidbox.tests", "droidbox.tests.DroidBoxTests"); startActivity(it); } }