diff --git a/.github/workflows/integration-tests.yml b/.github/workflows/integration-tests.yml index b8dcdc8a6c..bbccd9af67 100644 --- a/.github/workflows/integration-tests.yml +++ b/.github/workflows/integration-tests.yml @@ -238,18 +238,8 @@ jobs: key: android-build-dir-${{ hashFiles('src/**', 'react-native/android/**', 'vendor/**') }} restore-keys: | android-build-dir- - - uses: actions/cache@v2 - name: Restore Android librealm.so from cache - id: cache-android-so - with: - path: react-native/android/**/librealm.so - key: android-so-${{ hashFiles('src/**', 'react-native/android/**', 'vendor/**') }} - - run: npm ci if: ${{ steps.cache-node-modules.outputs.cache-hit != 'true' }} - # Build the Android shared object file (if cache missed) - - run: ANDROID_NDK=$ANDROID_NDK_HOME node scripts/build-android.js --arch=x86 --build-type=${{ matrix.type }} - if: ${{ steps.cache-android-so.outputs.cache-hit != 'true' }} # Bootstrap lerna sub-packages (builds the packages, the Realm JS native module and pod install) - run: npx lerna bootstrap --scope '{realm-integration-tests,realm-react-native-tests}' --include-dependencies # Run the tests diff --git a/CMakeLists.txt b/CMakeLists.txt index 2df55d01dd..dc51d93aa9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,6 +39,21 @@ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>") list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") +set(PACKAGE_ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR}) + +# Load dependency info from dependencies.list into REALM_FOO_VERSION variables. +set(DEPENDENCIES_FILE "dependencies.list" CACHE STRING "path to dependencies list") +file(STRINGS ${DEPENDENCIES_FILE} DEPENDENCIES) +foreach(DEPENDENCY IN LISTS DEPENDENCIES) + string(REGEX MATCHALL "([^=]+)" COMPONENT_AND_VERSION ${DEPENDENCY}) + list(GET COMPONENT_AND_VERSION 0 COMPONENT) + list(GET COMPONENT_AND_VERSION 1 VERSION) + if(COMPONENT MATCHES "_VERSION$") + message(DEBUG "Setting ${COMPONENT}=${VERSION}") + set(${COMPONENT} ${VERSION}) + endif() +endforeach() + if(DEFINED CMAKE_JS_VERSION) include(NodeJSTargets) endif() @@ -53,6 +68,57 @@ if(REALM_JS_BUILD_CORE_FROM_SOURCE) endif() add_subdirectory(vendor/realm-core EXCLUDE_FROM_ALL) +else() + if(NOT ANDROID) + message(FATAL_ERROR "Building with Realm Core prebuilt binaries is only supported on Android") + endif() + + message(STATUS "Using Realm Core ${REALM_CORE_VERSION} prebuilt binaries") + + set(REALM_CORE_PLATFORM Android-${ANDROID_ABI}) + # TODO: Revising the "devel" part of the following line + set(REALM_CORE_FILENAME realm-${CMAKE_BUILD_TYPE}-v${REALM_CORE_VERSION}-${REALM_CORE_PLATFORM}-devel) + set(REALM_CORE_PATH ${CMAKE_BINARY_DIR}/${REALM_CORE_FILENAME}) + set(REALM_CORE_CMAKE_CONFIG ${REALM_CORE_PATH}/lib/cmake/Realm/RealmConfig.cmake) + if(EXISTS ${REALM_CORE_CMAKE_CONFIG}) + message(STATUS "Skipping download of Realm Core (it's already there)") + else() + set(REALM_CORE_ARCHIVE_PATH ${CMAKE_BINARY_DIR}/${REALM_CORE_FILENAME}.tar.gz) + message(STATUS "Downloading Realm Core prebuilt binaries") + file(DOWNLOAD "https://static.realm.io/downloads/core/${REALM_CORE_FILENAME}.tar.gz" "${REALM_CORE_ARCHIVE_PATH}" STATUS DOWNLOAD_STATUS) + # Separate the returned status code, and error message. + list(GET DOWNLOAD_STATUS 0 STATUS_CODE) + list(GET DOWNLOAD_STATUS 1 ERROR_MESSAGE) + # Check if download was successful. + if(${STATUS_CODE} EQUAL 0) + message(STATUS "Download of Realm Core completed successfully") + else() + message(FATAL_ERROR "Error occurred during download: ${ERROR_MESSAGE} (${STATUS_CODE})") + endif() + + # TODO: Await a core release with fixed binaries and uri.hpp file and remove this + if(${ANDROID_ABI} MATCHES "^x86") + set(REALM_CORE_ARCHIVE_PATH "/Users/kraen.hansen/Downloads/realm-Debug-v11.4.1-48-g1787cfadf-Android-${ANDROID_ABI}-devel.tar.gz") + else() + message(FATAL_ERROR "Unsupported ANDROID_ABI (got ${ANDROID_ABI})") + endif() + + message(STATUS "Uncompressing Realm Core") + file(MAKE_DIRECTORY ${REALM_CORE_PATH}) + execute_process(COMMAND "${CMAKE_COMMAND}" + -E tar xfz ${REALM_CORE_ARCHIVE_PATH} + WORKING_DIRECTORY ${REALM_CORE_PATH} + ) + # TODO: Solve this + execute_process(COMMAND "${CMAKE_COMMAND}" + -E copy ${PACKAGE_ROOT_DIR}/vendor/realm-core/src/realm/util/uri.hpp ${REALM_CORE_PATH}/include/realm/util/uri.hpp + ) + endif() + + message(STATUS "Incuding Realm Core CMAKE configuration") + include(${REALM_CORE_CMAKE_CONFIG}) + + # set_property(TARGET realm PROPERTY INTERFACE_INCLUDE_DIRECTORIES ${REALM_CORE_PATH}/include) endif() add_subdirectory(src) diff --git a/Jenkinsfile b/Jenkinsfile index 553213a4b0..b96b564198 100755 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -92,7 +92,6 @@ stage('build') { parallelExecutors["Windows ia32 NAPI ${nodeTestVersion}"] = buildWindows(nodeTestVersion, 'ia32') parallelExecutors["Windows x64 NAPI ${nodeTestVersion}"] = buildWindows(nodeTestVersion, 'x64') - parallelExecutors["Android RN"] = buildAndroid() parallelExecutors["iOS RN"] = buildiOS() parallel parallelExecutors @@ -291,25 +290,6 @@ def inAndroidContainer(workerFunction) { } } -def buildAndroid() { - return { - myNode('docker') { - unstash 'source' - def image = buildDockerEnv('ci/realm-js:android-build', '-f Dockerfile.android') - image.inside('-e HOME=/tmp') { - // Using --ignore-scripts to skip building for node - sh "./scripts/nvm-wrapper.sh ${nodeTestVersion} npm ci --ignore-scripts" - sh "./scripts/nvm-wrapper.sh ${nodeTestVersion} node scripts/build-android.js" - } - dir('react-native/android/src/main') { - // Uncomment this when testing build changes if you want to be able to download pre-built artifacts from Jenkins. - // archiveArtifacts('jniLibs/**') - stash includes: 'jniLibs/**', name: 'android-jnilibs' - } - } - } -} - def publish(dependencies, tag) { myNode('docker') { diff --git a/contrib/building.md b/contrib/building.md index ecc76255a0..6275f952d7 100644 --- a/contrib/building.md +++ b/contrib/building.md @@ -171,12 +171,11 @@ Note: If you have cloned the repo previously make sure you remove your `node_mod ### Building for iOS -* Run `./scripts/build-ios.sh` from the `realm-js` root directory +Run `./scripts/build-ios.sh` from the `realm-js` root directory ### Building for Android -* Run `node scripts/build-android.js` from the `realm-js` root directory - - The compiled version of the Android module is output to `/android` +Building for Android is deferred, such that compilation happens on the users machine when building their app. ### Building for Node.js diff --git a/contrib/how-to-release.md b/contrib/how-to-release.md index cc66dfbd17..49dd317f05 100644 --- a/contrib/how-to-release.md +++ b/contrib/how-to-release.md @@ -19,7 +19,6 @@ The procedure is: - Tag the commit: `git tag vX.Y.Z` - Push the changes: `git push origin --tag master` (if you are releasing from another branch, then use that instead of `master`) - Our CI system will build and push binaries for node.js. You can follow the progress at https://ci.realm.io. Once the "Publish" stage is completed, the binaries are uploaded. -- Build Android binaries: `node ./scripts/build-android.js` - Build iOS binaries: `./scripts/build-ios.sh` - Publish the package: `npm publish` - Manually create a new release on Github diff --git a/integration-tests/README.md b/integration-tests/README.md index e19f71d960..28dd4b591c 100644 --- a/integration-tests/README.md +++ b/integration-tests/README.md @@ -16,11 +16,7 @@ Building the native module (xcframework) for the iOS simulator in debug mode: ./scripts/build-ios.sh -c Debug simulator ``` -Building the native module (.so) for the Android simulator in debug mode: - -```bash -node scripts/build-android.js --arch=x86 --build-type=Debug -``` +Building the native module (.so) for the Android simulator will happen once the integration test app is being built. ## Installing the integration tests and environments diff --git a/react-native/android/build.gradle b/react-native/android/build.gradle index 06f03c81f6..03e0848e94 100644 --- a/react-native/android/build.gradle +++ b/react-native/android/build.gradle @@ -47,6 +47,31 @@ android { defaultConfig { minSdkVersion rootProject.hasProperty("minSdkVersion") ? rootProject.minSdkVersion : 16 targetSdkVersion rootProject.hasProperty("targetSdkVersion") ? rootProject.targetSdkVersion : 28 + externalNativeBuild { + cmake { + arguments '-DANDROID_STL=c++_shared', '-DREALM_JS_BUILD_CORE_FROM_SOURCE=off' + targets 'realm-js-android' + cppFlags '' + abiFilters 'x86', 'x86_64' + } + } + } + buildTypes { + debug { + jniDebuggable true + } + } + externalNativeBuild { + cmake { + path file('../../CMakeLists.txt') + version '3.18.1' + } + } + + packagingOptions { + excludes = [ + "**/libc++_shared.so" + ] } tasks.withType(JavaCompile) { diff --git a/scripts/build-android.js b/scripts/build-android.js deleted file mode 100644 index 54cdcf8b6e..0000000000 --- a/scripts/build-android.js +++ /dev/null @@ -1,221 +0,0 @@ -//////////////////////////////////////////////////////////////////////////// -// -// Copyright 2021 Realm Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// -//////////////////////////////////////////////////////////////////////////// - -const commandLineArgs = require("command-line-args"); -const fs = require("fs-extra"); -const path = require("path"); -const exec = require("child_process").execFileSync; -const compareVersions = require("compare-versions"); - -//simple validation of current directory. -const rnDir = path.resolve(process.cwd(), "react-native"); -if (!fs.existsSync(rnDir)) { - throw new Error("This script needs to be run at the root dir of the project"); -} - -const copyOutputPath = path.resolve(process.cwd(), "react-native", "android", "src", "main", "jniLibs"); - -const buildTypes = ["Debug", "Release", "RelWithDebInfo", "MinSizeRel"]; -let architectures = ["x86", "armeabi-v7a", "arm64-v8a", "x86_64"]; -const optionDefinitions = [ - { name: "arch", type: validateArchitectures, multiple: false, description: "Build only for a single architecture" }, - { name: "clean", type: Boolean, defaultValue: false, multiple: false, description: "Rebuild from scratch" }, - { - name: "build-type", - type: validateBuildType, - defaultValue: "Release", - multiple: false, - description: "CMAKE_BUILD_TYPE: Debug, Release, RelWithDebInfo, MinSizeRel", - }, -]; -const options = commandLineArgs(optionDefinitions, { camelCase: true }); - -if (options.arch) { - architectures = [options.arch]; -} - -const buildType = options.buildType; - -const ndkPath = process.env["ANDROID_NDK"]; -if (!ndkPath) { - throw Error("ANDROID_NDK environment variable not set"); -} - -const sdkPath = getAndroidSdkPath(); -const cmakePath = getCmakePath(sdkPath); -const cmakeVersion = getCmakeVersion(sdkPath); - -const buildPath = path.resolve(process.cwd(), "build-realm-android"); -if (options.clean) { - if (fs.existsSync(buildPath)) { - fs.removeSync(buildPath); - } -} - -if (!fs.existsSync(buildPath)) { - fs.mkdirSync(buildPath); -} -//shared root dir to download jsc once for all architectures -const jscDir = path.resolve(buildPath, "jsc-android"); - -for (const arch of architectures) { - console.log(`\nBuilding Realm JS Android for ${arch} (${buildType})`); - console.log("======================================="); - //create a build dir per architecture - const archBuildDir = path.resolve(buildPath, arch); - if (!fs.existsSync(archBuildDir)) { - fs.mkdirSync(archBuildDir); - } - - let args = [ - cmakePath, - "-GNinja", - `-DANDROID_NDK=${ndkPath}`, - `-DANDROID_ABI=${arch}`, - `-DCMAKE_MAKE_PROGRAM=${sdkPath}/cmake/${cmakeVersion}/bin/ninja`, - `-DCMAKE_TOOLCHAIN_FILE=${ndkPath}/build/cmake/android.toolchain.cmake`, - "-DANDROID_TOOLCHAIN=clang", - "-DANDROID_NATIVE_API_LEVEL=16", - `-DCMAKE_BUILD_TYPE=${buildType}`, - "-DANDROID_STL=c++_static", - `-DJSC_ROOT_DIR=${jscDir}`, - process.cwd(), - ]; - exec(cmakePath, args, { cwd: archBuildDir, stdio: "inherit" }); - - //cwd is the archBuildDir here, hence build the current dir with "--build ." - args = ["--build", "."]; - exec(cmakePath, args, { cwd: archBuildDir, stdio: "inherit" }); - - copyOutput(arch, archBuildDir); -} - -generateVersionFile(); - -function generateVersionFile() { - const targetFile = path.resolve( - process.cwd(), - "react-native", - "android", - "src", - "main", - "java", - "io", - "realm", - "react", - "Version.java", - ); - const version = getVersion(); - const versionFileContents = `package io.realm.react; - -public class Version { - public static final String VERSION = "${version}"; -} -`; - - fs.writeFileSync(targetFile, versionFileContents); -} - -function getVersion() { - const depencenciesListFile = path.resolve(process.cwd(), "dependencies.list"); - const contents = fs.readFileSync(depencenciesListFile, "UTF-8"); - const lines = contents.split(/\r?\n/); - const versionValue = lines.find((line) => line.startsWith("VERSION=")); - if (!versionValue) { - throw new Error("Realm version not found. Invalid dependencies.list file"); - } - - const version = versionValue.split("=")[1]; - if (!version) { - throw new Error("Realm version not found. Invalid version value in dependencies.list file"); - } - - return version; -} - -function copyOutput(arch, buildDir) { - const outFile = path.resolve(buildDir, "src", "android", "libs", arch, "librealm.so"); - if (!fs.existsSync(outFile)) { - throw new Error(`Build output file not found: ${outFile}`); - } - - const archDir = path.resolve(copyOutputPath, arch); - if (!fs.existsSync(archDir)) { - fs.mkdirSync(archDir, { recursive: true }); - } - - const targetFile = path.resolve(archDir, "librealm.so"); - console.log(`Copying build file \n${outFile} to \n${targetFile}`); - fs.copyFileSync(outFile, targetFile); -} - -function getAndroidSdkPath() { - if ("ANDROID_SDK_ROOT" in process.env) { - console.log("Using ANDROID_SDK_ROOT env variable"); - return process.env["ANDROID_SDK_ROOT"]; - } - - if ("ANDROID_SDK" in process.env) { - console.log("Using ANDROID_SDK env variable"); - return process.env["ANDROID_SDK"]; - } - - if ("ANDROID_HOME" in process.env) { - console.log("Using ANDROID_HOME env variable"); - return process.env["ANDROID_HOME"]; - } - - throw new Error("Android SDK not found. ANDROID_SDK or ANDROID_HOME or ANDROID_SDK_ROOT needs to be set"); -} - -function getCmakePath() { - if ("CMAKE_PATH" in process.env) { - console.log("Using cmake from CMAKE_PATH environment variable"); - return process.env["CMAKE_PATH"]; - } - - return process.platform === "win32" ? "cmake.exe" : "cmake"; -} - -function getCmakeVersion(sdkPath) { - const cmakePath = `${sdkPath}/cmake`; - let dirs = fs.readdirSync(cmakePath); - if (dirs.length === 0) { - throw new Error(`No CMake installation found in ${cmakePath}`); - } - const version = dirs.sort(compareVersions)[dirs.length - 1]; - console.log(`Found CMake ${version} in ${cmakePath}`); - - return version; -} - -function validateBuildType(buildTypeOption) { - if (!buildTypes.includes(buildTypeOption)) { - throw new Error(`Invalid build type: ${buildTypeOption}. Supported architectures ${buildTypes}`); - } - - return buildTypeOption; -} - -function validateArchitectures(arch) { - if (!architectures.includes(arch)) { - throw new Error(`"Invalid architecture ${arch}. Supported architectures ${architectures}`); - } - - return arch; -} diff --git a/scripts/test.sh b/scripts/test.sh index 88e1a42a65..bbc55cb94d 100755 --- a/scripts/test.sh +++ b/scripts/test.sh @@ -355,10 +355,6 @@ case "$TARGET" in npm ci --ignore-scripts npm run check-environment - # building only for x86 emulator to speed CI - echo "building android binaries" - node scripts/build-android.js --arch=x86 - pushd tests/ReactTestApp echo "installing ReactTestApp dependencies" npm ci --no-optional diff --git a/src/android/CMakeLists.txt b/src/android/CMakeLists.txt index 9fb70df4f1..97b2b5429f 100644 --- a/src/android/CMakeLists.txt +++ b/src/android/CMakeLists.txt @@ -1,3 +1,10 @@ +cmake_minimum_required(VERSION 3.18.1) + +set(REACT_NATIVE_ROOT_DIR "${PACKAGE_ROOT_DIR}/node_modules/react-native") +set(REACT_NATIVE_AAR_DIR "${CMAKE_BINARY_DIR}/../react-native-aar") + +set(JSI_HEADER_DIR "${REACT_NATIVE_ROOT_DIR}/ReactCommon/jsi") + add_library(realm-js-android SHARED # $ hack.cpp @@ -9,8 +16,6 @@ add_library(realm-js-android SHARED set_target_properties(realm-js-android PROPERTIES OUTPUT_NAME "realm" - PREFIX "lib" - SUFFIX ".so" ) set_target_properties(realm-js-android diff --git a/src/js_app.hpp b/src/js_app.hpp index ae63ac6a24..17666d42bd 100644 --- a/src/js_app.hpp +++ b/src/js_app.hpp @@ -181,9 +181,7 @@ void AppClass::constructor(ContextType ctx, ObjectType this_object, Arguments throw std::runtime_error("Expected either a configuration object or an app id string."); } - config.transport_generator = [ctx = Protected(Context::get_global_context(ctx)), eld=NetworkTransport::make_dispatcher()] { - return AppClass::transport_generator(ctx, eld); - }; + config.transport = AppClass::transport_generator(Protected(Context::get_global_context(ctx)), NetworkTransport::make_dispatcher()); config.platform = platform_os; config.platform_version = platform_version; diff --git a/src/js_sync.hpp b/src/js_sync.hpp index d7c40ef58a..c6e70bc0b0 100644 --- a/src/js_sync.hpp +++ b/src/js_sync.hpp @@ -415,14 +415,14 @@ void SessionClass::add_progress_notification(ContextType ctx, ObjectType this if (auto session = get_internal>(ctx, this_object)->lock()) { - std::string direction = Value::validated_to_string(ctx, args[0], "direction"); + std::string direction_str = Value::validated_to_string(ctx, args[0], "direction"); std::string mode = Value::validated_to_string(ctx, args[1], "mode"); - SyncSession::NotifierType notifierType; - if (direction == "download") { - notifierType = SyncSession::NotifierType::download; + SyncSession::ProgressDirection direction; + if (direction_str == "download") { + direction = SyncSession::ProgressDirection::download; } - else if (direction == "upload") { - notifierType = SyncSession::NotifierType::upload; + else if (direction_str == "upload") { + direction = SyncSession::ProgressDirection::upload; } else { throw std::invalid_argument("Invalid argument 'direction'. Only 'download' and 'upload' progress notification directions are supported"); @@ -458,7 +458,7 @@ void SessionClass::add_progress_notification(ContextType ctx, ObjectType this progressFunc = std::move(progress_handler); - auto registrationToken = session->register_progress_notifier(std::move(progressFunc), notifierType, is_streaming); + auto registrationToken = session->register_progress_notifier(std::move(progressFunc), direction, is_streaming); auto syncSession = create_object>(ctx, new WeakSession(session)); PropertyAttributes attributes = ReadOnly | DontEnum | DontDelete; Object::set_property(ctx, callback_function, "_syncSession", syncSession, attributes); @@ -758,7 +758,7 @@ void SyncClass::set_sync_logger(ContextType ctx, ObjectType this_object, Argu }; auto sync_logger = common::logger::Logger::build_sync_logger(show_logs); - app->sync_manager()->set_logger_factory( *sync_logger ); + app->sync_manager()->set_logger_factory(sync_logger); } template diff --git a/src/logger.hpp b/src/logger.hpp index 3b880a775c..464ba42309 100644 --- a/src/logger.hpp +++ b/src/logger.hpp @@ -112,24 +112,6 @@ class SyncLoggerDelegator : public util::RootLogger { Delegated loggerDelegate; }; -class SyncLoggerDelegatorFactory : public realm::SyncLoggerFactory { - public: - SyncLoggerDelegatorFactory(Delegated logs_fn) : logs_fn{logs_fn} {} - - std::unique_ptr make_logger( - realm::util::Logger::Level level) { - auto logger = std::make_unique(); - - logger->set_level_threshold(level); - logger->delegate(logs_fn); - - return logger; - } - - private: - Delegated logs_fn; -}; - class Logger { private: // Warning: If this grows to big (for example: another method) we should @@ -157,8 +139,13 @@ class Logger { throw std::runtime_error("Bad log level"); } - static SyncLoggerDelegatorFactory* build_sync_logger(Delegated& log_fn) { - return new SyncLoggerDelegatorFactory(log_fn); + static SyncClientConfig::LoggerFactory build_sync_logger(Delegated& log_fn) { + return [&log_fn] (realm::util::Logger::Level level) { + auto logger = std::make_unique(); + logger->set_level_threshold(level); + logger->delegate(log_fn); + return logger; + }; } }; diff --git a/tests/ReactTestApp/android/app/src/debug/java/com/reacttestapp/ReactNativeFlipper.java b/tests/ReactTestApp/android/app/src/debug/java/com/reacttestapp/ReactNativeFlipper.java index c3ee35185a..0004442262 100644 --- a/tests/ReactTestApp/android/app/src/debug/java/com/reacttestapp/ReactNativeFlipper.java +++ b/tests/ReactTestApp/android/app/src/debug/java/com/reacttestapp/ReactNativeFlipper.java @@ -25,7 +25,7 @@ import okhttp3.OkHttpClient; public class ReactNativeFlipper { - public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { + public static void initializeFlipper(Context context, final ReactInstanceManager reactInstanceManager) { if (FlipperUtils.shouldEnableFlipper(context)) { final FlipperClient client = AndroidFlipperClient.getInstance(context); @@ -35,7 +35,7 @@ public static void initializeFlipper(Context context, ReactInstanceManager react client.addPlugin(new SharedPreferencesFlipperPlugin(context)); client.addPlugin(CrashReporterPlugin.getInstance()); - NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); + final NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); NetworkingModule.setCustomClientBuilder( new NetworkingModule.CustomClientBuilder() { @Override diff --git a/tests/ReactTestApp/android/build.gradle b/tests/ReactTestApp/android/build.gradle index 23ff1370d8..d160262a9e 100644 --- a/tests/ReactTestApp/android/build.gradle +++ b/tests/ReactTestApp/android/build.gradle @@ -13,7 +13,7 @@ buildscript { jcenter() } dependencies { - classpath('com.android.tools.build:gradle:4.1.2') + classpath 'com.android.tools.build:gradle:7.1.0-alpha13' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/tests/ReactTestApp/android/gradle/wrapper/gradle-wrapper.properties b/tests/ReactTestApp/android/gradle/wrapper/gradle-wrapper.properties index 14e30f7416..a0f7639f7d 100644 --- a/tests/ReactTestApp/android/gradle/wrapper/gradle-wrapper.properties +++ b/tests/ReactTestApp/android/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/vendor/realm-core b/vendor/realm-core index 23f60515a0..539e2427e0 160000 --- a/vendor/realm-core +++ b/vendor/realm-core @@ -1 +1 @@ -Subproject commit 23f60515a00f076a9e3f2dc672fe1ae07601ee90 +Subproject commit 539e2427e09f7d19ba712a08ba27f490d226bf72