Android 解毒-解毒管理器在运行时找不到kotlin/jvm/functions/Function1
为了重现我面临的问题,我使用了来自“解毒”的Android 解毒-解毒管理器在运行时找不到kotlin/jvm/functions/Function1,android,react-native,kotlin,jvm,detox,Android,React Native,Kotlin,Jvm,Detox,为了重现我面临的问题,我使用了来自“解毒”的react native示例项目 安装带有纱线的软件包后,我执行了两个命令来运行测试: 1) cd-android&./gradlew-assemblererelease-assembleeandroidtest-DtestBuildType=release&&cd.. 2) npx解毒测试-l错误——配置android.emu.release 到目前为止,一切正常,但我在android/app/build.gradle文件中添加了Kotlin标准库的
react native
示例项目
安装带有纱线的软件包后,我执行了两个命令来运行测试:
1) cd-android&./gradlew-assemblererelease-assembleeandroidtest-DtestBuildType=release&&cd..
2) npx解毒测试-l错误——配置android.emu.release
到目前为止,一切正常,但我在android/app/build.gradle
文件中添加了Kotlin标准库的依赖项,就像这样
dependencies {
...
androidTestImplementation('com.wix:detox:+')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.71" // <-- line added
}
"android.emu.e2e": {
"binaryPath": "android/app/build/outputs/apk/e2eRelease/app-e2eRelease.apk",
"build": "cd android && RN_SRC_EXT=e2e.js ./gradlew app:assembleE2ERelease app:assembleE2EReleaseAndroidTest -DtestBuildType=e2eRelease -x bundleE2eReleaseJsAndAssets && cd ..",
"type": "android.emulator",
"device": {
"avdName": "Nexus_6P_API_28"
}
}
我已经尝试按照描述将JVM
插件加载到android/build.gradle
文件中,但没有任何帮助
我还可以做些什么来使org.jetbrains.kotlin.jvm
在该项目中工作
先谢谢你
编辑1
我将kotlin.jvm.functions.Function1
添加到main应用程序.java
中,通过添加以下代码来测试kotlin jvm
是否可以被项目实际访问
...
import kotlin.jvm.functions.Function0;
import kotlin.jvm.functions.Function1;
public class MainApplication extends Application implements ReactApplication {
private Function1<Throwable, String> errorParseFn = new Function1<Throwable, String>() {
@Override
public String invoke(Throwable t) {
return Log.getStackTraceString(t);
}
};
...
@Override
public void onCreate() {
super.onCreate();
SoLoader.init(this, /* native exopackage */ false);
Log.d("@@@@@@", "onCreate");
Log.d("@@@@@@", errorParseFn.invoke(new Exception("Test Exception message")));
}
}
这意味着应用程序本身可以访问kotlin.jvm
,这意味着gradle
设置是正确的
有谁知道detockmanager.java
如何在运行时访问Kotlin JVM
?我终于有时间发布解决方案了
在研究了日志的含义之后
Note: kotlin.jvm.internal.Reflection: can't find dynamically referenced class kotlin.reflect.jvm.internal.ReflectionFactoryImpl
Note: kotlin.coroutines.jvm.internal.DebugMetadataKt accesses a declared field 'label' dynamically
...
Note: there were 1 references to unknown classes.
You should check your configuration for typos.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unknownclass)
我发现Proguard
正在删除Kotlin
依赖项
为了证明这个假设,我在
这一切都如期而至
这意味着我必须为E2E测试创建自己的buildType
,并仅为发布版本创建proguard
剩下的唯一一件事就是像这样调整package.json
文件中的path和build命令
dependencies {
...
androidTestImplementation('com.wix:detox:+')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.71" // <-- line added
}
"android.emu.e2e": {
"binaryPath": "android/app/build/outputs/apk/e2eRelease/app-e2eRelease.apk",
"build": "cd android && RN_SRC_EXT=e2e.js ./gradlew app:assembleE2ERelease app:assembleE2EReleaseAndroidTest -DtestBuildType=e2eRelease -x bundleE2eReleaseJsAndAssets && cd ..",
"type": "android.emulator",
"device": {
"avdName": "Nexus_6P_API_28"
}
}
请注意,在运行/gradlew assemblee2release assemblee2release androidtest-DtestBuildType=e2errease
之前,必须手动创建文件夹outputs/apk/e2errease
这很有效,但请告诉我是否有更好的解决方案
干杯通过在proguard文件中添加以下配置,我能够减轻相同的错误
-dontobfuscate
-keep class kotlin.** { *; }
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**
当您尝试显式地使用kotlin-stdlib-jdk8
而不仅仅是kotlin-stdlib
时会发生什么?您好@d4vidi,我已经将标准库切换到实现“org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.71”,但这没有帮助。我还在我的初始问题中添加了一个
edit1`部分,描述了我进行的测试。请看一看,我也陷入了同样的问题@托马斯迪特玛:你找到解决办法了吗?是的,我找到了。我没有时间发布解决方案。“我会在下一个小时内完成。”沙克提辛格莫亚尔我发布了解决方案。您检查过了吗?这也意味着Proguard没有在release
模式下用于Kotlin
文件,对吗?这意味着只需从Proguard中删除这些文件。因为我使用的是react native。我在kotlin没有任何代码。这只是排毒,在kotlin中有部分代码。因此,在proguard中添加此配置对我的实际产品没有影响。您可以选择适合自己的内容,但在实际的发行版
(生产应用程序)中,出于安全原因,您希望ProGuard删除Kotlin
文件。看看这里,我也用RN。他们有相当多的库在后台使用Kotlin
。你可能在某处有Kotlin
代码。因此,为什么它没有构建。这不能最小化为只有-keep class kotlin.jvm.functions.*{*}
和-keep class kotlin.Unit{*;}
?如果是这样的话,lmk和我会将此添加到Detox“自己的proguard设置中(这样你就不用这么做了)。奇怪的是,Detox”演示应用程序(正如你链接的)确实有proguard定义——与你的类似,但它工作得很好(FunctionX类不会被删除)。事实上,我一开始就创建了这个设置并不是偶然的。。。无论如何,我曾经发表过一篇博客文章,描述了所有这些配置怪癖,希望在这里有用:
"android.emu.e2e": {
"binaryPath": "android/app/build/outputs/apk/e2eRelease/app-e2eRelease.apk",
"build": "cd android && RN_SRC_EXT=e2e.js ./gradlew app:assembleE2ERelease app:assembleE2EReleaseAndroidTest -DtestBuildType=e2eRelease -x bundleE2eReleaseJsAndAssets && cd ..",
"type": "android.emulator",
"device": {
"avdName": "Nexus_6P_API_28"
}
}
-dontobfuscate
-keep class kotlin.** { *; }
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**