是否可以在运行时从Android应用程序动态加载库?

有没有办法让Android应用程序在运行时下载并使用Java库

以下是一个例子:

假设应用程序需要根据输入值进行一些计算。应用程序要求输入这些值,然后检查所需的Classes或方法是否可用

如果没有,它将连接到服务器,下载所需的库,并在运行时加载它,以使用反射技术调用所需的方法。根据不同的标准,例如下载库的用户,实现可能会发生变化

很抱歉,我迟到了,问题已经有了公认的答案,但是,您可以下载并执行外部库。我是这样做的:

我想知道这是否可行,所以我写了以下课程:

包org.shlublu.android.sandbox;
导入android.util.Log;
公共类MyClass{
公共MyClass(){
Log.d(MyClass.class.getName(),“MyClass:constructor-called.”);
}
公共无效剂量测定法(){
Log.d(MyClass.class.getName(),“调用MyClass:doSomething()”;
}
}

我把它打包成一个DEX文件,保存在我设备的SD卡上,名为/sdcard/shlublu.jar

在从Eclipse项目中删除并清理了MyClass之后,我编写了下面的“愚蠢程序”:

公共类主扩展活动{
@抑制警告(“未选中”)
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
试一试{
最后一个字符串libPath=Environment.getExternalStorageDirectory()+“/shlublu.jar”;
最终文件tmpDir=getDir(“dex”,0);
final DexClassLoader classloader=新的DexClassLoader(libPath,tmpDir.getAbsolutePath(),null,this.getClass().getClassLoader());
final Class<Object>classToLoad=(Class<Object>)classloader.loadClass(“org.shlublu.android.sandbox.MyClass”);
实例=myclassobject.newtoload();
最终方法doSomething=classToLoad.getMethod(“doSomething”);
调用(myInstance);
}捕获(例外e){
e、 printStackTrace();
}
}
}

它基本上是这样加载类MyClass

  • 创建一个DexClassLoader

  • 使用它从“/sdcard/shlublu.jar”

  • 并将此类存储到应用程序的“dex”专用目录(手机的内部存储)

然后,它创建一个MyClass的实例,并对所创建的实例调用doSomething()

而且它是有效的。。。我在日志猫中看到了MyClass中定义的跟踪:

我已经在emulator 2.1和我的物理HTC手机(运行Android 2.2,没有根目录)上进行了尝试

这意味着您可以为应用程序创建外部DEX文件以下载和执行它们。在这里,这是一个艰难的过程(丑陋的对象强制转换,方法.invoke()丑陋的调用…),但必须能够使用接口使某些东西更干净

哇。我是第一个感到惊讶的人。我希望出现安全异常

以下事实有助于进一步调查:

  • 我的DEX shlublu.jar已签名,但我的应用程序未签名
  • 我的应用程序是通过Eclipse/USB连接执行的。这是一个在调试模式下编译的无符号APK

发表评论