AndroidStudio混淆打包踩坑之retrofit2

公司上线项目为保障apk安全,采用android studio自带混淆方法。初始仅对retrofit2混淆,导致打包后无法网络访问,debug却正常。经排查,发现需对retrofit2、Rxjava2、Okhttp3分别混淆,且Response类要实现Serializable接口,问题才得以解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AndroidStudio混淆打包踩坑之retrofit2

事因起由

公司上线项目,需要保障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 {
 
}

第一次写博客 看看客们,看解决办法就好了,不要在乎的我文笔,各位手下留情,轻喷

参考

安卓retrofit2混淆后出现接口失败
Retrofit简单使用及混淆配置

### 如何在 Android Studio 中使用 Retrofit2 进行网络请求 #### 定义接口 定义一个用于发起网络请求的接口,指定HTTP方法和URL路径。例如,在Java中可以这样定义: ```java import retrofit2.Call; import retrofit2.http.GET; import retrofit2.http.Path; interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> getListRepos(@Path("user") user); } ``` 此部分展示了如何构建一个简单的API接口来获取GitHub用户的仓库列表[^1]。 #### 封装 GET 请求 对于不带参数的GET请求,可以通过`RetrofitUtil.get()`方法来进行封装调用,并通过回调处理成功响应或错误情况: ```java RetrofitUtil.get("/xx/xx", new RetrofitCallback() { @Override public void onSuccess(String resultJsonString) {} @Override public void onError(Throwable t) {} }); ``` 上述代码片段说明了怎样利用自定义工具类简化GET类型的无参请求操作[^2]。 #### 实例化 API 接口并发出异步请求 为了执行实际的网络交互,需先基于Retrofit对象创建对应的API服务实例;之后便能轻松地启动异步任务: ```java Api api = retrofit.create(Api.class); // 使用api变量去触发具体的网络请求... ``` 这里描述的是在一个Activity内部完成整个流程的方式——即初始化API代理和服务端通讯过程[^3]。 #### 配置 ProGuard 混淆规则 (可选) 当项目启用ProGuard混淆功能时,应适当调整设置以免破坏Retrofit的功能特性: ```proguard -dontwarn retrofit.** -keep class retrofit.** { *; } -keepattributes Signature -keepattributes Exceptions ``` 这些指令确保即使经过编译优化后的应用程序仍能够正常工作而不影响到第三方库的行为模式[^4]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值