欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

Android代码混淆打包_Android如何配置代码混淆

程序员文章站 2022-03-01 14:08:08
...

什么是代码混淆

由于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