抱歉,我来晚了,问题已经有答案了,但是是的,您可以下载并执行外部库。这是我的做法:
我想知道这是否可行,所以我编写了以下类:
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 文件,并以 /sdcard/shlublu.jar 的形式保存在设备的 SD 卡上。
然后我写了下面的“愚蠢的程序”,从我的 Eclipse 项目中删除 MyClass 并清理它:
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()。
它有效...我在我的 LogCat 中看到MyClass 中定义的跟踪:
我已经在模拟器 2.1 和我的物理 HTC 手机(运行 Android 2.2 且未 root)上进行了尝试。
这意味着您可以创建外部 DEX 文件以供应用程序下载和执行。在这里,它的制作方式很困难(丑陋的Object 演员,Method.invoke() 丑陋的电话......),但必须可以与Interfaces 一起玩以使事情变得更清洁。
哇。我是第一个吃惊的。我期待的是SecurityException。
一些有助于进一步调查的事实:
- 我的 DEX shlublu.jar 已签名,但我的应用程序没有签名
- 我的应用程序是从 Eclipse / USB 连接执行的。所以这是一个在DEBUG模式下编译的未签名APK