前言:
之所以命名为《Android热修复、零:android分包64K实践》,因为本文只是为热修复起一个抛砖引玉的铺垫效果。
由于网上关于分包的方式方法较多,此处仅以官方的处理方式稍作实践。
处理方案:
官方的永远是最简单的:
第一步、gradle引入android.support.multidex包。
第二步、将原来项目的application继承自MultiDexApplication。
public class MainApplication extends MultiDexApplication {}
然后就完事了。
本文主要是记录一下验证这一场实践的过程:
查看包内方法数。
ebj1831:22.0.1 user$ ./dexdump -f /Users/user/BeatyYuEducation/beatyyueducation/app/app-release.apk | grep method_ids_size
method_ids_size : 27257
然后我加了这么一个类:
public class SomeFunc {
public void func1() {
}
public void func2() {
}
public void func3() {
}
public void func4() {
}
public void func5() {
}
}
重新打包,重新查看apk内方法数:
ebj1831:22.0.1 user$ ./dexdump -f /Users/user/BeatyYuEducation/beatyyueducation/app/app-release.apk | grep method_ids_size
method_ids_size : 27263
一开始以为只是方法数,但是加了6个,说明应该是类加上方法数的个数。为了验证上述说法:
public class SomeFunc1 {
}
我添加了一个空类,打包,查看apk内方法数:事实证明,加了一个。
ebj1831:22.0.1 user$ ./dexdump -f /Users/user/BeatyYuEducation/beatyyueducation/app/app-release.apk | grep method_ids_size
method_ids_size : 27264
然后我把一些第三方jar包放到lib文件下,虽然并没有引用它们。再次查看包内方法数:
ebj1831:22.0.1 user$ ./dexdump -f /Users/user/BeatyYuEducation/beatyyueducation/app/app-release.apk | grep method_ids_size
method_ids_size : 39694
直接解压后,发现只有一个classes.dex,原来我方法数太少。那么我就通过complie随便添加一堆第三方吧:(为此我操碎了心)
我添加了这么一大堆第三方:后面的我都没有用到。
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile files('libs/android-async-http-1.4.7.jar')
// compile files('libs/android-support-v7-appcompat.jar')
// compile files('libs/android-support-v4.jar')
compile files('libs/volley.jar')
compile files('libs/gson-2.3.1.jar')
compile files('libs/universal-image-loader-1.9.3.jar')
compile files('libs/alipaySdk-20160825.jar')
compile files('libs/libammsdk.jar')
compile files('libs/GetuiSDK2.9.3.0.jar')
compile files('libs/json_simple-1.1.jar')
// compile 'com.android.support:recyclerview-v7:+'
compile project(':library')
//noinspection GradleCompatible
compile 'com.android.support:support-v4:24.0.0'
//noinspection GradleCompatible
compile 'com.android.support:recyclerview-v7:24.0.0'
compile 'com.github.bumptech.glide:glide:3.7.0'
compile 'com.android.support:support-annotations:24.0.0'
compile 'com.android.support:support-v13:24.0.0'
compile 'com.android.support:appcompat-v7:24.0.0'
compile 'com.android.support:support-vector-drawable:24.0.0'
compile 'com.android.support:design:24.0.0'
compile 'com.android.support:gridlayout-v7:24.0.0'
compile 'com.android.support:mediarouter-v7:24.0.0'
compile 'com.android.support:cardview-v7:24.0.0'
compile 'com.android.support:palette-v7:24.0.0'
compile 'com.android.support:leanback-v17:24.0.0'
compile 'com.android.support:recyclerview-v7:24.0.0'
compile 'com.android.support.test:runner:0.5'
compile 'com.android.support.test.espresso:espresso-core:2.2.2'
compile 'com.android.support.test.espresso:espresso-contrib:2.2.2'
compile 'joda-time:joda-time:2.3'
compile 'com.squareup.picasso:picasso:2.3.2'
}
查看一下方法数:发现只能查看最大的dex的方法数。ebj1831:22.0.1 user$ ./dexdump -f /Users/user/BeatyYuEducation/beatyyueducation/app/app-release.apk | grep method_ids_size
method_ids_size : 65201
问我为什么知道的?我分别对分包后的两个包dex文件,查看方法数如下:ebj1831:22.0.1 user$ ./dexdump -f /Users/user/BeatyYuEducation/beatyyueducation/app/aaaaa/classes.dex | grep method_ids_size
method_ids_size : 65201
ebj1831:22.0.1 user$ ./dexdump -f /Users/user/BeatyYuEducation/beatyyueducation/app/aaaaa/classes2.dex | grep method_ids_size
method_ids_size : 3889
成功分包!classes.dex ,classes2.dex。