Android混淆

混淆通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。结果是一个比较小的.apk文件,该文件比较难进行逆向工程。

某些情况下,proguard文件的缺省配置可以满足需求了。但是,对于混淆器来说,大多数情况做出正确的分析是困难的,并且它或许会删除在它看来是无用的,但对于程序来说却确实需要的代码。

注意:jar包现在基本上是无法混淆的,用工具就可以直接看到你的jar包的源码。所以这里的混淆是针对apk混淆

低版本 SDK 下,项目中同时包含 proguard.cfg 和 project.properties 文件,则只需在 project.properties 文件末尾添加 proguard.config=proguard.cfg 再将项目 Export 即可。

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

在Android的SDK低版本中,混淆配置文件是proguard.cfg。在新版SDK中(例如4.0以上版本)用的是proguard-project.txt。用法和配置都是一样的。现在以高版本为例简要说明下配置文件:

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

将proguard-project.txt里的#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt前的#去掉。

这样就开启了混淆工作。当然如果你的APK签名导出了的话,Android会默认给你混淆一下。

默认的混淆配置文件是这样的:

 
 
# To enable ProGuard in your project, edit project.properties # to define the proguard.config property as described in that file. # # Add project specific ProGuard rules here. # By default, the flags in this file are appended to flags specified # in ${sdk.dir}/tools/proguard/proguard-android.txt # You can edit the include path and order by changing the ProGuard # include property in project.properties. # # For more details, see #   http://developer.android.com/guide/developing/tools/proguard.html # Add any project specific keep options here: # If your project uses WebView with JS, uncomment the following # and specify the fully qualified class name to the JavaScript interface # class: #-keepclassmembers class fqcn.of.javascript.interface.for.webview { #   public *; #}

#代表已经注释掉了这一样,去掉#号就是取消注释这一行。

-keep这个参数是表示哪些类不被混淆

下面大概说下配置含义:(部分前缀dont代表don’t)

-optimizationpasses 5   设置混淆的压缩比率 0 ~ 7    # 指定代码的压缩级别
-dontwarn  包名.**  --------告诉ProGuard不要警告找不到包名.**这个包里面的类的相关引用
-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;                                                # 保持自己定义的类不被混淆
-keep class **.R$* {   *;  }//过滤R文件的混淆 -keep class packagename.** {*;}//过滤第三方包的混淆(其中packagename为第三方包的包名)
-injars libs\your_library.jar  //表示你要混淆的jar文件

-outjars libs\your_library_out.jar  //是混淆后的jar文件名
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值