事因起由
公司上线项目,需要保障apk的安全性,需要避免apk被反编译.所以我们就实现了最简单的还是android studio自带的混淆方法.
具体混淆方法也简单说一下吧
1.只需要在下面这个文件里面添加插件的混淆代码就可以
2.在model的build.gradle文件里面添加一行代码
buildTypes {
release {
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
简单的混淆方法就这么简单
掉坑之一
初始只是在retrofit2官方下找到retrofit2的混淆方法,如下
# Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
这个只是retrofit2的混淆方法,没发现是个坑,我就这样完全的掉里面去了
问题剖析
公司项目是采用的retrofit2+Rxjava2+Okhttp3进行的网络请求框架,而我头脑简单的之对retrofit2进行了混淆,其他的两个并没有进行混淆,就这样导致了接下来的问题的发生.
项目在debug的时候是能正常的进行网络访问,于是乎就进行了打包,在打包完进行测试的时候问题就出现了.
竟然无法进行网络访问,但是在我这边进行debug测试的时候是没有任何问题的.
这样我就有点疑问了,于是就开始在项目中间找问题缘由.最后没有办法只好上网求救,在网上找方法,之后就看到了一些博主的解决方案,但是没有什么效果,到最后看到这位大哥的帖子才瞬间反应过来Retrofit简单使用及混淆配置.
然后就参考这个大哥的方法进行对okhttp3和Gson进行混淆,但是在在对进行整个项目调试的时候原来的问题还是没有得到解决.
没办法之后又在网络的海洋中遨游,最后看到了许多相似的bug,最后终于在以为大佬的博客下找到了解决办法.
原因是Response这个类没有实现Serializable接口
public class Response<T> implements Serializable {
}
解决办法
对retrofit2 , Rxjava2 , Okhttp3分别进行混淆
## ---------Retrofit混淆方法---------------
-dontwarn javax.annotation.**
-dontwarn javax.inject.**
# OkHttp3
-dontwarn okhttp3.logging.**
-keep class okhttp3.internal.**{*;}
-dontwarn okio.**
# Retrofit
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions
# RxJava RxAndroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
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;
}
# Gson
-keep class com.google.gson.stream.** { *; }
-keepattributes EnclosingMethod
# Gson
-keep class com.demo.demo1.service.bean.**{*;} # 自定义数据模型的bean目录
还要对Response这个类没有实现Serializable接口
public class Response<T> implements Serializable {
}
第一次写博客 看看客们,看解决办法就好了,不要在乎的我文笔,各位手下留情,轻喷