Извините, я опоздал и на вопрос уже есть принятый ответ, но да , вы можете загружать и запускать внешние библиотеки. Вот как я это сделал:
Мне было интересно, возможно ли это, поэтому я написал следующий класс:
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.");
}
}
И я упаковал его в DEX-файл, который я сохранил на SD-карте моего устройства как /sdcard/shlublu.jar
.
Затем я написал «глупую программу» ниже, после удаления MyClass
из моего проекта Eclipse и очистки его:
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();
}
}
}
Он в основном загружает класс MyClass
таким образом:
Затем он создает экземпляр MyClass
и вызывает doSomething()
в созданном экземпляре.
И это работает ... Я вижу следы, определенные в MyClass
в моем LogCat:
Я пробовал как на эмуляторе 2.1, так и на своем физическом мобильном телефоне HTC (который работает под управлением Android 2.2 и который не имеет рута).
Это означает, что вы можете создавать внешние файлы DEX для приложения, чтобы загружать и выполнять их. Здесь это было сделано нелегко (уродливые Object
касты, Method.invoke()
некрасивые звонки ...), но должна быть возможность играть с Interface
s, чтобы сделать что-то чище.
Ничего себе. Я первый удивлен. Я ожидал SecurityException
.
Некоторые факты, которые помогут расследовать больше:
- Мой DEX shlublu.jar был подписан, но не мое приложение
- Мое приложение было выполнено из соединения Eclipse / USB. Так что это неподписанный APK, скомпилированный в режиме отладки