Android混淆——混淆语法及问题

本文介绍了Android代码混淆的重要性和作用,包括保护APK免受逆向工程攻击和减小体积。详细讲解了如何开启混淆,如在build.gradle文件中设置混淆规则,并探讨了混淆语法,如类名、内容、特定内容、类成员的混淆处理。同时,提出了组件化混淆的最佳实践,建议在每个module单独配置混淆规则,以避免冗余和管理复杂性。最后,针对混淆中可能遇到的问题,如第三方框架和反射类的混淆处理,给出了相应的解决策略。
摘要由CSDN通过智能技术生成

一、简介

代码混淆(Obfuscated code)是将程序中的代码以某种规则转换为难以阅读和理解的代码的一种行为。

1.优点

令 APK 难以被逆向工程,即很大程度上增加反编译的成本。此外,Android 当中的"混淆"还能够在打包时移除无用资源,显著减少 APK 体积。

2.建议

发布一款应用除了设minifyEnabled为ture,你也应该设置zipAlignEnabled为true,像Google Play强制要求开发者上传的应用必须是经过zipAlign的,zipAlign可以让安装包中的资源按4字节对齐,这样可以减少应用在运行时的内存消耗。

二、启动混淆

通过工程下的build.gradle文件中的开启混淆开关和配置混淆规则文件

buildTypes {
   
        release {
   
            //不显示log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //开启混淆
            minifyEnabled true
            //开启资源压缩
            shrinkResources true
            //Zipalign优化
            zipAlignEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
}
  • shrinkResources:资源压缩
  • zipAlignEnabled:Zipalign优化
  • minifyEnabled:混淆开关
  • proguard-android.txt:SDK中默认proguard的配置规则
  • proguard-rules.pro:自定义proguard的配置规则

三、混淆语法

1.类名

对类名进行keep操作只是将类名keep住,但方法和变量仍然会被混淆

# 一颗星表示keep当前本包下的类名,子包下的类名是会被混淆的
-keep class com.example.hensen.*
# 两颗星表示keep当前本包下的类名和子包下的类名
-keep class com.example.hensen.**
# 表示keep当前类名
-keep class com.example.hensen.net.NetWorkCache
# 表示keep当前类的内部类的类名
-keep class com.example.hensen.net.NetWorkCache$NetWorkBean

2.内容

对内容进行keep操作不仅可以将类名keep住,还可以对方法和变量keep住

# 一颗星表示keep当前本包下的类名、类的内容
-keep class com.example.hensen.*{
   *;}
# 两颗星表示keep当前本包下的类名、类的内容和子包下的类名、类的内容
-keep class com.example.hensen.**{
   *;}
# 表示keep当前类名、类的内容
-keep class com.example.hensen.net.NetWorkCache{
   *;}
# 表示keep当前类的内部类的类名、内部类的内容
-keep class com.example.hensen.net.NetWorkCache$NetWorkBean{
   *;}

3.特定内容

对特定的内容进行keep操作

-keep class com.example.hensen.net.NetWorkCache{
   
    <init>;# 匹配所有构造器
    <fields>;# 匹配所有变量
    <methods>;# 匹配所有方法

    public <methods>;# 匹配所有共有的方法
    private <methods>;# 匹配所有私有的方法
    public *;# 匹配所有共有的内容
    private *;# 匹配所有私有的内容
    public <init>(java.lang.String);# 匹配特定参数的构造函数
    public void getCache(...);# 匹配任意长度类型参数的方法
}

4.类成员

对类名不需要keep,只需要对类下的方法进行keep操作

# 表示keep特定类下的特定参数的方法,但类名不会被keep
-keepclassmembernames class com.example.hensen.net.NetWorkCache{
   
    public void getCache(java.lang.String);
}

5.类和类成员

作用范围 防止被移出或重命名 防止被重命名
类和类成员 -keep -keepnames
仅类成员 -keepclassmembers -keepclassmembernames
类和类成员(前提是成员都存在) -keepclasseswithmembers -keepclasseswithmembernames

四、混淆通用规则

#############################################
#
# 基本指令区域(没什么别的需求不需要动)
#
#############################################
# 代码混淆压缩比,在0~7之间,默认为5,一般不做修改
-optimizationpasses 5

# 混合时不使用大小写混合,混合后的类名为小写
-dontusemixedcaseclassnames

# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses

# 这句话能够使我们的项目混淆后产生映射文件
#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值