代码混淆的主要目的是通过重命名类、方法和字段的名称,使代码难以被反编译和理解,从而保护代码的安全性。
代码示例如下:
# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
#指定代码的压缩级别
-optimizationpasses 5
-allowaccessmodification
# 优化 不优化输入的类文件
-dontoptimize
# 预校验
-dontpreverify
# 包名不混合大小写
-dontusemixedcaseclassnames
# 混淆时是否记录日志
-verbose
# 保护注解
-keepattributes *Annotation*
-keepattributes Signature # 避免混淆泛型, 这在JSON实体映射时非常重要
# 忽略警告
-ignorewarnings
-printconfiguration build/intermediates/proguard-files/full-r8-config.txt
-keep public class * extends android.app.Activity
-keep public class * extends androidx.fragment.app.Fragment
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep class androidx.** {*;}
-keep class android.** {*;}
-keep class kotlin.** {*;}
-keep class kotlinx.** {*;}
-keep class com.android.** {*;}
-keep class com.sun.** {*;}
-keep class org.apache.** {*;}
-keep class org.json.** {*;}
以下是对该配置文件的详细解释:
1. 优化规则
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
- -optimizations:指定混淆和优化时所采用的算法。这里禁用了特定的优化算法,如算术简化、类型转换简化、字段优化和类合并。
-optimizationpasses 5
- -optimizationpasses:指定优化的级别和次数。
5表示优化将进行 5 次,这通常用于压缩代码和提高运行时性能。
-allowaccessmodification
- -allowaccessmodification:允许 ProGuard 修改访问修饰符(例如从
private到public),以便进行更好的优化。
-dontoptimize
- -dontoptimize:禁用优化。如果你不希望进行任何代码优化,可以使用此指令。
2. 预校验、类名处理和日志
-dontpreverify
- -dontpreverify:禁用字节码的预校验。预校验是对代码进行字节码校验的过程,禁用它可以减少一些设备上的兼容性问题。
-dontusemixedcaseclassnames
- -dontusemixedcaseclassnames:混淆时不使用混合大小写的类名。防止生成难以识别的类名。
-verbose
- -verbose:启用详细的日志输出,以便了解混淆过程的详细信息。
3. 保留特定的属性和注解
-keepattributes *Annotation*
-keepattributes Signature
- -keepattributes:保留指定的属性,这里保留了所有注解和泛型签名属性。保留这些属性对反射或序列化时保留泛型信息非常重要,特别是对于 JSON 映射。
4. 忽略警告
-ignorewarnings
- -ignorewarnings:忽略混淆过程中产生的警告。通常在不希望这些警告影响构建时使用。
5. 配置输出
-printconfiguration build/intermediates/proguard-files/full-r8-config.txt
- -printconfiguration:将最终使用的 ProGuard 配置输出到指定文件中。这样可以查看最终应用的混淆规则。
6. 保留特定的类
-keep public class * extends android.app.Activity
-keep public class * extends androidx.fragment.app.Fragment
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
- -keep:保留特定类和成员,避免它们被混淆。这里保留了
Activity、Fragment、Application、Service、BroadcastReceiver、ContentProvider等常用类,这些类通常需要保留它们的原始名称,以便在 Android 系统中正确工作。
-keep class androidx.** {*;}
-keep class android.** {*;}
-keep class kotlin.** {*;}
-keep class kotlinx.** {*;}
-keep class com.android.** {*;}
-keep class com.sun.** {*;}
-keep class org.apache.** {*;}
-keep class org.json.** {*;}
- -keep class:保留特定包名下的所有类及其成员。这些包名通常是一些重要的库(如 AndroidX、Kotlin 标准库等),它们的名称不能被混淆,以保证正常运行。
总结
这段 ProGuard/R8 配置文件的主要作用是配置代码混淆和优化的规则,确保在进行代码混淆时,某些关键的类和库能够保留其名称,以确保应用程序在运行时不会因为名称的改变而导致崩溃或功能失效。同时,通过优化配置和日志记录,帮助开发者控制混淆过程的行为和结果。