android混淆

来源:互联网 发布:python html 解析 编辑:程序博客网 时间:2024/05/16 11:30

还是混淆工程,很早以前做过了,又忘了。。。在此做个记录:

写一个proguard.cfg文件,或者拷贝也行,然后在project.properties中添加proguard.config=proguard.cfg就算生效了,

proguard.cfg内容一般为:

-optimizationpasses 5 -dontusemixedcaseclassnames//混淆时不会产生形形色色的类名 -dontskipnonpubliclibraryclasses//指定不去忽略非公共的类库 -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 <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); }  //保护指定的类文件和类成员 -keep class * implements android.os.Parcelable {   public static final android.os.Parcelable$Creator *; } 

然后经常需要使用第三方jar包,防止混淆,需要

-libraryjars /aaa.jar
-dontwarn com.xx.yy.**
-keep class com.xx.yy.** { *;}

这样的处理方式来处理,还有suport-v4包,需要

-libraryjars/android-support-v4.jar 
 -dontwarnandroid.support.v4.** 
 -keep class android.support.v4.** { *;} 
 -keep public class * extendsandroid.support.v4.** 
 -keep public class * extendsandroid.app.Fragment 

这样来处理

,但是还需要验证反编译后的apk,这个时候通过签名得出apk,使用ApkDecompiler这个工具进行测试验证,

下载地址见下:

http://download.csdn.net/detail/bawang_cn/7407751


本文参考以下链接:都是不错的文章,可以结合起来看

http://blog.csdn.net/p106786860/article/details/11974863

http://www.cnblogs.com/sw926/p/3314165.html

http://blog.sina.com.cn/s/blog_7bac470701014ohn.html

http://www.cnblogs.com/royi123/archive/2013/02/28/2937657.html


问题处理:

在混淆的过程中会遇到各种各样的问题,

比如会遇到java.lang.ClassNotFoundException,就是找不到类,这个需要注意的是看到底是哪个类,为什么混淆之后会没了,然后不要混淆这个类就可以

java.lang.NoSuchFieldException  这个是找不到对应的局部变量,需要看清是哪个变量,比如R资源下的变量找不到,xml,drawable ,layout等等,这样就会在反编译出来的R中找不到对应的变量,R相对应下的有些变量就是空的,这个时候可以添加以下一句,

-keep class **.R$* {
 *;


再次查看就会发现反编译出来的文件中,R对应的种类下面就有相对应的变量了,说明混淆正确

0 0
原创粉丝点击