«

App安全之代码混淆

时间:2024-3-2 17:45     作者:韩俊     分类: Android


参考:

http://www.cnblogs.com/sunzn/archive/2013/03/06/2946952.html

http://www.apkbus.com/android-240707-1-1.html


1、在项目根目录找到project.properties文件,将下图中圈出来的代码注释去除,即申明我们的混淆文件为proguard-project.txt


2、在项目根目录找到proguard-project.txt文件,按需求添加修改以下代码:

# 指定代码的压缩级别
-optimizationpasses 5
# 不使用大小写混合
-dontusemixedcaseclassnames
# 不混淆第三方jar                                          
-dontskipnonpubliclibraryclasses
# 混淆时不做预校验
-dontpreverify
# 混淆时记录日志
#-verbose
# 混淆时所采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

# 申明外部jar包不被混淆
-libraryjars libs/alipay.jar
-libraryjars libs/httpmime-4.1.1.jar
-libraryjars libs/ShareSDK-Core-2.4.2.jar
-libraryjars libs/ShareSDK-QZone-2.4.2.jar
-libraryjars libs/ShareSDK-SinaWeibo-2.4.2.jar
-libraryjars libs/ShareSDK-Wechat-2.4.2.jar
-libraryjars libs/ShareSDK-Wechat-Core-2.4.2.jar
-libraryjars libs/ShareSDK-Wechat-Moments-2.4.2.jar

# 不需要混淆的部分,如系统组件和API的类:
-keep public class * extends android.app.Fragment  
-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 * extends android.support.v4.**

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

# 缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类
# 没有正确引用。如果不配置的话,系统就会报错
-dontwarn android.support.**
-dontwarn com.amap.api.**

# 指定的类成员被保留
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}

# 指定的类和类成员被保留,假如指定的类成员存在的话
-keepclasseswithmembers class * { 
public <init>(android.content.Context, android.util.AttributeSet);
}

# 保持自定义控件类不被混淆
-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);
}

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

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

# 保持自己定义的类不被混淆
-keep class MyClass

3、上面注释说的挺详细的,但重要的是以下几点:

(1) 这里申明的jar包只能是本项目中引用的,项目引用的其他工程中的jar包,无需在此混淆文件中申明:

# 申明外部jar包不被混淆
-libraryjars libs/alipay.jar
(2)以下申明需要根据自己项目中引用的jar包去添加,例如我就是先不添加,直接导出apk文件,这时在Console中我们可以看到报错信息,再逐一添加报错的类路径,例如com.amap.api.**就是申明com.amap.api.xxx都不会被混淆:
# 缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类
# 没有正确引用。如果不配置的话,系统就会报错
-dontwarn android.support.**
-dontwarn com.alibaba.fastjson.**
-dontwarn org.eclipse.persistence.**
-dontwarn com.amap.api.**
-dontwarn javax.persistence.**


4、最后,是混淆后反编译看到的结果,其中的类名、方法名、变量名,都自动混淆成别人看不明白的名称:


标签: android

热门推荐