您的位置:首页 > 移动开发 > Android开发

Android动态加载jar/dex

2015-03-27 19:23 323 查看
http://www.cnblogs.com/over140/archive/2011/11/23/2259367.html

加载jar

boolean bool = new File("/sdcard/test.jar").exists();

DexClassLoader cl = new DexClassLoader(
"/sdcard/test.jar", this.getCacheDir()
.getAbsolutePath(), null, this.getClassLoader());
try {
Class<?> c  =  cl.loadClass("HelloWorld");

Object obj = c.newInstance();

Method method = c.getMethod("getHelloWord", null);

String s = (String) method.invoke(obj, null);

TextView tv = (TextView)findViewById(R.id.tv);

tv.setText(s);

} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


  

不要忘记:

将jar优化时应该重新成jar(jar->dex->jar),如果如下命令:

      dx --dex --output=test.jar dynamic.jar

加载未安装APK中的类

public class MainActivity extends ActionBarActivity {

@SuppressLint("NewApi")
@SuppressWarnings("unused")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

boolean bool = new File("/sdcard/test.apk").exists();

DexClassLoader cl = new DexClassLoader(
"/sdcard/test.apk", this.getCacheDir()
.getAbsolutePath(), null, this.getClassLoader());
try {
Class<?> c  =  cl.loadClass("com.example.testdexclassloaderloadapk.MainActivity");

Object obj = c.newInstance();

Method method = c.getMethod("getHelloWord", null);

String s = (String) method.invoke(obj, null);

TextView tv = (TextView)findViewById(R.id.tv);

tv.setText(s);

} catch (ClassNotFoundException | NoSuchMethodException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}
}


  注意:

1.由于是使用反射,无法取得Context,也就是TestBActivity与普通的类毫无区别,没有生命周期。

2.做实验是出现了: Class ref in pre-verified class resolved to unexpected implementation 错误

查看:http://blog.csdn.net/berber78/article/details/41721877

原因是 两个工程引用了同样的 appcompat_v7 工程

大神之作 dl 动态加载架构:
https://github.com/singwhatiwanna/dynamic-load-apk
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: