Android代码混淆打包_Android如何配置代码混淆
什么是代码混淆
由于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