您的位置:首页 > 移动开发 > Android开发

Android基础--App代码混淆

2016-07-06 11:43 597 查看
Android基础--App代码混淆

操作步骤:

1、打开混淆器:找到项目根目录下的project.properties文件,将“#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”这行前的“#”删除即可; 如果你不小心删掉了这个文件,没关系,从其他地方拷贝一个过来

2、修改混淆配置文件:找到项目根目录下的proguard-project.txt文件,修改其中代码,这部分是最关键;

-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 com.android.vending.licensing.ILicensingService

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

这里是 google默认 不混淆 Activity 、Service ... 类的 子类, 正如上面的截图中看到的 所有 activity 的子类 名称是被保留的。

3. 举个例子

 





-dontobfuscate  

-dontoptimize  

2、在 proguard.cfg中添加

[java] view
plain copy

 





# removes such information by default, so configure it to keep all of it.  

-keepattributes Signature  

  

  

# Gson specific classes  

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

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

  

  

# Application classes that will be serialized/deserialized over Gson  

-keep class com.google.gson.examples.android.model.** { *; }  


3、类型转换错误

-keepattributes Signature


4、空指针异常


混淆过滤掉相关类与方法

5、安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法,安卓反编译


     此前的代码混淆,因为并没有用到反射,所以常规的代码混淆方式一遍就能通过,而此项目中某些类利用到了反射机制(本人的这个项目中有即时通讯功能,所以有表情类资源,因此需要通过反射由文件名找到表情资源id),当由文件名去寻找资源id时就报空指针异常了,期初我并不知道什么原因,通过反编译已经混淆的apk,一步一步寻找到出错的地方,才恍然大悟,正是反射那一步出现了问题:Field field = R.drawable.class.getDeclaredField(name);走到这一步就挂了,程序直接崩溃。

解决办法:

   1.在proguard.cfg文件中,将反射用到的类中的变量不被混淆:

   如:-keep public class com.byl.bean.Expressions { *; },表示Expressions 这个类及类中的所有变量及方法不被混淆,注意要写全路径;

   2.过滤泛型:-keepattributes Signature

   3.最重要的一点:保持R文件不被混淆,否则,你的反射是获取不到资源id的:-keep class **.R$* {*;}

补充一下:上个问题解决后,接下来又遇到了一个问题就是混淆后,地图无法正常使用了,博主使用的是百度地图,在proguard.cfg也已经写明了:

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

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


6、android.provider.Settings$Global


# Project target.

target=android-19


7、java.lang.reflect.UndeclaredThrowableException


-keep interface com.dev.impl.**


8、内存溢出和无法写入堆栈

javaOptions in proguard := Seq(...)
or
javaOptions in (Proguard, proguard) := Seq(...)


9、Error: Unable to access jarfile ..\lib\proguard.jar


路径问题


10、java.lang.NoSuchMethodError

没有相关方法,方法被混淆了,混淆过滤掉相关方法便可。


11、专业网站bug解决方法

http://proguard.sourceforge.net/index.html#manual/troubleshooting.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  反编译 混淆