Android 生成签名的 APK 崩溃并出现错误,但在调试模式下工作正常
我有一个代码,它在调试模式下工作正常,并且生成的签名 APK 将工作正常,如果 isMinifyEnabled=false 但对于生成的签名 APK,当 isMinifyEnabled=true 生成的 apk 文件崩溃时会出现以下错误:
java.lang.IllegalArgumentException: Class declares 0 type parameters, but 1 were provided.
at kotlin.reflect.jvm.internal.ReflectionFactoryImpl.typeOf(ReflectionFactoryImpl.java:28)
at kotlin.jvm.internal.Reflection.typeOf(Reflection.java:2)
at ir.namoo.commons.service.PrayTimesService.getAllCountries(PrayTimesService.kt:19)
at ir.namoo.commons.service.PrayTimesService$getAllCountries$1.invokeSuspend(Unknown Source:11)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:4)
at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:11)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:5)
at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:6)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:10)
at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:11)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:5)
at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:6)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:10)
at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:11)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:5)
at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:6)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:10)
at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:11)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:5)
at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:6)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:10)
at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:11)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:5)
at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:6)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:10)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:18)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7839)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
附加信息
我使用 Android Studio Bumblebee | 2021.1.1 补丁 2 和最新的库版本和 gradle 7.4.1
我的 progurd 文件
# remove Log calls from release builds
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** i(...);
}
-ignorewarnings
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-dontobfuscate
,这是错误日志中存在的 getAllCountries 函数
class PrayTimesService @Inject constructor(private val httpClient: HttpClient) {
***
suspend fun getAllCountries(): List<CountryModel> {
val res =httpClient.get<ServerResponseModel<List<CountryModel>>>("$BASE_API_URL/getCountries")
return res.data
}
***
}
I have a code it's work fine in debug mode also generated signed APK will work fine if isMinifyEnabled=false
but for generated signed APK when isMinifyEnabled=true generated apk file crash with this error:
java.lang.IllegalArgumentException: Class declares 0 type parameters, but 1 were provided.
at kotlin.reflect.jvm.internal.ReflectionFactoryImpl.typeOf(ReflectionFactoryImpl.java:28)
at kotlin.jvm.internal.Reflection.typeOf(Reflection.java:2)
at ir.namoo.commons.service.PrayTimesService.getAllCountries(PrayTimesService.kt:19)
at ir.namoo.commons.service.PrayTimesService$getAllCountries$1.invokeSuspend(Unknown Source:11)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:4)
at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:11)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:5)
at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:6)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:10)
at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:11)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:5)
at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:6)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:10)
at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:11)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:5)
at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:6)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:10)
at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:11)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:5)
at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:6)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:10)
at io.ktor.util.pipeline.SuspendFunctionGun.resumeRootWith(SuspendFunctionGun.kt:11)
at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:5)
at io.ktor.util.pipeline.SuspendFunctionGun$continuation$1.resumeWith(SuspendFunctionGun.kt:6)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:10)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:18)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:201)
at android.os.Looper.loop(Looper.java:288)
at android.app.ActivityThread.main(ActivityThread.java:7839)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
additional information
I use Android Studio Bumblebee | 2021.1.1 Patch 2 and latest library version and gradle 7.4.1
my progurd file
# remove Log calls from release builds
-assumenosideeffects class android.util.Log {
public static *** d(...);
public static *** i(...);
}
-ignorewarnings
-keepattributes *Annotation*
-keepattributes SourceFile,LineNumberTable
-dontobfuscate
and this is getAllCountries function that exist in error log
class PrayTimesService @Inject constructor(private val httpClient: HttpClient) {
***
suspend fun getAllCountries(): List<CountryModel> {
val res =httpClient.get<ServerResponseModel<List<CountryModel>>>("$BASE_API_URL/getCountries")
return res.data
}
***
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要在 proguard-rules.pro 文件中的每个库(依赖项)中添加 proguard 规则,例如 Retrofit..etc 中使用的
项目
you need add proguard rules in proguard-rules.pro file every library(dependencies) like retrofit..etc using in
project
如果您使用 ProGuard,则需要将规则添加到 proguard-rules.pro 配置中,以涵盖运行时序列化的所有类。
以下配置为收缩后保留的所有可序列化类保留序列化器。取消注释并修改最后一部分,以防您使用命名伴生对象序列化类。
如果您想要排除已使用但从未在运行时序列化的可序列化类,则需要使用更窄的类规范编写自定义规则。
自定义规则示例
If you're using ProGuard, you need to add rules to your proguard-rules.pro configuration to cover all classes that are serialized at runtime.
The following configuration keeps serializers for all serializable classes that are retained after shrinking. Uncomment and modify the last section in case you're serializing classes with named companion objects.
In case you want to exclude serializable classes that are used, but never serialized at runtime, you will need to write custom rules with narrower class specifications.
Example of custom rules