主要说明在使用apktool打包的时候遇到超过个数限制的时候怎么处理。
解决需要在已经完成的apk内增加smali文件导致的超出。
根据谷歌要求dex内函数个数不应超过65k,如果超出可以分成多个dex 文件
谷歌提供android-support-multidex.jar 支持加载多个dex文件。
使用方法:
你的工程中已经含有Application类,那么让它继承android.support.multidex.MultiDexApplication类,
如果你的Application已经继承了其他类并且不想做改动,那么还有另外一种使用方式,覆写attachBaseContext()方法:
public class MyApplication extends FooApplication {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}
apktool 支持打多个dex文件。
注意事项: 分smail 时 第二个应该是从smail_classes2 开始命名
关于函数个数官方说明是 引用的函数个数(不重复的)
个人稍微总结了下函数个数计算方式:
定义的类算一次计量 ,
定义的函数算一次计量,(被调用不在增加计量)
函数被重载一次增加一个函数计量,
子类继承父类接口 增加一次计量
调用系统接口一个算一次。 (重复调用不增加计量)
smail文件格式内函数计算
.class 为类名 格式为:.class public Lcom/test/test_class;
.method 为定义函数 格式为:.method public constructor <init>()V
invoke- 为调用函数 格式为: Lcom/test/test_class;-><init>()V
逐行检测,统一函数保存格式:
.class 转译为: Lcom/test/test_class;
.method 转译为 包名+“->”+函数名+字段类型+返回格式
列入 .method public constructor <init>()V
转译为: Lcom/test/test_class;-><init>()V
invoke- 直接保留 Lcom/test/test_class;-><init>()V
计算方式为 所有类 +( 所有定义的函数 + 调用的函数 - 重复的)