Android Studio 代码混淆(你真的会混淆吗)
04-18 3.4万
一、前言今天要打包新产品,突然忘了混淆的参数是怎么写的了,虽然之前也混淆过,可是具体配置的参数代码有些记不起来了,因此决定花点时间写篇博客记录一下,方便以后查找和自己的记忆。二、Android Stu... 来自: Two_Water
转载至:https://blog.csdn.net/wzy901213/article/details/82877858
最近,给自己的项目加上了代码混淆,在构建打包安装阶段没有任何问题,但是运行在手机上进行登录,项目就奔溃退出了。查验日志,是因为登录的时候上传的数据为null 导致报了java.lang.NullPointerException。
仔细一想,肯定是混淆引起的问题。**原来,所有json对应的实体类都要在混淆文件中设置忽略**,不然在进行json转换的时候,转换后的数据都是为null。
那么我就在混淆规则文件中设置忽略该目录下所有文件 ,设置如下
#指定代码的压缩级别
-optimizationpasses 5
#包明不混合大小写
-dontusemixedcaseclassnames
#不去忽略非公共的库类
-dontskipnonpubliclibraryclasses
#优化 不优化输入的类文件
-dontoptimize
#预校验
-dontpreverify
#混淆时是否记录日志
-verbose
-optimizations !code/simplification/arithmetic,!field/,!class/merging/
#保护注解
-keepattributes 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
}
#保持自定义控件类不被混淆
-keepclasseswithmembers class * {
public
}
#保持自定义控件类不被混淆
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keep public class * extends android.view.View {
public
public
public
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
!private
!private
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
}
#避免混淆泛型 如果混淆报错建议关掉
#-keepattributes Signature
#移除Log类打印各个等级日志的代码,打正式包的时候可以做为禁log使用,这里可以作为禁止log打印的功能使用,另外的一种实现方案是通过BuildConfig.DEBUG的变量来控制
#-assumenosideeffects class android.util.Log {
#}
#############################################################################################
######################## 以上通用 ##################################
#############################################################################################
####################### 常用第三方模块的混淆选项 ###################################
#gson
#如果用用到Gson解析包的,直接添加下面这几行就能成功混淆,不然会报错。
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.** { ; }
-keep class com.google.gson.stream.* { *; }
#mob
-keep class android.net.http.SslError
-keep class android.webkit.{*;}
-keep class cn.sharesdk.{;}
-keep class com.sina.**{;}
-keep class m.framework.**{*;}
-keep class *.R ∗ ∗ ; − k e e p c l a s s ∗ ∗ . R ∗ ; − d o n t w a r n c n . s h a r e s d k . ∗ ∗ − d o n t w a r n ∗ ∗ . R * {*;} -keep class **.R{*;} -dontwarn cn.sharesdk.** -dontwarn **.R ∗∗;−keepclass∗∗.R∗;−dontwarncn.sharesdk.∗∗−dontwarn∗∗.R
#butterknife
-keep class butterknife.** { ; }
-dontwarn butterknife.internal.*
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
@butterknife.*
}
-keepclasseswithmembernames class * {
@butterknife.*
}
######引用的其他Module可以直接在app的这个混淆文件里配置
-keep class com.matrix.app.entity.json.** { ; }
-keep class com.matrix.appsdk.network.model.* { *; }
#####混淆保护自己项目的部分代码以及引用的第三方jar包library#######
#如果在当前的application module或者依赖的library module中使用了第三方的库,并不需要显式添加规则
#-libraryjars xxx
#添加了反而有可能在打包的时候遭遇同一个jar多次被指定的错误,一般只需要添加忽略警告和保持某些class不被混淆的声明。
#以libaray的形式引用了开源项目,如果不想混淆 keep 掉,在引入的module的build.gradle中设置minifyEnabled=false
-keep class com.nineoldandroids.** { ; }
-keep interface com.nineoldandroids.* { ; }
-dontwarn com.nineoldandroids.*
-keep class in.srain.cube.** { ; }
-keep interface in.srain.cube.* { ; }
-dontwarn in.srain.cube.*
-keep class com.github.ksoichiro.** { ; }
-keep interface com.github.ksoichiro.* { ; }
-dontwarn com.github.ksoichiro.*
-keepclassmembers class rx.internal.util.unsafe.ArrayQueueField* {
long producerIndex;
long consumerIndex;}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
rx.internal.util.atomic.LinkedQueueNode consumerNode;
}
-keep class com.cocospy.jsonEntity.** {*;}
推荐一个大神博客
传送门
作者:王宗耀 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/wzy901213
04-18 3.4万
一、前言今天要打包新产品,突然忘了混淆的参数是怎么写的了,虽然之前也混淆过,可是具体配置的参数代码有些记不起来了,因此决定花点时间写篇博客记录一下,方便以后查找和自己的记忆。二、Android Stu... 来自: Two_Water
11-27 4656
相信大家在开发Android app都会遇到一个问题:在打release包时bean类常常被混淆,导致出现空指针进而引发crash;
如何做到保持指定的类不被混淆?方案不止一个,
1、 在混淆配置…
来自: dbs1215的专栏
我的Android进阶之旅------>解决Jackson等第三方转换Json的开发包在开启混淆后转换的实体类数据都是null的bug
04-28
3389