You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native Kotlin Android项目中R与BuildConfig引用未解决

解决React Native Kotlin项目中Unresolved reference: R和BuildConfig错误

版本信息

  • React Native版本: 0.74.3
  • Kotlin版本: 1.9.23
  • Gradle版本: 8.6
  • Android Studio版本: 最新

代码片段

MainActivity.kt

package com.thediamlaundry.diamapp

import android.os.Build
import android.os.Bundle

import com.facebook.react.ReactActivity
import com.facebook.react.ReactActivityDelegate
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.fabricEnabled
import com.facebook.react.defaults.DefaultReactActivityDelegate

import expo.modules.ReactActivityDelegateWrapper

class MainActivity : ReactActivity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    // Set the theme to AppTheme BEFORE onCreate to support
    // coloring the background, status bar, and navigation bar.
    // This is required for expo-splash-screen.
    setTheme(R.style.AppTheme);
    super.onCreate(null)
  }

  /**
   * Returns the name of the main component registered from JavaScript. This is used to schedule
   * rendering of the component.
   */
  override fun getMainComponentName(): String = "main"

  /**
   * Returns the instance of the [ReactActivityDelegate]. We use [DefaultReactActivityDelegate]
   * which allows you to enable New Architecture with a single boolean flags [fabricEnabled]
   */
  override fun createReactActivityDelegate(): ReactActivityDelegate {
    return ReactActivityDelegateWrapper(
          this,
          BuildConfig.IS_NEW_ARCHITECTURE_ENABLED,
          object : DefaultReactActivityDelegate(
              this,
              mainComponentName,
              fabricEnabled
          ){})
  }

  /**
    * Align the back button behavior with Android S
    * where moving root activities to background instead of finishing activities.
    */
  override fun invokeDefaultOnBackPressed() {
      if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
          if (!moveTaskToBack(false)) {
              // For non-root activities, use the default implementation to finish them.
              super.invokeDefaultOnBackPressed()
          }
          return
      }

      // Use the default back button implementation on Android S
      // because it's doing more than [Activity.moveTaskToBack] in fact.
      super.invokeDefaultOnBackPressed()
  }
}

MainApplication.kt

package com.thediamlaundry.diamapp

import android.app.Application
import android.content.res.Configuration

import com.facebook.react.PackageList
import com.facebook.react.ReactApplication
import com.facebook.react.ReactNativeHost
import com.facebook.react.ReactPackage
import com.facebook.react.ReactHost
import com.facebook.react.defaults.DefaultNewArchitectureEntryPoint.load
import com.facebook.react.defaults.DefaultReactNativeHost
import com.facebook.soloader.SoLoader

import expo.modules.ApplicationLifecycleDispatcher
import expo.modules.ReactNativeHostWrapper

class MainApplication : Application(), ReactApplication {

  override val reactNativeHost: ReactNativeHost = ReactNativeHostWrapper(
        this,
        object : DefaultReactNativeHost(this) {
          override fun getPackages(): List<ReactPackage> {
            // Packages that cannot be autolinked yet can be added manually here, for example:
            // packages.add(new MyReactNativePackage());
            return PackageList(this).packages
          }

          override fun getJSMainModuleName(): String = ".expo/.virtual-metro-entry"

          override fun getUseDeveloperSupport(): Boolean = BuildConfig.DEBUG

          override val isNewArchEnabled: Boolean = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED
          override val isHermesEnabled: Boolean = BuildConfig.IS_HERMES_ENABLED
      }
  )

  override val reactHost: ReactHost
    get() = ReactNativeHostWrapper.createReactHost(applicationContext, reactNativeHost)

  override fun onCreate() {
    super.onCreate()
    SoLoader.init(this, false)
    if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
      // If you opted-in for the New Architecture, we load the native entry point for this app.
      load()
    }
    ApplicationLifecycleDispatcher.onApplicationCreate(this)
  }

  override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig)
  }
}

构建错误信息

> Task :app:compileReleaseKotlin FAILED
e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainActivity.kt:18:14 Unresolved reference: R
e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainActivity.kt:35:11 Unresolved reference: BuildConfig
e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainApplication.kt:31:60 Unresolved reference: BuildConfig
e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainApplication.kt:33:52 Unresolved reference: BuildConfig
e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainApplication.kt:34:51 Unresolved reference: BuildConfig
e: file:///Users/pratikbhattarai/Documents/GitHub/diamFrontend/diamApp/android/app/src/main/java/com/thediamlaundry/diamapp/MainApplication.kt:44:9 Unresolved reference: BuildConfig

解决方案

  • 排查资源文件错误:R类无法生成通常是res目录下的资源文件(布局、样式、drawable等)存在语法问题,比如XML标签未闭合、资源命名包含大写字母或特殊字符。打开res目录下的文件,修复所有红标提示的错误后重新同步Gradle。
  • 确认BuildConfig生成配置:在app模块的build.gradle.kts(或build.gradle)中,确保开启BuildConfig生成,并正确配置所需字段:
    android {
        buildFeatures {
            buildConfig = true // Gradle 7+默认开启,但需确认未被关闭
        }
        defaultConfig {
            applicationId "com.thediamlaundry.diamapp"
            buildConfigField("boolean", "IS_NEW_ARCHITECTURE_ENABLED", "false")
            buildConfigField("boolean", "IS_HERMES_ENABLED", "true")
        }
    }
    
  • 执行完整清理重建流程:
    1. 运行./gradlew clean清理构建缓存
    2. 运行./gradlew assembleRelease --refresh-dependencies强制刷新依赖并重新构建
    3. 重启Android Studio,清除IDE缓存(路径:File → Invalidate Caches... → 勾选Clear file system cache and local history → Invalidate and Restart)
  • 检查包名一致性:确认MainActivity.kt、MainApplication.kt的包名com.thediamlaundry.diamapp与app模块build.gradle中的applicationId完全一致,包名不匹配会导致R和BuildConfig类无法生成到对应包路径下。
  • 修复Expo原生代码兼容性:由于项目使用Expo,执行npx expo prebuild --clean重新生成Android原生代码文件,确保Expo模块与React Native版本兼容。若问题仍存在,尝试更新expo相关依赖到与React Native 0.74.3匹配的最新版本。

内容的提问来源于stack exchange,提问作者pratik bhattarai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:14:54