Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 解毒-解毒管理器在运行时找不到kotlin/jvm/functions/Function1_Android_React Native_Kotlin_Jvm_Detox - Fatal编程技术网

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.**