最简单的dex demo
from http://blog.csdn.net/u013478336/article/details/50734108
demo实现的目标是app加载另外一个dex里面的代码显示一个Toast
- 先来生成一个可以弹包含弹Toast的dex
-
新建一个module,创建一个接口用来弹Toast,再创建一个实现类
-
将这个module编译成jar文件(直接编译就可以了最后会在下面的目录生成jar)
-
将这个jar转化成包含dex的jar(使用到的是build-tool下面的dx命令
-
将生成的output.jar放到sdcard下面去(好让其他程序加载)
-
新建一个android工程加载刚才生成的dex并且调用里面的实现类的方法
- 简单说明这里使用的是反射,还有就是这里需要接口的签名,所以新建的工程需要添加一个和dex里面签名一样的接口定义
-
讲讲Google的分包方案 multiDex
网上相关的资料比较多这里所说两种情况
- 自动的分包,简单的配置(当方法超过65K的时候才会出现分包)
defaultConfig {
applicationId "suse.com.mdexdemo"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
multiDexEnabled true //多dex编译
}
- 编译的程序(生成的dex文件如下图)
![只有一个dex](http://upload-images.jianshu.io/upload_images/4203910-6d81227416d08e30.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/400)
- 手动控制主包里面的class有哪些(有些坑哈 和 gradle的版本有关)
![手动控制分包的配置](http://upload-images.jianshu.io/upload_images/4203910-a9021b5e214523ca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/400)
- maindexlist.txt 配置
![maindexlist.txt](http://upload-images.jianshu.io/upload_images/4203910-42a3c8a90de3f71c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/400)
- 生成的apk的dex结构
![](http://upload-images.jianshu.io/upload_images/4203910-3952b2a84a13cb68.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/400)
- 现在已经有了多个dex了,可是问题又来了,5.0以上安装的时候会扫描apk里面的dex文件将他们合并,5.0之前则只会加载classes.dex(所以现在需要一个方案来加载多个dex,否则可能会出现ClassNotFound)
- 官方提供的一个方案是 compile 'com.android.support:multidex:1.0.0'
- 具体代码是在application attachBaseContext方法里面加载其他的dex
```java
public class DemoApp extends Application{
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
MultiDex.install(Context c)分析
Nothing is certain in this life. The only thing i know for sure is that. I love you and my life. That is the only thing i know. have a good day