android studio代码混淆

代码混淆能提升Android应用的安全性和体积优化,但也可能导致功能异常。本文介绍了如何开启混淆,修改`build.gradle`,配置`proguard-rules.pro`文件,并详细讲解了混淆规则的语法和各种保留策略,包括基本组件、Support包、本地方法、WebView、注解、泛型、反射、内部类、网络层、数据模型和XML映射等问题的处理。同时,分享了混淆规则编写方法和处理混淆错误的策略。
摘要由CSDN通过智能技术生成

为什么需要代码混淆呢?原因很简单,你的apk很容易被反编译出来,你写的代码都会被看到,因此我们需要在编译过程中对代码进行一定程度的混淆,使得别人不能反编译不出你的代码。

代码混淆的好处:

  • 代码混淆后阅读性降低,反编译后破译程序难度提高
  • 混淆后字节数减少,减少了应用了体积

混淆的缺点:

  • 混淆后,测试不充分可能导致某些功能不能使用

1、开启混淆

    新建一个项目,Android Studio默认关闭代码混淆开关,在build.gradle文件中,如下图所示的minifyEnabled 开关,因此如果需要混淆代码,需将false改为true,然后在文件proguard-rules.pro添加具体混淆规则。

其中build.gradle中

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

其中

minifyEnabled false

表示不开启混淆,可以改为

minifyEnabled true

开启混淆,开启混淆后可以添加一句:

shrinkResources true

表示去掉没有引用的资源,可以减少应用的体积,但这个只有在混淆开启后才有效。
2、混淆规则文件

可以从上述的代码看出,Android自带一个混淆规则文件:

proguard-android.txt

这个文件在SDK目录下,里面有一些默认自带的规则,而我们今天需要配置的自定义配置的文件,即上面所述的

proguard-rules.pro

3、混淆规则基本语法

混淆文件采用白名单法,意思是不在白名单里面的都要混淆。
混淆规则的基本符号:

# 代表行注释符
- 表示一条规则的开始

一般规则用连起来单词表示,主要有:
keep 保留,例如keepattributes:表示保留属性
dont 不要,例如dontwarn:表示不要提示警告
ignore 忽略,例如ignorewarning:表示忽略警告

混淆配置文件不检查规则是否重复,如果两条规则冲突,则采用白名单的,比如设置了开启优化和不优化两个选项后,无论顺序,最终都会执行不优化的操作。
4、优化控制
这个是用于控制混淆是否开启优化代码,例如一些if/else语句可以被简化等这些操作
不优化
-dontoptimize

代码循环优化次数,0-7,默认为5
-optimizationpasses 5
值得注意的是默认混淆配置文件开启了-dontoptimize。
5、优化进阶

开启优化后可以设置下面的规则,assumenosideeffects表示指定的代码无效,可以优化,最终效果表现为不执行。

混淆时所采用的优化规则

  -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

关闭log
-assumenosideeffects class android.util.Log {
public static boolean isLoggable(java.lang.String, int);
public static int v(…);
public static int i(…);
public static int w(…);
public static int d(…);
public static int e(…);
}
6、基本混淆规则

下面这些一般混淆规则都要加入,其中前两个在默认文件中已经配置:

# 包名不使用大小写混合 aA Aa
-dontusemixedcaseclassnames

# 不混淆第三方引用的库
-dontskipnonpubliclibraryclasses

# 不做预校验
-dontpreverify

# 忽略警告
-ignorewarning
7、输出混淆记录

     混淆后由于阅读困难性提高,所以为了方便自己查阅,可以输出mapping对应文件,可以利用AndroidSDK\tools\proguard\bin中的proguardgui.bat打开混淆工具,利用retrace结合mapping和stacktrace调试遇到的错误

# 混淆后生产映射文件 map 类名->转化后类名的映射
# 存放在app\build\outputs\mapping\release中
-verbose

# 混淆前后的映射
-printmapping mapping.txt

# apk 包内所有 class 的内部结构
-dump class_files.txt

# 未混淆的类和成员
-printseeds seeds.txt

# 列出从 apk 中删除的代码
-printusage unused.txt
8、保留源代码行号

即使使用retrace工具,还是很难定位到错误的时候,可以暂时先保留行号,观察错误修改后再关闭掉

# 抛出异常时保留代码行号
# 这个最后release的时候关闭
-keepattributes SourceFile,LineNumberTable

9、基本组件白名单

Android中的基本组件不能混淆,为了方便,下面提供了兼容性比较高的规则:

-keep public class * extends android.app.Fragment
-keep public 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值