Android代码混淆打包_Android如何配置代码混淆
2015-06-30 15:13:58  By: dwtedx

什么是代码混淆

由于Java是一种跨平台的、解释型语言、Java源代码编译成中间”字节码”存储于class文件中、由于跨平台的需要、Java 字节码中包括了很多源代码信息、如变量名、方法名、并且通过这些名称来访问变量和方法、这些符号带有许多语义信息、很容易被反编译成 Java 源代码、为了防止这种现象、我们可以使用 Java 混淆器对 Java 字节码进行混淆

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

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


Android代码混淆的步骤

1、在开始之前、你需要做的就是在project.properties文件中加上你的混淆文件申明了、去掉proguard.config前面的“#”号


# 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-22


2、指定代码混淆的方式

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


# 保持 native 方法不被混淆
-keepclasseswithmembernames class * {                                           
    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);
}

# 保持枚举 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、把所有你的jar包都申明进来

-libraryjars libs/apns_1.0.6.jar
-libraryjars libs/armeabi/libBaiduMapSDK_v2_3_1.so
-libraryjars libs/armeabi/liblocSDK4.so
-libraryjars libs/baidumapapi_v2_3_1.jar
-libraryjars libs/core.jar
-libraryjars libs/gesture-imageview.jar
-libraryjars libs/gson-2.0.jar
-libraryjars libs/infogracesound.jar
-libraryjars libs/locSDK_4.0.jar
-libraryjars libs/ormlite-android-4.48.jar
-libraryjars libs/ormlite-core-4.48.jar
-libraryjars libs/universal-image-loader-1.9.0.jar


4、保持哪些类不被混淆

-keep class android.net.http.SslError
-keep class android.webkit.**{*;}

-keep class android.support.v4.** { *; }  
-keep class com.baidu.** { *; }

-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 com.android.vending.licensing.ILicensingService
-keep public class * extends android.support.v4.**


5、最后一步、打签名包测试、如果有问题、仔细看下Log也许有得类不能混淆、以上就是混淆代码的全过程了


最后给贴上Demo的源代码、希望对大家有用、有兴趣的哥们可以下载看看

源代码下载链接: http://dwtedx.com/download.html?bdkey=s/1hq0C2DQ 密码: d76e

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+