Désolé, je suis en retard et la question a déjà une réponse acceptée, mais oui vous pouvez télécharger et exécuter des bibliothèques externes. Voici comment j'ai procédé :
Je me demandais si cela était possible et j'ai donc écrit la classe suivante :
package org.shlublu.android.sandbox;
import android.util.Log;
public class MyClass {
public MyClass() {
Log.d(MyClass.class.getName(), "MyClass: constructor called.");
}
public void doSomething() {
Log.d(MyClass.class.getName(), "MyClass: doSomething() called.");
}
}
Et je l'ai emballé dans un fichier DEX que j'ai enregistré sur la carte SD de mon appareil en tant que /sdcard/shlublu.jar
.
Ensuite, j'ai écrit le "programme stupide" ci-dessous, après avoir supprimé MyClass
de mon projet Eclipse et l'a nettoyé :
public class Main extends Activity {
@SuppressWarnings("unchecked")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try {
final String libPath = Environment.getExternalStorageDirectory() + "/shlublu.jar";
final File tmpDir = getDir("dex", 0);
final DexClassLoader classloader = new DexClassLoader(libPath, tmpDir.getAbsolutePath(), null, this.getClass().getClassLoader());
final Class<Object> classToLoad = (Class<Object>) classloader.loadClass("org.shlublu.android.sandbox.MyClass");
final Object myInstance = classToLoad.newInstance();
final Method doSomething = classToLoad.getMethod("doSomething");
doSomething.invoke(myInstance);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Il charge essentiellement la classe MyClass
de cette façon :
Ensuite, il crée une instance de MyClass
et invoque doSomething()
sur l'instance créée.
Et ça marche... Je vois les traces définies dans MyClass
dans mon LogCat :
J'ai essayé à la fois sur un émulateur 2.1 et sur mon téléphone portable HTC physique (qui fonctionne sous Android 2.2 et qui n'est PAS enraciné).
Cela signifie que vous pouvez créer des fichiers DEX externes pour que l'application les télécharge et les exécute. Ici, cela a été fait de la manière forte (laid Object
des plâtres, Method.invoke()
vilains appels...), mais il doit être possible de jouer avec des Interface
pour rendre quelque chose plus propre.
Wow. Je suis le premier surpris. Je m'attendais à un SecurityException
.
Quelques faits pour aider à enquêter davantage :
- Mon DEX shlublu.jar a été signé, mais pas mon application.
- Mon application a été exécutée à partir d'Eclipse / connexion USB. Il s'agit donc d'un APK non signé compilé en mode DEBUG.