最簡單的dex demo
from http://blog.csdn.net/u013478336/article/details/50734108
demo實現(xiàn)的目標是app加載另外一個dex里面的代碼顯示一個Toast
- 先來生成一個可以彈包含彈Toast的dex
-
新建一個module烘挫,創(chuàng)建一個接口用來彈Toast狸涌,再創(chuàng)建一個實現(xiàn)類
-
將這個module編譯成jar文件(直接編譯就可以了最后會在下面的目錄生成jar)
編譯生成的jar的位置 -
將這個jar轉化成包含dex的jar(使用到的是build-tool下面的dx命令
dx命令以及簡單說明 -
將生成的output.jar放到sdcard下面去(好讓其他程序加載)
adb命令 -
新建一個android工程加載剛才生成的dex并且調用里面的實現(xiàn)類的方法
關鍵代碼- 簡單說明這里使用的是反射肴茄,還有就是這里需要接口的簽名纽甘,所以新建的工程需要添加一個和dex里面簽名一樣的接口定義
-
講講Google的分包方案 multiDex
網(wǎng)上相關的資料比較多這里所說兩種情況
- 自動的分包,簡單的配置(當方法超過65K的時候才會出現(xiàn)分包)
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)
- 現(xiàn)在已經有了多個dex了,可是問題又來了,5.0以上安裝的時候會掃描apk里面的dex文件將他們合并烛恤,5.0之前則只會加載classes.dex(所以現(xiàn)在需要一個方案來加載多個dex,否則可能會出現(xiàn)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