diff --git a/RNTester/android/app/build.gradle b/RNTester/android/app/build.gradle index 1a6628286e3485..6366c9572e003a 100644 --- a/RNTester/android/app/build.gradle +++ b/RNTester/android/app/build.gradle @@ -92,7 +92,6 @@ def enableProguardInReleaseBuilds = true android { compileSdkVersion 28 - buildToolsVersion "28.0.2" defaultConfig { applicationId "com.facebook.react.uiapp" diff --git a/ReactAndroid/build.gradle b/ReactAndroid/build.gradle index 23a84bfbf04f29..ba4d40f55f5dd0 100644 --- a/ReactAndroid/build.gradle +++ b/ReactAndroid/build.gradle @@ -26,7 +26,6 @@ def thirdPartyNdkDir = new File("$buildDir/third-party-ndk") // - double-conversion-1.1.6 // - folly-deprecate-dynamic-initializer // - glog-0.3.5 -// - jsc-headers def dependenciesPath = System.getenv("REACT_NATIVE_DEPENDENCIES") // The Boost library is a very large download (>100MB). @@ -68,7 +67,7 @@ task prepareDoubleConversion(dependsOn: dependenciesPath ? [] : [downloadDoubleC from dependenciesPath ?: tarTree(downloadDoubleConversion.dest) from 'src/main/jni/third-party/double-conversion/Android.mk' include "double-conversion-${DOUBLE_CONVERSION_VERSION}/src/**/*", 'Android.mk' - filesMatching('*/src/**/*', {fname -> fname.path = "double-conversion/${fname.name}"}) + filesMatching('*/src/**/*', { fname -> fname.path = "double-conversion/${fname.name}" }) includeEmptyDirs = false into "$thirdPartyNdkDir/double-conversion" } @@ -84,17 +83,17 @@ task prepareFolly(dependsOn: dependenciesPath ? [] : [downloadFolly], type: Copy from dependenciesPath ?: tarTree(downloadFolly.dest) from 'src/main/jni/third-party/folly/Android.mk' include "folly-${FOLLY_VERSION}/folly/**/*", 'Android.mk' - eachFile {fname -> fname.path = (fname.path - "folly-${FOLLY_VERSION}/")} + eachFile { fname -> fname.path = (fname.path - "folly-${FOLLY_VERSION}/") } includeEmptyDirs = false // Patch for folly build break on gcc 4.9 and could be removed after build by clang filesMatching('**/container/detail/F14Policy.h') { filter(ReplaceTokens, tokens: [ - 'ObjectHolder(Args&&... args) : value_{std::forward(args)...} {}': 'ObjectHolder(Args&&... args) : value_({std::forward(args)...}) {}', - 'ObjectHolder(Args&&... args) : T{std::forward(args)...} {}': 'ObjectHolder(Args&&... args) : T({std::forward(args)...}) {}', + 'ObjectHolder(Args&&... args) : value_{std::forward(args)...} {}': 'ObjectHolder(Args&&... args) : value_({std::forward(args)...}) {}', + 'ObjectHolder(Args&&... args) : T{std::forward(args)...} {}' : 'ObjectHolder(Args&&... args) : T({std::forward(args)...}) {}', ], - beginToken: '', - endToken: '') + beginToken: '', + endToken: '') } into "$thirdPartyNdkDir/folly" @@ -116,20 +115,20 @@ task prepareGlog(dependsOn: dependenciesPath ? [] : [downloadGlog], type: Copy) includeEmptyDirs = false filesMatching('**/*.h.in') { filter(ReplaceTokens, tokens: [ - ac_cv_have_unistd_h: '1', - ac_cv_have_stdint_h: '1', - ac_cv_have_systypes_h: '1', - ac_cv_have_inttypes_h: '1', - ac_cv_have_libgflags: '0', - ac_google_start_namespace: 'namespace google {', - ac_cv_have_uint16_t: '1', - ac_cv_have_u_int16_t: '1', - ac_cv_have___uint16: '0', - ac_google_end_namespace: '}', - ac_cv_have___builtin_expect: '1', - ac_google_namespace: 'google', - ac_cv___attribute___noinline: '__attribute__ ((noinline))', - ac_cv___attribute___noreturn: '__attribute__ ((noreturn))', + ac_cv_have_unistd_h : '1', + ac_cv_have_stdint_h : '1', + ac_cv_have_systypes_h : '1', + ac_cv_have_inttypes_h : '1', + ac_cv_have_libgflags : '0', + ac_google_start_namespace : 'namespace google {', + ac_cv_have_uint16_t : '1', + ac_cv_have_u_int16_t : '1', + ac_cv_have___uint16 : '0', + ac_google_end_namespace : '}', + ac_cv_have___builtin_expect : '1', + ac_google_namespace : 'google', + ac_cv___attribute___noinline : '__attribute__ ((noinline))', + ac_cv___attribute___noreturn : '__attribute__ ((noreturn))', ac_cv___attribute___printf_4_5: '__attribute__((__format__ (__printf__, 4, 5)))' ]) it.path = (it.name - '.in') @@ -145,40 +144,41 @@ task prepareGlog(dependsOn: dependenciesPath ? [] : [downloadGlog], type: Copy) } } -task downloadJSCHeaders(type: Download) { - // in sync with webkit SVN revision 174650 - def jscAPIBaseURL = 'https://raw.githubusercontent.com/WebKit/webkit/38b15a3ba3c1b0798f2036f7cea36ffdc096202e/Source/JavaScriptCore/API/' - def jscHeaderFiles = ['JavaScript.h', 'JSBase.h', 'JSContextRef.h', 'JSObjectRef.h', 'JSStringRef.h', 'JSValueRef.h', 'WebKitAvailability.h'] - def output = new File(downloadsDir, 'jsc') - output.mkdirs() - src(jscHeaderFiles.collect { headerName -> "$jscAPIBaseURL$headerName" }) +task downloadJSC(dependsOn: createNativeDepsDirectories, type: Download) { + src "https://registry.npmjs.org/jsc-android/-/jsc-android-${JSC_VERSION}.tgz" onlyIfNewer true overwrite false - dest output + dest new File(downloadsDir, "jsc-${JSC_VERSION}.tar.gz") } -// Create Android.mk library module based on so files from mvn + include headers fetched from webkit.org -task prepareJSC(dependsOn: dependenciesPath ? [] : [downloadJSCHeaders]) { - doLast { - copy { - from zipTree(configurations.compile.fileCollection { dep -> dep.name == 'android-jsc' }.singleFile) - from dependenciesPath ? "$dependenciesPath/jsc-headers" : {downloadJSCHeaders.dest} - from 'src/main/jni/third-party/jsc' - include 'jni/**/*.so', '*.h', 'Android.mk' - filesMatching('*.h', { fname -> fname.path = "JavaScriptCore/${fname.path}"}) - into "$thirdPartyNdkDir/jsc"; - } +// Create Android.mk library module based on jsc from npm +task prepareJSC(dependsOn: downloadJSC) << { + def jscTar = tarTree(downloadJSC.dest) + def jscAAR = jscTar.matching({ it.include "**/android-jsc/**/*.aar" }).singleFile + def soFiles = zipTree(jscAAR).matching({ it.include "**/*.so" }) + + def headerFiles = jscTar.matching({ it.include "**/include/*.h" }) + + copy { + from soFiles + from headerFiles + from "src/main/jni/third-party/jsc/Android.mk" + + filesMatching("**/*.h", { it.path = "JavaScriptCore/${it.name}"}) + + includeEmptyDirs false + into "$thirdPartyNdkDir/jsc" } } task downloadNdkBuildDependencies { - if (!boostPath) { - dependsOn downloadBoost - } - dependsOn downloadDoubleConversion - dependsOn downloadFolly - dependsOn downloadGlog - dependsOn downloadJSCHeaders + if (!boostPath) { + dependsOn downloadBoost + } + dependsOn downloadDoubleConversion + dependsOn downloadFolly + dependsOn downloadGlog + dependsOn downloadJSC } def getNdkBuildName() { @@ -217,17 +217,17 @@ def getNdkBuildFullPath() { def ndkBuildFullPath = findNdkBuildFullPath() if (ndkBuildFullPath == null) { throw new GradleScriptException( - "ndk-build binary cannot be found, check if you've set " + - "\$ANDROID_NDK environment variable correctly or if ndk.dir is " + - "setup in local.properties", - null) + "ndk-build binary cannot be found, check if you've set " + + "\$ANDROID_NDK environment variable correctly or if ndk.dir is " + + "setup in local.properties", + null) } if (!new File(ndkBuildFullPath).canExecute()) { throw new GradleScriptException( - "ndk-build binary " + ndkBuildFullPath + " doesn't exist or isn't executable.\n" + - "Check that the \$ANDROID_NDK environment variable, or ndk.dir in local.properties, is set correctly.\n" + - "(On Windows, make sure you escape backslashes in local.properties or use forward slashes, e.g. C:\\\\ndk or C:/ndk rather than C:\\ndk)", - null) + "ndk-build binary " + ndkBuildFullPath + " doesn't exist or isn't executable.\n" + + "Check that the \$ANDROID_NDK environment variable, or ndk.dir in local.properties, is set correctly.\n" + + "(On Windows, make sure you escape backslashes in local.properties or use forward slashes, e.g. C:\\\\ndk or C:/ndk rather than C:\\ndk)", + null) } return ndkBuildFullPath } @@ -244,21 +244,27 @@ task buildReactNdkLib(dependsOn: [prepareJSC, prepareBoost, prepareDoubleConvers "REACT_COMMON_DIR=$projectDir/../ReactCommon", "REACT_SRC_DIR=$projectDir/src/main/java/com/facebook/react", '-C', file('src/main/jni/react/jni').absolutePath, - '--jobs', project.hasProperty("jobs") ? project.property("jobs") : Runtime.runtime.availableProcessors() + '--jobs', project.findProperty("jobs") ?: Runtime.runtime.availableProcessors() } task cleanReactNdkLib(type: Exec) { + ignoreExitValue true + errorOutput new ByteArrayOutputStream() commandLine getNdkBuildFullPath(), "NDK_APPLICATION_MK=$projectDir/src/main/jni/Application.mk", "THIRD_PARTY_NDK_DIR=$buildDir/third-party-ndk", "REACT_COMMON_DIR=$projectDir/../ReactCommon", '-C', file('src/main/jni/react/jni').absolutePath, 'clean' + doLast { + file(AAR_OUTPUT_URL).delete() + println "Deleted aar output dir at ${file(AAR_OUTPUT_URL)}" + } } task packageReactNdkLibs(dependsOn: buildReactNdkLib, type: Copy) { from "$buildDir/react-ndk/all" - exclude '**/libjsc.so' + from "$thirdPartyNdkDir/jsc/jni" into "$buildDir/react-ndk/exported" } @@ -269,7 +275,6 @@ task packageReactNdkLibsForBuck(dependsOn: packageReactNdkLibs, type: Copy) { android { compileSdkVersion 28 - buildToolsVersion "28.0.2" defaultConfig { minSdkVersion 16 @@ -291,7 +296,7 @@ android { sourceSets.main { jni.srcDirs = [] - jniLibs.srcDirs = ["$buildDir/react-ndk/exported", 'src/main/jni/third-party/jsc/jni'] + jniLibs.srcDir "$buildDir/react-ndk/exported" res.srcDirs = ['src/main/res/devsupport', 'src/main/res/shell', 'src/main/res/views/modal', 'src/main/res/views/uimanager'] java { srcDirs = ['src/main/java', 'src/main/libraries/soloader/java', 'src/main/jni/first-party/fb/jni/java'] @@ -326,7 +331,6 @@ dependencies { api "com.squareup.okhttp3:okhttp:${OKHTTP_VERSION}" api "com.squareup.okhttp3:okhttp-urlconnection:${OKHTTP_VERSION}" api 'com.squareup.okio:okio:1.14.0' - compile 'org.webkit:android-jsc:r174650' testImplementation "junit:junit:${JUNIT_VERSION}" testImplementation "org.powermock:powermock-api-mockito:${POWERMOCK_VERSION}" diff --git a/ReactAndroid/gradle.properties b/ReactAndroid/gradle.properties index 97551d4f31f376..48d2cfc40b3cc6 100644 --- a/ReactAndroid/gradle.properties +++ b/ReactAndroid/gradle.properties @@ -19,3 +19,4 @@ BOOST_VERSION=1_63_0 DOUBLE_CONVERSION_VERSION=1.1.6 FOLLY_VERSION=2018.10.22.00 GLOG_VERSION=0.3.5 +JSC_VERSION=236355.1.1 diff --git a/ReactAndroid/release.gradle b/ReactAndroid/release.gradle index cc66a47e39eb65..6fba6f20c98c43 100644 --- a/ReactAndroid/release.gradle +++ b/ReactAndroid/release.gradle @@ -6,6 +6,10 @@ apply plugin: 'maven' apply plugin: 'signing' +ext { + AAR_OUTPUT_URL = "file://${projectDir}/../android" +} + // Gradle tasks for publishing to maven // 1) To install in local maven repo use :installArchives task // 2) To upload artifact to maven central use: :uploadArchives (you'd need to have the permission to do that) @@ -15,15 +19,15 @@ def isReleaseBuild() { } def getRepositoryUrl() { - return project.hasProperty('repositoryUrl') ? property('repositoryUrl') : 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' + return project.findProperty('repositoryUrl') ?: 'https://oss.sonatype.org/service/local/staging/deploy/maven2/' } def getRepositoryUsername() { - return project.hasProperty('repositoryUsername') ? property('repositoryUsername') : '' + return project.findProperty('repositoryUsername') ?: '' } def getRepositoryPassword() { - return project.hasProperty('repositoryPassword') ? property('repositoryPassword') : '' + return project.findProperty('repositoryPassword') ?: '' } def configureReactNativePom(def pom) { @@ -128,7 +132,7 @@ afterEvaluate { project -> configuration = configurations.archives repositories.mavenDeployer { // Deploy to react-native/android, ready to publish to npm - repository url: "file://${projectDir}/../android" + repository url: AAR_OUTPUT_URL configureReactNativePom pom } diff --git a/ReactAndroid/src/main/jni/Application.mk b/ReactAndroid/src/main/jni/Application.mk index 942a122de79183..c73c0397f5d24d 100644 --- a/ReactAndroid/src/main/jni/Application.mk +++ b/ReactAndroid/src/main/jni/Application.mk @@ -24,11 +24,11 @@ APP_MK_DIR := $(dir $(lastword $(MAKEFILE_LIST))) # etc.) are defined inside build.gradle. NDK_MODULE_PATH := $(APP_MK_DIR)$(HOST_DIRSEP)$(THIRD_PARTY_NDK_DIR)$(HOST_DIRSEP)$(REACT_COMMON_DIR)$(HOST_DIRSEP)$(APP_MK_DIR)first-party$(HOST_DIRSEP)$(REACT_SRC_DIR) -APP_STL := gnustl_shared +APP_STL := c++_shared # Make sure every shared lib includes a .note.gnu.build-id header APP_CFLAGS := -Wall -Werror APP_CPPFLAGS := -std=c++1y APP_LDFLAGS := -Wl,--build-id -NDK_TOOLCHAIN_VERSION := 4.9 +NDK_TOOLCHAIN_VERSION := clang diff --git a/ReactAndroid/src/main/jni/react/jni/Android.mk b/ReactAndroid/src/main/jni/react/jni/Android.mk index 85e5fddc769de8..9259233cca8691 100644 --- a/ReactAndroid/src/main/jni/react/jni/Android.mk +++ b/ReactAndroid/src/main/jni/react/jni/Android.mk @@ -17,7 +17,7 @@ LOCAL_C_INCLUDES := $(LOCAL_PATH) # ./../ == react LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../.. -LOCAL_CFLAGS += -fexceptions -frtti +LOCAL_CFLAGS += -fexceptions -frtti -Wno-unused-lambda-capture LOCAL_LDLIBS += -landroid diff --git a/ReactAndroid/src/main/jni/third-party/folly/Android.mk b/ReactAndroid/src/main/jni/third-party/folly/Android.mk index 4700879022a26d..e285d10666f5e9 100644 --- a/ReactAndroid/src/main/jni/third-party/folly/Android.mk +++ b/ReactAndroid/src/main/jni/third-party/folly/Android.mk @@ -26,6 +26,7 @@ FOLLY_FLAGS := \ -DFOLLY_NO_CONFIG=1 \ -DFOLLY_HAVE_CLOCK_GETTIME=1 \ -DFOLLY_HAVE_MEMRCHR=1 \ + -DFOLLY_USE_LIBCPP=1 # If APP_PLATFORM in Application.mk targets android-23 above, please comment this line. # NDK uses GNU style stderror_r() after API 23. diff --git a/ReactAndroid/src/main/jni/third-party/glog/Android.mk b/ReactAndroid/src/main/jni/third-party/glog/Android.mk index 1abd09655046d0..33ea07c9a26ab2 100644 --- a/ReactAndroid/src/main/jni/third-party/glog/Android.mk +++ b/ReactAndroid/src/main/jni/third-party/glog/Android.mk @@ -23,7 +23,8 @@ LOCAL_CFLAGS += \ -g \ -O2 \ -D_START_GOOGLE_NAMESPACE_="namespace google {" \ - -D_END_GOOGLE_NAMESPACE_="}" + -D_END_GOOGLE_NAMESPACE_="}" \ + -DHAVE_PREAD=1 LOCAL_MODULE := glog diff --git a/ReactCommon/cxxreact/Android.mk b/ReactCommon/cxxreact/Android.mk index faf9935abee4c2..cd234d418c51fd 100644 --- a/ReactCommon/cxxreact/Android.mk +++ b/ReactCommon/cxxreact/Android.mk @@ -17,7 +17,7 @@ LOCAL_EXPORT_C_INCLUDES := $(LOCAL_C_INCLUDES) LOCAL_CFLAGS := \ -DLOG_TAG=\"ReactNative\" -LOCAL_CFLAGS += -fexceptions -frtti +LOCAL_CFLAGS += -fexceptions -frtti -Wno-unused-lambda-capture LOCAL_STATIC_LIBRARIES := boost LOCAL_SHARED_LIBRARIES := jsinspector libfolly_json glog diff --git a/build.gradle b/build.gradle index 8642d1b3eb1744..2433f0ff4b5da9 100644 --- a/build.gradle +++ b/build.gradle @@ -30,8 +30,3 @@ allprojects { } } } - -task wrapper(type: Wrapper) { - gradleVersion = '4.7' - distributionUrl = distributionUrl.replace("bin", "all") -} diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 758de960ec7947..29953ea141f55e 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e6a30918ef80ee..d76b502e226a5c 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew.bat b/gradlew.bat index 1934213b6ddee5..e95643d6a2ca62 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,8 +1,3 @@ -:: Copyright (c) 2015-present, Facebook, Inc. -:: -:: This source code is licensed under the MIT license found in the -:: LICENSE file in the root directory of this source tree. - @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem diff --git a/template/android/app/build.gradle b/template/android/app/build.gradle index ab0cdc7c592703..1c28494836d069 100644 --- a/template/android/app/build.gradle +++ b/template/android/app/build.gradle @@ -95,7 +95,6 @@ def enableProguardInReleaseBuilds = false android { compileSdkVersion rootProject.ext.compileSdkVersion - buildToolsVersion rootProject.ext.buildToolsVersion defaultConfig { applicationId "com.helloworld" @@ -109,7 +108,7 @@ android { reset() enable enableSeparateBuildPerCPUArchitecture universalApk false // If true, also generate a universal APK - include "armeabi-v7a", "x86", "arm64-v8a" + include "armeabi-v7a", "x86", "arm64-v8a", "x86-64" } } signingConfigs { @@ -137,7 +136,7 @@ android { variant.outputs.each { output -> // For each separate APK per architecture, set a unique version code as described here: // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits - def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3] + def versionCodes = ["armeabi-v7a":1, "x86":2, "arm64-v8a": 3, "x86-64": 4] def abi = output.getFilter(OutputFile.ABI) if (abi != null) { // null for the universal-debug, universal-release variants output.versionCodeOverride = diff --git a/template/android/build.gradle b/template/android/build.gradle index 02533d673b0be4..85ba83a28f70e8 100644 --- a/template/android/build.gradle +++ b/template/android/build.gradle @@ -2,7 +2,6 @@ buildscript { ext { - buildToolsVersion = "28.0.2" minSdkVersion = 16 compileSdkVersion = 28 targetSdkVersion = 27 @@ -31,9 +30,3 @@ allprojects { } } } - - -task wrapper(type: Wrapper) { - gradleVersion = '4.7' - distributionUrl = distributionUrl.replace("bin", "all") -} diff --git a/template/android/gradle/wrapper/gradle-wrapper.properties b/template/android/gradle/wrapper/gradle-wrapper.properties index 73bb13d55618b2..019065d1d650ce 100644 --- a/template/android/gradle/wrapper/gradle-wrapper.properties +++ b/template/android/gradle/wrapper/gradle-wrapper.properties @@ -2,4 +2,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.7-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-all.zip