如何自定义dex内最大方法数

**

如何自定义dex内最大方法数

**

分包的需求

公司最近要求使用“梆梆加固”,但是很奇怪的提示加固失败。问了一圈安全部的同事后得知dex文件超过了65300。。。直接黑人问号脸,不是都是65535么?咋这个加固要求和别人不一样?算了算了,公司要求,我照做呗。

找方法

由于本来公司安装包就很大,直接使用了谷歌推荐的multiDex来解决。所以当安全部同事反馈方法数超过的时候很奇怪,咱不是做了分包嘛!还是先检查一下dex内方法数吧!
相比自定义dex最大方法数,检查现有dex方法数网上还是比较多的,参考一下android检测apk及dex方法数方法,成功检查出classes.dex方法数超过了
在这里插入图片描述
现在明确知道dex内方法数多少,接下来就是如何定义最大方法数了。
本来嘛,咱们都知道,方法数超过65535的时候,只需要
1、multiDexEnabled置为true
2、引入compile ‘com.android.support:multidex:1.0.0’,这个主要是为了加载dex使用,因为应用默认只会加载主dex,所以其他的dex需要我们自己来加载。
3、分包就ojbk了。
但是·····这只能限制dex文件内方法数少于65535,偏偏用的加固软件必须得少于63000.纠结。。。不过,在对比网上现有分包方法后,发现要么是用脚本,要么是用各种繁琐的方法,有没有一种很简单很easy的呢?

这时候突然想到了,as打包实际上是使用gradle来帮助操作的,那么····我找找gradle相关设置或者代码是不是就能解决了???

在这里插入图片描述
233333333机智如我啊!利用这样的设置,直接在主module的gradle中的android段添加

dexOptions {
        incremental true
        javaMaxHeapSize "4g"
        preDexLibraries = false
        additionalParameters = [//dex参数详见 dx --help
                                '--multi-dex',//多分包
                                '--set-max-idx-number=60000',//每个包内方法数上限
//                                '--main-dex-list='+projectDir+'/castielmaindexlist.txt',//打包进主classes.dex的文件列表
                                '--minimal-main-dex'//使上一句生效
        ]
    }

那么就可以直接将dex内方法数限制在60000以下。emmm,又简单又方便,就是总感觉自己是在偷懒,不过,越高效的代码实际上就越让人偷懒嘛!


不过,切记啊!如果你需要使用as直接将应用安装到手机上时,咱们必须得将这段给注释了,不然会提示各种稀奇古怪的错误。emmm,还是有必要继续研究研究gradle的

preDexLibraries = false
        additionalParameters = [//dex参数详见 dx --help
                                '--multi-dex',//多分包
                                '--set-max-idx-number=60000',//每个包内方法数上限
//                                '--main-dex-list='+projectDir+'/castielmaindexlist.txt',//打包进主classes.dex的文件列表
                                '--minimal-main-dex'//使上一句生效
        ]

/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
关于64 k引用限制 Android应用程序(APK)在Dalvik可执行文件的形式包含可执行的字节码文件(DEX)文件,其中包含已编译的代码来运行你的应用程序。Dalvik可执行规格限制一个Dex文件包含65536个方法:包括Android框架方法、Library方法的总、和你自己的代码方法。因为65536等于64×1024,这一限制被称为“64k引用限制”。 这个极限就要求我们配置应用程序的构建过程,需要生成多个DEX文件,所以称为multidex 配置。 分析原因与注意事项 解决方法分Android 5.0及以上系统和5.0以下系统怎么做。客官们不要着急,先看我一个个分析原因,毕竟我要装下逼哈哈。 一、Android 5.0以下的版本 Android 5.0(API leve 21)之前的系统使用Dalvik执行应用程序代码。默认情况下,Dalvik限制一个apk只有一个Dex文件。为了绕过这个限制, 我们可以使用multidex support library,它成为我们APK的主要DEX文件的一部分,负责管理我们APK访问其他DEX文件和代码。 注意: 如果咱的项目minSdkVersion是20或更低,运行到Android 4.4(API leve 20)或者更低版本的设备上时需要禁用AndroidStudio的即时运行 二、Android 5.0和更高版本 Android 5.0(API leve 21)和更高的系统使用runtime是ART ,原生支持从应用的apk文件加载多个DEX文件。ART在安装应用时预编译应用程序,会扫描多个classes(..N).dex文件编译成一个.oat的文件。更多Android5.0 runtime的更多信息,请参见即时运行-instant-run。 注意: 如果你使用即时运行 , AndroidStudio自动配置你的应用程序,你应用程序的minSdkVersion应该设置为21或更高。因为即时只工作在你APP的Debug版本,你任然需要配置你的release版本构建时用multidex避免64k的限制。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值