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

android dex文件超出限制个数分包方案

2016-05-16 15:44 387 查看
主要说明在使用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

计算方式为   所有类 +( 所有定义的函数  + 调用的函数  - 重复的)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android