Android混淆

APK混淆技术详解及配置
本文详细介绍了APK混淆的目的、过程以及如何通过proguard文件进行配置,以减小APK文件体积并提高逆向工程难度。主要内容包括混淆原理、配置文件使用、配置参数解释及常见混淆规则。

混淆通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。结果是一个比较小的.apk文件,该文件比较难进行逆向工程。

某些情况下,proguard文件的缺省配置可以满足需求了。但是,对于混淆器来说,大多数情况做出正确的分析是困难的,并且它或许会删除在它看来是无用的,但对于程序来说却确实需要的代码。

注意:jar包现在基本上是无法混淆的,用工具就可以直接看到你的jar包的源码。所以这里的混淆是针对apk混淆

低版本 SDK 下,项目中同时包含 proguard.cfg 和 project.properties 文件,则只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再将项目 Export 即可。

 高版本 SDK 下,项目中同时包含 proguard-project.txt 和 project.properties 文件,这时需要在 proguard-project.txt 文件中进行如下信息的配置,然后再将项目 Export 即可。

在Android的SDK低版本中,混淆配置文件是proguard.cfg。在新版SDK中(例如4.0以上版本)用的是proguard-project.txt。用法和配置都是一样的。现在以高版本为例简要说明下配置文件:

# This file is automatically generated by Android Tools. # Do not modify this file -- YOUR CHANGES WILL BE ERASED! # # This file must be checked in Version Control Systems. # # To customize properties used by the Ant build system edit # "ant.properties", and override values to adapt the script to your # project structure. # # To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home): #proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt # Project target. target=android-19

将proguard-project.txt里的#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt前的#去掉。

这样就开启了混淆工作。当然如果你的APK签名导出了的话,Android会默认给你混淆一下。

默认的混淆配置文件是这样的:

# To enable ProGuard in your project, edit project.properties # to define the proguard.config property as described in that file. # # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in ${sdk.dir}/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the ProGuard # include property in project.properties. # # For more details, see #   http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { #   public *; #}

#代表已经注释掉了这一样,去掉#号就是取消注释这一行。

-keep这个参数是表示哪些类不被混淆

下面大概说下配置含义:(部分前缀dont代表don’t)

-optimizationpasses 5   设置混淆的压缩比率 0 ~ 7    # 指定代码的压缩级别
-dontwarn  包名.**  --------告诉ProGuard不要警告找不到包名.**这个包里面的类的相关引用
-dontusemixedcaseclassnames    #是否使用大小写混合
-dontskipnonpubliclibraryclasses   # 是否混淆第三方jar
-dontpreverify     # 混淆时是否做预校验
-verbose     # 混淆时是否记录日志
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法

-keep public class * extends android.app.Activity                        # 保持哪些类不被混淆
-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 public class * extends android.app.backup.BackupAgentHelper        # 保持哪些类不被混淆
-keep public class * extends android.preference.Preference               # 保持哪些类不被混淆
-keep public class com.android.vending.licensing.ILicensingService       # 保持哪些类不被混淆

-keepclasseswithmembernames class * {                               # 保持 native 方法不被混淆
    native <methods>;
}

-keepclasseswithmembers class * {                                   # 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {                                   # 保持自定义控件类不被混淆
    public <init>(android.content.Context, android.util.AttributeSet, int);      
}

-keepclassmembers class * extends android.app.Activity {            # 保持自定义控件类不被混淆
   public void *(android.view.View);
}

-keepclassmembers enum * {                                          # 保持枚举 enum 类不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {                    # 保持 Parcelable 不被混淆
  public static final android.os.Parcelable$Creator *;
}

-keep class MyClass;                                                # 保持自己定义的类不被混淆
-keep class **.R$* {   *;  }//过滤R文件的混淆 -keep class packagename.** {*;}//过滤第三方包的混淆(其中packagename为第三方包的包名)
-injars libs\your_library.jar  //表示你要混淆的jar文件

-outjars libs\your_library_out.jar  //是混淆后的jar文件名
Android 开发中,代码混淆是保护应用安全、减小 APK 体积的重要手段。ProGuard 是 Android 官方早期提供的代码混淆工具,它通过对类名、方法名和字段名进行重命名,降低代码的可读性,并通过优化字节码提升性能[^2]。 ### 启用 ProGuard 混淆Android 项目中启用 ProGuard 非常简单,只需在模块级的 `build.gradle` 文件中配置 `minifyEnabled` 和 `proguardFiles` 即可: ```gradle android { buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } } ``` - `minifyEnabled true` 表示启用代码混淆。 - `proguardFiles` 指定使用的 ProGuard 配置文件,通常包括系统默认的优化规则和自定义规则文件 `proguard-rules.pro`[^4]。 ### 编写 ProGuard 混淆规则 ProGuard 的核心在于编写合适的混淆规则。规则文件通常位于模块根目录下的 `proguard-rules.pro` 文件中。 #### 常用规则示例: ```proguard # 保留所有 Activity 类不被混淆 -keep public class * extends android.app.Activity # 保留所有 Application 类不被混淆 -keep public class * extends android.app.Application # 保留 Parcelable 实现类及其构造方法 -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # 保留所有使用了注解的类成员 -keepclassmembers class * { @android.webkit.JavascriptInterface <methods>; } # 保留枚举类 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } ``` 这些规则确保关键的 Android 组件和功能在混淆过程中不会被错误地移除或重命名[^1]。 ### 查看混淆日志与调试 构建混淆后的 APK 后,可以通过 `mapping.txt` 文件来查看混淆前后类名、方法名和字段名的映射关系。该文件通常位于 `app/build/outputs/mapping/release/` 目录下。 如果应用在运行时出现异常,可以通过 `retrace` 工具将混淆后的堆栈信息还原为原始类名和方法名: ```bash retrace.sh -verbose mapping.txt obfuscated_stack_trace.txt ``` 这有助于定位混淆导致的运行时错误[^1]。 ### 常见问题与解决方法 - **类或方法被错误移除**:使用 `-keep` 指令保留关键类或方法。 - **资源引用错误**:某些资源类(如 `R` 类)应保留不被混淆。 - **第三方库未正确处理**:为第三方库添加特定的 ProGuard 规则,通常可以在库的文档中找到。 - **启动崩溃或功能异常**:检查是否遗漏了对反射调用、JNI 接口或动态加载类的保留规则。 ### 优化建议 - 在启用混淆的同时,建议开启资源压缩和未用资源移除功能,以进一步减小 APK 体积: ```gradle android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles ... } } } ``` - 使用 `proguard-android-optimize.txt` 而非 `proguard-android.txt` 可启用更高级的优化策略,提升应用性能[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值