首页 > 代码库 > android 对代码混淆

android 对代码混淆

上一篇博文已经写了有关apk的翻遍的方法,结果真的令人震惊,自己辛辛苦苦写的代码,结果就这么轻而易举的被别有用心的人给窃取了,哭都没地方哭。面对这个问题我们应该如何是好呢!本片博文告诉大家一个队代码进行混淆的方法。

混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。

混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar 文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。

根据sdk版本的不同,混淆的方法也不同:

低版本的sdk,项目中同时包含 proguard.cfg 和 project.properties 文件,则只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再将项目 Export 即可。这里我就不多说了

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

proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt

上面这句话eclipse是会自动生成的,只是前面会有#来注释掉,你只需把它放开就行了,现在再来export,反编译后的效果如下:

技术分享

有很多的包名和类名都已经被修改了,而且很多包中都是空的了,这样我们的目的就达到了。

有一个问题就是activity和view为什么没被改名呢??让我们来看一下proguard.config=${sdk.dir}\tools\proguard\proguard-android.txt:proguard-project.txt到底是什么意思吧。

找到..\android-sdk-windows\tools\proguard目录你会发现一个proguard-android.txt,打开它就是如下内容:

-optimizationpasses 5                                                           # 指定代码的压缩级别
-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;                                                            # 保持自己定义的类不被混淆

这些设置大部分是不能改动的,否则会造成apk无法运行。

如果你不想混淆某个包只需在proguard-project.txt中添加如下代码就可

-dontwarn com.wangpeng.libs.utills.** 
-keep class com.wangpeng.libs.utills.** { *; }

对于第三方jar的处理

#不混淆第三方jar包中的类
-keep class com.baidu.mapapi.** {*;}
-keep class com.tencent.tauth.** {*;}
-keep class org.apache.http.entity.mime.** {*;}
-keep class android.support.v4.** {*;}
-keep class android.net.http.** {*;}
-keep class com.weibo.sdk.android.** {*;}
-keep class com.sina.sso.** {*;}

#声明第三方jar包,不用管第三方jar包中的.so文件(如果有)
-libraryjars libs/baidumapapi.jar
-libraryjars libs/tencent_openapi.jar
-libraryjars libs/httpmime-4.1.3.jar
-libraryjars libs/weibo.sdk.android.sso.jar
-libraryjars libs/android-support-v4.jar


android 对代码混淆