为了账号安全,请及时绑定邮箱和手机立即绑定

DexGuard、Proguard、Multi-dex提出超出64K方法解决方案

标签:
Android

Proguard与DexGuard是同一团队开发的

I. 区别表

ProguardDexGuard备注
免费收费DexGuard GuardSquare
一般代码混淆代码混淆力度更大 + 资源混淆 + so加壳等-
不需要multi-dex自带multi-dex扫描-

资源混淆?

首先, 所有static final的都会直接预编译,代码中都是资源ID,资源混淆只和 resources.arsc (资源ID、string、路径映射等)、资源路径资源文件名 有关。

资源混淆可能的坑?:

Resources#getIdentifier估计废了,记得白名单。

Proguard也想要资源混淆?:

试试这个: AndResGuard

为啥国内很少用DexGuard?有坑?

  • 付费

  • 国内文档少,而且配置起来会比Proguard复杂一些,细节多些。

  • 由于需要做非常重度的混淆,因此由自带multi-dex,更多细节问题

  • 第三方库用该混淆可能会有难以预料的坑,特别是国内的,基本上保证Proguard没有问题给出文档,Dexguard基本都没有测试过(比如以前使用这个木有关注到umeng既然有些资源采用反射取,官方也没有给明,完全是盲人摸象等)

II. Multi-dex

为啥有这梗

可以先参看: ART、Dalvik

用Dalvik虚拟机的Android手机,在安装app的时候,会有一个优化dex的过程,使用dexopt将dex优化的更加高效于运行存储为odex,但是dexopt把每个类的方法id检索的链表长度使用的short(为了效率?木有考虑到?),无论如何,就导致了如果一个dex中的方法数超过了65535就跪了,so…

以下针对Gradle multi-dex说明

配置

Gradle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
android {

    ...
    defaultConfig {
        ...
        // Enabling multidex support.
        multiDexEnabled true
    }
    ...
}
dependencies {
  compile 'com.android.support:multidex:1.0.0'
}

AndroidManifest.xml:

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.android.multidex.myapplication">
    <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
        ...
    </application>
</manifest>

优化

问题1:

由于multidex配置需要编译系统复杂的处理引用关系来判断哪些需要在主dex,哪些需要在次dex,因此势必会增加日常编译的耗时

解决方法:

可以创建两个variations用于gradle编译,定义在productFlavors,一个定义最低sdk到21(由于ART不再需要运行时加载,并且其在安装时翻译的时候,会处理classes(..N).dex,因此build直接每个module一个dex不用merge不用分主次dex,每次只需要重新计算修改过的modules的dex,省去很多很多时间),一个为发布需要的最低sdk。自己调试的时候,结合选用Debug的Type,在Build Variants中选用devDebug即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
android {
    productFlavors {
        // Define separate dev and prod product flavors.
        dev {
            // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin
            // to pre-dex each module and produce an APK that can be tested on
            // Android Lollipop without time consuming dex merging processes.
            minSdkVersion 21
        }
        prod {
            // The actual minSdkVersion for the application.
            minSdkVersion 14
        }
    }
          ...
}
问题2:

由于Dalvik运行时加载dex,如果dex多而且大,在启动应用的时候加载其余dex的时可能会出现ANR,甚至在Android 4.0(API 14)以前的机器无法运行。

解决方法:

Gradle配置

1
2
3
4
5
6
7
8
9
10
android {
    buildTypes{
        release {
            minifyEnabled true // 混淆时删除无用代码
            shrinkResources true // 删除混淆是标注的无用资源(res/)
            ...
        }
    ...
    }
}

以上两个参数,有效删除无用代码与无用资源,减小包大小。如果需要支持4.0以前的机器,做好测试工作。如果是4.0以上的机器,可以考虑再AndroidManifest中配置largeHeap=true,一般来说java heap可以扩容到50%以上,具体看不同机器的配置(/system/build.prop)。

原文链接:http://www.apkbus.com/blog-705730-60945.html

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消