diff --git a/.yarn/patches/@react-native-gradle-plugin-npm-0.82.0-10aedc0588.patch b/.yarn/patches/@react-native-gradle-plugin-npm-0.82.0-10aedc0588.patch new file mode 100644 index 000000000000..4a729e21a42f --- /dev/null +++ b/.yarn/patches/@react-native-gradle-plugin-npm-0.82.0-10aedc0588.patch @@ -0,0 +1,15 @@ +diff --git a/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt b/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt +index 890e61c007d5b3e0a9a69d37ef10e8aa3ce5c6b6..91acd7b2930fedb4eca2461ba99287721ca1f38f 100644 +--- a/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt ++++ b/react-native-gradle-plugin/src/main/kotlin/com/facebook/react/ReactPlugin.kt +@@ -80,7 +80,9 @@ class ReactPlugin : Plugin { + configureRepositories(project) + } + +- configureReactNativeNdk(project, extension) ++ if(!project.gradle.startParameter.taskNames.any { it.contains("clean") }) { ++ configureReactNativeNdk(project, extension) ++ } + configureBuildConfigFieldsForApp(project, extension) + configureDevServerLocation(project) + configureBackwardCompatibilityReactMap(project) diff --git a/package.json b/package.json index 141335c03687..81b7447f4021 100644 --- a/package.json +++ b/package.json @@ -70,5 +70,8 @@ "react-native-builder-bob": "0.40.13", "shelljs": "0.10.0", "typescript": "5.8.3" + }, + "resolutions": { + "@react-native/gradle-plugin@npm:0.82.0": "patch:@react-native/gradle-plugin@npm%3A0.82.0#~/.yarn/patches/@react-native-gradle-plugin-npm-0.82.0-10aedc0588.patch" } } diff --git a/packages/react-native-reanimated/android/CMakeLists.txt b/packages/react-native-reanimated/android/CMakeLists.txt index d4731e6c9e5b..3f87cab8570b 100644 --- a/packages/react-native-reanimated/android/CMakeLists.txt +++ b/packages/react-native-reanimated/android/CMakeLists.txt @@ -45,6 +45,7 @@ file(GLOB_RECURSE REANIMATED_ANDROID_CPP_SOURCES CONFIGURE_DEPENDS find_package(fbjni REQUIRED CONFIG) find_package(ReactAndroid REQUIRED CONFIG) +find_package(react-native-worklets REQUIRED CONFIG) add_library(reanimated SHARED ${REANIMATED_COMMON_CPP_SOURCES} ${REANIMATED_ANDROID_CPP_SOURCES}) @@ -69,8 +70,7 @@ target_include_directories( "${REACT_NATIVE_DIR}/ReactCommon/runtimeexecutor" "${REACT_NATIVE_DIR}/ReactCommon/jsiexecutor" "${REACT_NATIVE_DIR}/ReactCommon/react/renderer/graphics/platform/cxx" - "${REACT_NATIVE_WORKLETS_DIR}/Common/cpp" - "${REACT_NATIVE_WORKLETS_DIR}/android/src/main/cpp") +) set_target_properties(reanimated PROPERTIES LINKER_LANGUAGE CXX) @@ -80,15 +80,6 @@ else() set(BUILD_TYPE "release") endif() -add_library(worklets SHARED IMPORTED) - -set_target_properties( - worklets - PROPERTIES - IMPORTED_LOCATION - "${REACT_NATIVE_WORKLETS_DIR}/android/build/intermediates/cmake/${BUILD_TYPE}/obj/${ANDROID_ABI}/libworklets.so" -) - set_target_properties(reanimated PROPERTIES LINKER_LANGUAGE CXX) # remove dead code sections set_target_properties(reanimated PROPERTIES LINK_FLAGS "-Wl,--gc-sections") @@ -108,4 +99,4 @@ target_link_libraries( ReactAndroid::jsi fbjni::fbjni android - worklets) + react-native-worklets::worklets) diff --git a/packages/react-native-reanimated/android/build.gradle b/packages/react-native-reanimated/android/build.gradle index 86bace765ea9..c62f275012b1 100644 --- a/packages/react-native-reanimated/android/build.gradle +++ b/packages/react-native-reanimated/android/build.gradle @@ -198,7 +198,6 @@ android { "-DREACT_NATIVE_MINOR_VERSION=${REACT_NATIVE_MINOR_VERSION}", "-DANDROID_TOOLCHAIN=clang", "-DREACT_NATIVE_DIR=${toPlatformFileString(reactNativeRootDir.path)}", - "-DREACT_NATIVE_WORKLETS_DIR=${toPlatformFileString(reactNativeWorkletsRootDir.path)}", "-DIS_REANIMATED_EXAMPLE_APP=${IS_REANIMATED_EXAMPLE_APP}", "-DREANIMATED_PROFILING=${REANIMATED_PROFILING}", "-DREANIMATED_VERSION=${REANIMATED_VERSION}", diff --git a/packages/react-native-worklets/android/build.gradle b/packages/react-native-worklets/android/build.gradle index 2e5ad454afb1..61c565b3b26c 100644 --- a/packages/react-native-worklets/android/build.gradle +++ b/packages/react-native-worklets/android/build.gradle @@ -150,6 +150,8 @@ apply plugin: "com.android.library" apply plugin: "maven-publish" apply plugin: "de.undercouch.download" +apply from: "./fix-prefab.gradle" + android { compileSdkVersion safeExtGet("compileSdkVersion", 34) diff --git a/packages/react-native-worklets/android/fix-prefab.gradle b/packages/react-native-worklets/android/fix-prefab.gradle new file mode 100644 index 000000000000..fcf502a0ca48 --- /dev/null +++ b/packages/react-native-worklets/android/fix-prefab.gradle @@ -0,0 +1,53 @@ +tasks.configureEach { task -> + // Make sure that we generate our prefab publication file only after having built the native library + // so that not a header publication file, but a full configuration publication will be generated, which + // will include the .so file + + def prefabConfigurePattern = ~/^prefab(.+)ConfigurePackage$/ + def matcher = task.name =~ prefabConfigurePattern + if (matcher.matches()) { + def variantName = matcher[0][1] + task.outputs.upToDateWhen { false } + task.dependsOn("externalNativeBuild${variantName}") + } +} + +afterEvaluate { + def abis = reactNativeArchitectures() + rootProject.allprojects.each { proj -> + + if (proj === rootProject) return + + def dependsOnThisLib = proj.configurations.any { config -> + config.dependencies.any { dep -> + dep.group == project.group && dep.name == project.name + } + } + + if (!dependsOnThisLib && proj != project) return + + if (!proj.plugins.hasPlugin('com.android.application') && !proj.plugins.hasPlugin('com.android.library')) { + return + } + + def variants = proj.android.hasProperty('applicationVariants') ? proj.android.applicationVariants : proj.android.libraryVariants + // Touch the prefab_config.json files to ensure that in ExternalNativeJsonGenerator.kt we will re-trigger the prefab CLI to + // generate a libnameConfig.cmake file that will contain our native library (.so). + // See this condition: https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:build-system/gradle-core/src/main/java/com/android/build/gradle/tasks/ExternalNativeJsonGenerator.kt;l=207-219?q=createPrefabBuildSystemGlue + variants.all { variant -> + def variantName = variant.name + abis.each { abi -> + def searchDir = new File(proj.projectDir, ".cxx/${variantName}") + if (!searchDir.exists()) return + def matches = [] + searchDir.eachDir { randomDir -> + def prefabFile = new File(randomDir, "${abi}/prefab_config.json") + if (prefabFile.exists()) matches << prefabFile + } + matches.each { prefabConfig -> + prefabConfig.setLastModified(System.currentTimeMillis()) + } + } + } + } +} diff --git a/yarn.lock b/yarn.lock index f725c7271b7f..d48461c9f5e3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7072,6 +7072,13 @@ __metadata: languageName: node linkType: hard +"@react-native/gradle-plugin@patch:@react-native/gradle-plugin@npm%3A0.82.0#~/.yarn/patches/@react-native-gradle-plugin-npm-0.82.0-10aedc0588.patch": + version: 0.82.0 + resolution: "@react-native/gradle-plugin@patch:@react-native/gradle-plugin@npm%3A0.82.0#~/.yarn/patches/@react-native-gradle-plugin-npm-0.82.0-10aedc0588.patch::version=0.82.0&hash=60e1b9" + checksum: 10/493d986f2b23678dacd32a5e20a1c4b94e981b5d1abdf6fd35a9fb195b61900250dabb05d54e64af7e779c5b2e55cb96f431c16db0ba326ae8c0d43c5956616d + languageName: node + linkType: hard + "@react-native/js-polyfills@npm:0.79.6": version: 0.79.6 resolution: "@react-native/js-polyfills@npm:0.79.6"