在 React Native Expo 中使用 Bare Workflow 启用 Kotlin 存在困难

Jos*_*e A 5 android gradle kotlin react-native expo

说我花了大约 32 个小时还算轻描淡写。我一直在尝试在由 Expo SDK 44 提供支持的 React Native 项目中启用 Kotlin。

\n

我一直在尝试在互联网上找到的所有方法,但总是在 EAS 的 Gradle 阶段出现错误(使用 运行它eas build --profile development --platform android)。

\n

这是我的配置:

\n

为了简洁起见,我省略了代码。如果您需要更多背景信息,请告诉我

\n

应用程序\\android\\build.gradle:

\n
buildscript {\n    ext {\n        buildToolsVersion = "30.0.2"\n        minSdkVersion = 21\n        compileSdkVersion = 31\n        targetSdkVersion = 31\n        kotlinVersion = "1.4.11"\n    }\n    repositories {\n        google()\n        mavenCentral()\n        jcenter()\n    }\n    dependencies {\n        classpath("com.android.tools.build:gradle:4.1.0")\n        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")\n       \n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
apply plugin: "kotlin-android"\napply plugin: "kotlin-android-extensions"\n\ndependencies {\n    implementation fileTree(dir: "libs", include: ["*.jar"])\n    //noinspection GradleDynamicVersion\n    implementation "com.facebook.react:react-native:+"  // From node_modules\n    implementation project(\':react-native-plaid-link-sdk\')\n\n    implementation \'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.3\'\n    implementation \'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.3\'\n    implementation \'androidx.core:core-ktx:1.1.0\'\n    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion"\n\n// Other comed omitted\n}\n\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的 package.json

\n
buildscript {\n    ext {\n        buildToolsVersion = "30.0.2"\n        minSdkVersion = 21\n        compileSdkVersion = 31\n        targetSdkVersion = 31\n        kotlinVersion = "1.4.11"\n    }\n    repositories {\n        google()\n        mavenCentral()\n        jcenter()\n    }\n    dependencies {\n        classpath("com.android.tools.build:gradle:4.1.0")\n        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion")\n       \n        // NOTE: Do not place your application dependencies here; they belong\n        // in the individual module build.gradle files\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是我的文件夹结构:

\n

应用程序的文件夹结构

\n

这里的MyAppPackage.kt(android\\app\\src\\main\\java\\com\\pana\\MyAppPackage.kt)

\n
package com.pana // replace your-app-name with your app\xe2\x80\x99s name\n\nimport android.view.View\nimport com.facebook.react.ReactPackage\nimport com.facebook.react.bridge.NativeModule\nimport com.facebook.react.bridge.ReactApplicationContext\nimport com.facebook.react.uimanager.ReactShadowNode\nimport com.facebook.react.uimanager.ViewManager\n\nclass MyAppPackage : ReactPackage {\n\n    override fun createViewManagers(\n        reactContext: ReactApplicationContext\n    ): MutableList<ViewManager<View, ReactShadowNode<*>>> = mutableListOf()\n\n    override fun createNativeModules(\n        reactContext: ReactApplicationContext\n    ): MutableList<NativeModule> = listOf(CalendarModule(reactContext)).toMutableList()\n\n\n}\n
Run Code Online (Sandbox Code Playgroud)\n

以下是我研究过的一些 SO 资源:

\n\n

以下是我研究过的一些其他资源:

\n\n

以下是我尝试过的一些错误和修复:

\n

1 - 将项目最小化到准系统 Kotlin

\n

我已经尝试最小化地增加我当前的项目(请注意,我必须将Intercom 包的compileSdkVersion和设置targetSdkVersion为 31,并且构建成功)。我已关注此视频、官方React Native 文档,以及使用 Android Studio将 Kotlin 添加到现有应用程序(手动方法)。

\n

A。(android/build.gradle)添加(在 buildscript.ext 内)kotlin_version = \'1.4.10\'\nb。(android/build.gradle)添加(内部依赖项)classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"\nc。(android/app/build.gradle) 添加(在文件顶部)apply plugin: "kotlin-android"

\n

尝试编译:

\n
[stderr] Note: Recompile with -Xlint:deprecation for details.\n> Task :app:compileDebugKotlin FAILED w: Runtime JAR files in the classpath should have the same version. These files were found in the classpath:\n    /home/expo/.gradle/caches/transforms-3/f47aaec93b5ce8275ab670559bc858c7/transformed/jetified-kotlin-stdlib-jdk8-1.5.31.jar (version 1.5)\n    /home/expo/.gradle/caches/transforms-3/e30ac7ea6364b484c3bc3c923afeabd2/transformed/jetified-kotlin-stdlib-jdk7-1.5.31.jar (version 1.5)\n    /home/expo/.gradle/caches/transforms-3/d9723caca13068e43e601371da49b5b2/transformed/jetified-kotlin-stdlib-1.6.10.jar (version 1.6)\n    /home/expo/.gradle/caches/transforms-3/c5966235c8aa66a583bf2afcd9edd1b7/transformed/jetified-kotlin-stdlib-common-1.6.10.jar (version 1.6) w: Some runtime JAR files in the classpath have an incompatible version. Consider removing them from the classpath [stderr] e: /home/expo/.gradle/caches/transforms-3/c5966235c8aa66a583bf2afcd9edd1b7/transformed/jetified-kotlin-stdlib-common-1.6.10.jar!/META-INF/kotlin-stdlib-common.kotlin_module: Module was compiled with an incompatible version of Kotlin. The binary version of its metadata is 1.6.0, expected version is 1.4.0.\n
Run Code Online (Sandbox Code Playgroud)\n

2 - 将 Kotlin 推送至版本 1.6.10

\n

看到这一点,我进行了一些研究,并建议将 Kotlin 版本推送到 1.6.10:

\n
Task :expo-dev-launcher:compileDebugKotlin\n[stderr] Compilation with Kotlin compile daemon was not successful\n[stderr] java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: \n[stderr]    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: \n[stderr]    java.io.InvalidClassException: org.jetbrains.kotlin.incremental.IncrementalModuleInfo; local class incompatible: stream classdesc serialVersionUID = 1, local class serialVersionUID = 0\n[stderr]    at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:391)\n[stderr]    at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)\n[stderr]    at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)\n[stderr]    at java.base/java.security.AccessController.doPrivileged(Native Method)\n[stderr]    at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)\n[stderr]    at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:562)\n[stderr]    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:796)\n[stderr]    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:677)\n[stderr]    at java.base/java.security.AccessController.doPrivileged(Native Method)\n[stderr]    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:676)\n[stderr]    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)\n[stderr]    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)\n[stderr]    at java.base/java.lang.Thread.run(Thread.java:829)\n[stderr]    at java.rmi/sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:303)\n[stderr]    at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:279)\n[stderr]    at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:164)\n
Run Code Online (Sandbox Code Playgroud)\n

