Android Parcelable实现类混淆

来源:互联网 发布:unity3d城市场景模型 编辑:程序博客网 时间:2024/05/02 02:59

欢迎使用Markdown编辑器写博客

项目开发已经接近尾声了,目前,希望通过混淆来保护自己的成果。以前也没怎么接触这个东西,很多相关混淆的东西不是很懂,正好公司有几个大牛还在,正好搞一下。
先声明一下,我只是不过是一个小菜鸟,不懂混淆,我直接那大牛的混淆文件过来参考一下吧:

-keepclassmembers class fqcn.of.javascript.interface.for.webview {   public *;}#指定代码的压缩级别-optimizationpasses 5#包明不混合大小写-dontusemixedcaseclassnames#不去忽略非公共的库类-dontskipnonpubliclibraryclasses-dontskipnonpubliclibraryclassmembers #预校验-dontpreverify #混淆时是否记录日志-verbose # 混淆时所采用的算法-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* #优化  不优化输入的类文件-dontoptimize#避免混淆泛型-keepattributes Singature#保护注解-keepattributes *Annotation-keepattributes *Annotation*-keep class com.lidroid.** { *; }-keep class * extends java.lang.annotation.Annotation { *; }# 保持哪些类不被混淆-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#如果有引用v4包可以添加下面这行-keep public class * extends android.support.v4.app.Fragment#忽略警告-ignorewarning##记录生成的日志数据,gradle build时在本项目根目录输出###apk 包内所有 class 的内部结构-dump proguard/class_files.txt#未混淆的类和成员-printseeds proguard/seeds.txt#列出从 apk 中删除的代码-printusage proguard/unused.txt#混淆前后的映射-printmapping proguard/mapping.txt########记录生成的日志数据,gradle build时 在本项目根目录输出-end#######如果引用了v4或者v7包-dontwarn android.support.**####混淆保护自己项目的部分代码以及引用的第三方jar包library-end#####保持 native 方法不被混淆-keepclasseswithmembernames class * {    native <methods>;}#保持自定义控件类不被混淆-keepclasseswithmembers class * {    public <init>(android.content.Context, android.util.AttributeSet);}#保持自定义控件类不被混淆-keepclassmembers class * extends android.app.Activity {   public void *(android.view.View);}-keep public class * extends android.view.View {    public <init>(android.content.Context);    public <init>(android.content.Context, android.util.AttributeSet);    public <init>(android.content.Context, android.util.AttributeSet, int);    public void set*(...);}#保持 Parcelable 不被混淆-keep class * implements android.os.Parcelable {  public static final android.os.Parcelable$Creator *;}#保持 Serializable 不被混淆-keepnames class * implements java.io.Serializable#保持 Serializable 不被混淆并且enum 类也不被混淆-keepclassmembers class * implements java.io.Serializable {    static final long serialVersionUID;    private static final java.io.ObjectStreamField[] serialPersistentFields;    !static !transient <fields>;    !private <fields>;    !private <methods>;    private void writeObject(java.io.ObjectOutputStream);    private void readObject(java.io.ObjectInputStream);    java.lang.Object writeReplace();    java.lang.Object readResolve();}#保持枚举 enum 类不被混淆-keepclassmembers enum * {  public static **[] values();  public static ** valueOf(java.lang.String);}-keepclassmembers class * {    public void *ButtonClicked(android.view.View);}#不混淆资源类-keepclassmembers class **.R$* {    public static <fields>;}#避免混淆泛型 如果混淆报错建议关掉#-keepattributes Signature#移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用,另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制#-assumenosideeffects class android.util.Log {#    public static *** v(...);#    public static *** i(...);#    public static *** d(...);#    public static *** w(...);#    public static *** e(...);#}#####################################################################################################################                 以上通用           ######################################################################################################################################################     常用第三方模块的混淆选项         ####################################gson#如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。-keepattributes Signature# Gson specific classes-keep class sun.misc.Unsafe { *; }# Application classes that will be serialized/deserialized over Gson-keep class com.google.gson.** { *; }-keep class com.google.gson.stream.** { *; }-dontwarn com.alibaba.fastjson.**-keep class com.alibaba.fastjson.** { *; }-dontwarn okhttp3.**-keep class okhttp3.**{*;}#butterknife-keep class butterknife.** { *; }-dontwarn butterknife.internal.**-keep class **$$ViewBinder { *; }#bugly-dontwarn com.tencent.bugly.**-keep public class com.tencent.bugly.**{*;}-keepclasseswithmembernames class * {    @butterknife.* <fields>;}-keepclasseswithmembernames class * {    @butterknife.* <methods>;}

在网上抄袭了一段代码,然后根据自己的情况增删了部分,嘿嘿,菜鸟的世界你懂的。抄袭成功之后,我自信满满的想要验证一下自己的成果。不得不说,效果还是蛮好的,我很满意。

咳咳,过了一会,测试和我说,App会奔溃,然后我很不服气的去瞄了一眼,好吧,这下尴尬了。明明debug的时候好好的,打包就出问题了,什么鬼?

为了验证问题的存在,我用debug版本在次验证一下,确实是打包的问题,后来,大牛告诉我,json数据中的实体类不能混淆,除非你把实体类都给序列化了。然后我屁颠屁颠的去实例化实体类,然后就没有然后了,出问题的地方还是照样会奔溃,尼玛!!!!!

仔细一看,原来是Parcelable实现类在传递的时候出问题了,传递过来的实体类在混淆之后变成了null,坑坑坑,然后在网上找了相关Parcelable混淆的问题,原来Parcelable实现类除了不能混淆本身之外,为了确保类成员也能够被访问,类成员也不能被混淆,所以,我乖乖的添加一句:

-keepclassmembers class * implements android.os.Parcelable { public <fields>; private <fields>;}

然后再试试吧。果不其然,没问题了。

有关Parcelable混淆的问题就说道这里了,希望对各位有所帮助,喜欢的博友们欢迎点赞。

感谢杨筱毅提供的解决方案

1 0
原创粉丝点击