Android 中代码混淆一般使用 ProGuard。除了混淆代码之外,它还有许多实用的功能。本文主要记录与混淆相关的实现。
1. ProGuard 的作用
ProGuard 可以删除无用代码、压缩和优化 Class 文件,从而缩小 APK 的体积;同时提高逆向门槛,保护代码安全。
2. ProGuard 的使用
在 Android 2.3 之前,混淆代码需要手动添加 proguard 来实现代码混淆。而从 Android 2.3 开始,Google 将 ProGuard 加入了 SDK(SDK\tools\proguard)。当创建工程时,在工程的根目录下会自动生成 project.properties、proguard-project.txt(旧版本为 proguard.cfg),然后在 Eclipse 工程中可以直接使用 ProGuard 混淆工程。启用混淆只需要简单的两步:
老版本:
1) 在 project.properties 中添加“proguard.config=proguard.cfg”
2) 在 proguard.cfg 中添加混淆和过滤的规则
新版本:
1) 解除 project.properties 文件中的“#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的注释
2) 在 proguard-project.txt 中添加混淆和过滤的规则
对于 Android Studio,可以按照以下步骤使用 ProGuard:
1) 引用 ProGuard 配置文件
2) 在“proguard-android.txt”中添加过滤规则
关于 ProGuard 过滤规则的配置,可以使用以下参数:
- include {filename}:从给定的文件中读取配置参数
- basedirectory {directoryname}:指定基础目录为以后相对的档案名称
- injars {class_path}:指定要处理的应用程序 jar、war、ear 和目录
- outjars {class_path}:指定处理完后要输出的 jar、war、ear 和目录的名称
- libraryjars {classpath}:指定要处理的应用程序 jar、war、ear 和目录所需要的程序库文件
- dontskipnonpubliclibraryclasses:指定不去忽略非公共的库类。
在Java中,我们可以使用`-dontskipnonpubliclibraryclassmembers`选项来指定不忽略包可见的库类成员。这意味着即使一个类是公共的(public),但它属于一个包可见的库(package-private),那么这个类的成员也不会被跳过。
例如,假设我们有一个名为`com.example.library`的包,其中包含一个名为`LibraryClass`的非公共(package-private)类。在编译时,我们可以使用以下命令来确保`LibraryClass`的成员不会被忽略:
```java
javac -dontskipnonpubliclibraryclassmembers com/example/library/LibraryClass.java
```
这将告诉编译器不要跳过`LibraryClass`中的任何成员,包括私有(private)和受保护(protected)成员。这样,我们就可以在其他类中访问这些成员,而不仅仅是公共(public)成员。