这导致我更新并运行expo upgradeexpo doctor查看是否有任何更新有效。这打开了潘多拉魔盒。升级到 expo SDK 45 也有其自身的问题(显然我有一些冲突的软件包引发以下错误):

\n
[stderr] Note: /home/expo/workingdir/build/app/node_modules/@sentry/react-native/android/src/main/java/io/sentry/react/RNSentryModule.java uses or overrides a deprecated API.\n[stderr] Note: Recompile with -Xlint:deprecation for details.\n> Task :app:compileDebugJavaWithJavac FAILED\n[stderr] /home/expo/workingdir/build/app/android/app/src/main/java/app/pana/MainApplication.java:6: error: package android.app does not exist\n[stderr] import android.app.Application;\n[stderr]                   ^\n[stderr] /home/expo/workingdir/build/app/android/app/src/main/java/app/pana/MainApplication.java:7: error: package android.content does not exist\n[stderr] import android.content.Context;\n[stderr]                       ^\n[stderr] /home/expo/workingdir/build/app/android/app/src/main/java/app/pana/MainApplication.java:8: error: package android.content.res does not exist\n[stderr] import android.content.res.Configuration;\n[stderr]                           ^\n[stderr] /home/expo/workingdir/build/app/android/app/src/main/java/app/pana/MainApplication.java:10: error: package android.webkit does not exist\n[stderr] import android.webkit.WebView;\n
Run Code Online (Sandbox Code Playgroud)\n

还有其他构建失败了expo-dev-client。我还知道 SDK 45 中的一个错误,即启用 Hermes 时会出现问题。我们正在使用 JSC。

\n

3 - 一堆其他的东西

\n

为了防止这个问题变得更长,我尝试过以下其他操作:

\n

A。distributionUrl将中的更改gradle-wrapper.properties为更新的 gradle 版本。

\n

b. 使用相应的 kotlin 版本更新并计算(org.jetbrains.kotlin:kotlin-gradle-plugin在 android/build.gradle 中)org.jetbrains.kotlin:kotlin-stdlib-jdk7(将其更改为 jdk8,什么都没有) 。org.jetbrains.kotlinx:kotlinx-coroutines-coreorg.jetbrains.kotlinx:kotlinx-coroutines-androidandroidx.core:core-ktx

\n

C。在声明中添加了这些实现debugImplementation

\n

d. 研究了Kotlin对应的React Native版本(不知道Expo的SDK 44 0.64版本是否支持Kotlin 1.6.10)。

\n

e. 使用 Android Studio 检查语法错误。

\n

F。跑得干净利落。

\n

G。和其他东西...

\n

有人知道吗?Expo GitHub 上似乎没有任何报道。

\n

Jos*_*e A 0

以下打包选项似乎有助于缓解一些问题

// android/app/build.gradle
android {
    // This fixes a bug when 
    // https://github.com/facebook/react-native/issues/33120
    packagingOptions {
        jniLibs.useLegacyPackaging = true
    }
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

3621 次

最近记录:

3 年,3 月 前