修复Android更新AGP8后retrofit2混淆出现错误:Unable to create call adapter for interface retrofit2.Call,并附上完整混淆规则

Android更新AGP8后retrofit2混淆出现错误

背景

由于项目需要适配安卓14,将AGP升级到了8.2.2,并将Gradle升级到了8.2。最终代码混淆出现了很多问题,其中retrofit2的报错如下:

 Caused by: java.lang.IllegalArgumentException: Unable to create call adapter for interface retrofit2.Call
     for method HttpBinService.get
     at retrofit2.Utils.methodError(Utils.java:55)
     at retrofit2.HttpServiceMethod.createCallAdapter(HttpServiceMethod.java:116)
     at retrofit2.HttpServiceMethod.parseAnnotations(HttpServiceMethod.java:67)
     at retrofit2.ServiceMethod.parseAnnotations(ServiceMethod.java:39)
     at retrofit2.Retrofit.loadServiceMethod(Retrofit.java:208)
     at retrofit2.Retrofit$1.invoke(Retrofit.java:166)
     at java.lang.reflect.Proxy.invoke(Proxy.java:1006)
     at $Proxy3.get(Unknown Source)
     at io.vibin.myapplication.MainActivity.onCreate(MainActivity.kt:45)
     at android.app.Activity.performCreate(Activity.java:8290)
     at android.app.Activity.performCreate(Activity.java:8269)
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1384)
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3657)
     ... 12 more
 Caused by: java.lang.IllegalArgumentException: Call return type must be parameterized as Call<Foo> or Call<? extends Foo>
     at retrofit2.DefaultCallAdapterFactory.get(DefaultCallAdapterFactory.java:42)
     at retrofit2.Retrofit.nextCallAdapter(Retrofit.java:259)
     at retrofit2.Retrofit.callAdapter(Retrofit.java:243)
     at retrofit2.HttpServiceMethod.createCallAdapter(HttpServiceMethod.java:114)
     ... 23 more

经研究发现,原因是在AGP7.2以上的版本默认开启了R8完整模式。R8完整模式对未保留的类剥离通用签名。因此需要在proguard-rules.pro中配置额外的混淆规则规避这些问题,另外也可以通过在gradle.properties中添加android.enableR8.fullMode=false关闭R8完整模式。

需要新增的规则

 # 使用R8全模式,对未保留的类剥离通用签名。挂起函数被包装在使用类型参数的continuation中。
 -keep,allowobfuscation,allowshrinking class kotlin.coroutines.Continuation 
  
 # 如果不保留,R8完整模式将从返回类型中剥离通用签名。
 -if interface * { @retrofit2.http.* public *** *(...); } 
 -keep,allowoptimization,allowshrinking,allowobfuscation class <3> 
  
 # 在R8全模式下,对未保留的类剥离通用签名。
 -keep,allowobfuscation,allowshrinking class retrofit2.Response 

另外附上通用的对Retrofit2 , Rxjava2 , Okhttp3混淆规则,这里参考大佬的文章:AndroidStudio混淆打包踩坑之retrofit2.

注意,这里只是通用配置不包含R8完整模式的额外配置,请根据需求自己调整!

## ---------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目录

至此问题已解决,如有其它问题欢迎大佬补充。

要使用R复现这篇孟德尔随机化(Mendelian Randomization, MR)分析文章中的结果,可以按照以下步骤进行: ### 1. 安装和加载必要的包 首先,你需要安装加载一些必要的R包,这些包用于处理GWAS数据和执行MR分析。 ```R install.packages("TwoSampleMR") library(TwoSampleMR) ``` ### 2. 下载和准备GWAS数据 你需要从论文中提到的数据源下载GWAS汇总统计数据,将其准备好用于MR分析。这里以骨密度(BMD)和骨折为例。 #### 2.1 下载GWAS数据 你可以从以下网站下载GWAS数据: - **骨密度(BMD)**:[GEFOS](http://www.gefos.org/) -epidemiology/) - **精神疾病(MDs)**:[GWAS Catalog](https://www.ebi.ac.uk/gwas/downloads/summary-statistics) 假设你已经下载了这些数据保存为文件。 #### 2.2 准备GWAS数据 将下载的GWAS数据读入R,进行预处理。 ```R # 读取GWAS数据 bmd_data <- read.table("path/to/bmd_data.txt", header = TRUE) fracture_data <- read.table("path/to/fracture_data.txt", header = TRUE) schizophrenia_data <- read.table("path/to/schizophrenia_data.txt", header = TRUE) # 进行质量控制 bmd_data <- clump_data(bmd_data, p1 = 5e-8, p2 = 5e-8, clump_kb = 10000, clump_r2 = 0.001) fracture_data <- clump_data(fracture_data, p1 = 5e-8, p2 = 5e-8, clump_kb = 10000, clump_r2 = 0.001) schizophrenia_data <- clump_data(schizophrenia_data, p1 = 5e-8, p2 = 5e-8, clump_kb = 10000, clump_r2 = 0.001) ``` ### 3. 执行两样本MR分析 使用`TwoSampleMR`包中的函数来执行MR分析。 ```R # 获取遗传工具变量 exposure_data <- extract_instruments(schizophrenia_data) # 获取结局数据 outcome_bmd <- harmonise_data(exposure_data, bmd_data) outcome_fracture <- harmonise_data(exposure_data, fracture_data) # 执行MR分析 mr_result_bmd <- mr(outcome_bmd, method_list = c("ivw", "mr_egger_regression", "weighted_median")) mr_result_fracture <- mr(outcome_fracture, method_list = c("ivw", "mr_egger_regression", "weighted_median")) # 查看结果 print(mr_result_bmd) print(mr_result_fracture) ``` ### 4. 结果解释 输出的结果会显示不同方法下的MR估计值及其显著性水平。你可以通过查看`mr_result_bmd`和`mr_result_fracture`来解释结果。 ### 5. 敏感性分析 为了验证结果的稳健性,可以进行敏感性分析。 ```R # 检查异质性和多效性 heterogeneity_test <- mr_heterogeneity(outcome_bmd) pleiotropy_test <- mr_pleiotropy Egger(outcome_bmd) # 查看测试结果 print(heterogeneity_test) print(pleiotropy_test) ``` ### 6. 可视化结果 最后,可以使用`forest_plot`函数绘制森林图来可视化结果。 ```R # 绘制森林图 forest_plot(mr_result_bmd, method_list = c("ivw", "mr_egger_regression", "weighted_median")) forest_plot(mr_result_fracture, method_list = c("ivw", "mr_egger_regression", "weighted_median")) ``` ### 总结 以上步骤可以帮助你在R中复现这篇文章中的孟德尔随机化分析。确保你正确地下载和处理了所有所需的GWAS数据,且在每一步都进行了适当的质量控制和数据校正。如果有任何问题或需要进一步的帮助,请随时提问。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值