您的位置:首页 > 编程语言 > Java开发

eclipse 安卓混淆学习

2015-11-12 15:33 411 查看
一、在 安卓工程的project.properties文件中添加

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



二、在安卓工程的proguard-project文件中添加响应的混淆语句

  -optimizationpasses 5                                #设置混淆的压缩比率 0 ~ 7

  -dontusemixedcaseclassnames                #Aa aA

  -dontskipnonpubliclibraryclasses               #如果应用程序引入的有jar包,并且想混淆jar包里面的class

  -dontpreverify                                             
#混淆后生产映射文件 map 类名->转化后类名的映射

  -verbose                                                     #不用输出详细的过程

  -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  #混淆采用的算法

  -dontwarn                                                #不用输出警告

 

 #第三方jar包

-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 

 #保持哪些类不变

 -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 * {               #枚举类不能被混淆

   public static **[] values();

   public static ** valueOf(java.lang.String);

  }

  -keepclassmembers class * {

     public <init>(org.json.JSONObject);

 }

   

 -keep class * implements android.os.Parcelable {    #aidl文件不能被混淆

   public static final android.os.Parcelable$Creator *;

  }

  

  

  #不混淆第三方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.** {*;}

-keepattributes *Annotation*

============================================

三、对于引用第三方包的情况,可以采用下面方式避免打包出错:

-libraryjars libs/aaa.jar

-dontwarn com.xx.yy.**

-keep class com.xx.yy.** { *;}

 

四、常见的不能混淆的AndroidCode

Android 程序 ,下面这样代码混淆的时候要注意保留。

Android系统组件,系统组件有固定的方法被系统调用。

被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。

Android Parcelable ,需要使用android 序列化的。

其他Anroid 官方建议 不混淆的,如

android.app.backup.BackupAgentHelper

android.preference.Preference

com.android.vending.licensing.ILicensingService

Java序列化方法,系统序列化需要固定的方法。

枚举 ,系统需要处理枚举的固定方法。

本地方法,不能修改本地方法名

annotations 注释

数据库驱动

有些resource 文件

用到反射的地方

五、常用参数解释

-include {filename} 从给定的文件中读取配置参数

-basedirectory {directoryname} 指定基础目录为以后相对的档案名称

-injars {class_path} 指定要处理的应用程序jar,war,ear和目录

-outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称

-libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件

-dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。

-dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。

保留选项

-keep {Modifier} {class_specification} 保护指定的类文件和类的成员

-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好

-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)

-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)

-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)

-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件

压缩

-dontshrink 不压缩输入的类文件

-printusage {filename}

-whyareyoukeeping {class_specification}

优化

-dontoptimize 不优化输入的类文件

-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用

-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员

混淆

-dontobfuscate 不混淆输入的类文件

-printmapping {filename}

-applymapping {filename} 重用映射增加混淆

-obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称

-overloadaggressively 混淆时应用侵入式重载

-useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆

-flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中

-repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中

-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名

-keepattributes {attribute_name,...} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClass
b9ef
es.

-renamesourcefileattribute {string} 设置源文件中给定的字符串常量

-include {filename} 从给定的文件中读取配置参数

-basedirectory {directoryname} 指定基础目录为以后相对的档案名称

-injars {class_path} 指定要处理的应用程序jar,war,ear和目录

-outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称

-libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件

-dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。

-dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。

保留选项

-keep {Modifier} {class_specification} 保护指定的类文件和类的成员

-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好

-keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

-keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)

-keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除)

-keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)

-printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件

压缩

-dontshrink 不压缩输入的类文件

-printusage {filename}

-whyareyoukeeping {class_specification}

优化

-dontoptimize 不优化输入的类文件

-assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用

-allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员

混淆

-dontobfuscate 不混淆输入的类文件

-printmapping {filename}

-applymapping {filename} 重用映射增加混淆

-obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称

-overloadaggressively 混淆时应用侵入式重载

-useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆

-flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中

-repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中

-dontusemixedcaseclassnames 混淆时不会产生形形色色的类名

-keepattributes {attribute_name,...} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.

-renamesourcefileattribute {string} 设置源文件中给定的字

 

六、一些常用的包的配置

sharesdk混淆注意:

-keep class
android.net.http.SslError

-keep
class android.webkit.**{*;}

-keep class
cn.sharesdk.**{*;}

-keep class
com.sina.**{*;}

-keep class
m.framework.**{*;}

Gson混淆配置:

-keepattributes *Annotation*

-keep class
sun.misc.Unsafe { *; }

-keep class
com.idea.fifaalarmclock.entity.***

-keep
class com.google.gson.stream.** { *; }

Umeng sdk混淆配置:

-keepclassmembers class
* {  

   public <init>(org.json.JSONObject);

}

-keep class
com.umeng.**

-keep public
class com.idea.fifaalarmclock.app.R$*{ 

   public static final int *;

}

-keep public class
com.umeng.fb.ui.ThreadView {}

-dontwarn com.umeng.**

-dontwarn org.apache.commons.**

-keep public class
* extends
com.umeng.**

-keep
class com.umeng.** {*; }

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  打包混淆