mirror of
https://github.com/status-im/status-react.git
synced 2025-01-11 11:34:45 +00:00
d5c1ecc104
To help with #15595 changes, refactoring is required. In this PR we switch from config to env vars. Doing some cleanup meanwhile.
477 lines
19 KiB
Groovy
477 lines
19 KiB
Groovy
apply plugin: "com.android.application"
|
|
|
|
apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"
|
|
|
|
import com.android.build.OutputFile
|
|
import com.sun.org.apache.xalan.internal.xsltc.compiler.Copy
|
|
|
|
/**
|
|
* The react.gradle file registers a task for each build variant:
|
|
* - bundlePrJsAndAssets
|
|
* - bundleDebugJsAndAssets
|
|
* - bundleReleaseJsAndAssets
|
|
* These basically call `react-native bundle` with the correct arguments during the Android build
|
|
* cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
|
|
* bundle directly from the development server. Below you can see all the possible configurations
|
|
* and their defaults. If you decide to add a configuration block, make sure to add it before the
|
|
* `apply from: "../../node_modules/react-native/react.gradle"` line.
|
|
*
|
|
* project.ext.react = [
|
|
* // the name of the generated asset file containing your JS bundle
|
|
* bundleAssetName: "index.android.bundle",
|
|
*
|
|
* // the entry file for bundle generation
|
|
* entryFile: "index.js",
|
|
*
|
|
* // whether to bundle JS and assets in debug mode
|
|
* bundleInDebug: false,
|
|
*
|
|
* // whether to bundle JS and assets in release mode
|
|
* bundleInRelease: true,
|
|
*
|
|
* // whether to bundle JS and assets in another build variant (if configured).
|
|
* // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
|
|
* // The configuration property can be in the following formats
|
|
* // 'bundleIn${productFlavor}${buildType}'
|
|
* // 'bundleIn${buildType}'
|
|
* // bundleInFreeDebug: true,
|
|
* // bundleInPaidRelease: true,
|
|
* // bundleInBeta: true,
|
|
*
|
|
* // whether to disable dev mode in custom build variants (by default only disabled in release)
|
|
* // for example: to disable dev mode in the staging build type (if configured)
|
|
* devDisabledInStaging: true,
|
|
* // The configuration property can be in the following formats
|
|
* // 'devDisabledIn${productFlavor}${buildType}'
|
|
* // 'devDisabledIn${buildType}'
|
|
*
|
|
* // the root of your project, i.e. where "package.json" lives
|
|
* root: "../../",
|
|
*
|
|
* // where to put the JS bundle asset in debug mode
|
|
* jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
|
|
*
|
|
* // where to put the JS bundle asset in release mode
|
|
* jsBundleDirRelease: "$buildDir/intermediates/assets/release",
|
|
*
|
|
* // where to put drawable resources / React Native assets, e.g. the ones you use via
|
|
* // require('./image.png')), in debug mode
|
|
* resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
|
|
*
|
|
* // where to put drawable resources / React Native assets, e.g. the ones you use via
|
|
* // require('./image.png')), in release mode
|
|
* resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
|
|
*
|
|
* // by default the gradle tasks are skipped if none of the JS files or assets change; this means
|
|
* // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
|
|
* // date; if you have any other folders that you want to ignore for performance reasons (gradle
|
|
* // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
|
|
* // for example, you might want to remove it from here.
|
|
* inputExcludes: ["android/**", "ios/**"],
|
|
*
|
|
* // override which node gets called and with what additional arguments
|
|
* nodeExecutableAndArgs: ["node", "--max-old-space-size=8192"],
|
|
*
|
|
* // supply additional arguments to the packager
|
|
* extraPackagerArgs: []
|
|
* ]
|
|
*/
|
|
|
|
/*
|
|
Enabling Hermes on x86 devices is crashing the app after a few reloads,
|
|
this flag can be used to disable Hermes while building app.
|
|
https://github.com/status-im/status-mobile/issues/14031
|
|
*/
|
|
|
|
def disableHermes = System.getenv('DISABLE_HERMES') == 'true'
|
|
|
|
project.ext.react = [
|
|
nodeExecutableAndArgs: ["node", "--max-old-space-size=16384"],
|
|
entryFile: "index.js",
|
|
/* NOTE: Hermes engine is required for Android 64-bit builds running on 64 devices,
|
|
* to guard against a hang in the UI thread after invoking status-go.
|
|
* Also a clean and rebuild is required when changing this. */
|
|
enableHermes: !disableHermes,
|
|
/* Disable 'The first definition was here.' warnings */
|
|
hermesFlagsRelease: ["-w"],
|
|
/* FIXME: Workaround for crash caused by missing libhermes-executor-release.so.
|
|
* https://github.com/facebook/react-native/issues/32928 */
|
|
deleteDebugFilesForVariant: { false },
|
|
enableVmCleanup: false,
|
|
bundleInPr: true,
|
|
inputExcludes: ["android/**", "ios/**", "react-native/**", "src/**", "test/**"]
|
|
]
|
|
|
|
// NOTE: Uncomment if building RN from a fork
|
|
// configurations.all {
|
|
// exclude group: 'com.facebook.react', module: 'react-native'
|
|
// }
|
|
|
|
apply from: "../../node_modules/react-native/react.gradle"
|
|
|
|
/**
|
|
* Run Proguard to shrink the Java bytecode in release builds.
|
|
*/
|
|
def enableProguardInReleaseBuilds = false
|
|
|
|
/**
|
|
* The preferred build flavor of JavaScriptCore.
|
|
*
|
|
* For example, to use the international variant, you can use:
|
|
* `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
|
|
*
|
|
* The international variant includes ICU i18n library and necessary data
|
|
* allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
|
|
* give correct results when using with locales other than en-US. Note that
|
|
* this variant is about 6MiB larger per architecture than default.
|
|
*/
|
|
def jscFlavor = 'org.webkit:android-jsc:+'
|
|
|
|
/**
|
|
* Whether to enable the Hermes VM.
|
|
*
|
|
* This should be set on project.ext.react and mirrored here. If it is not set
|
|
* on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
|
|
* and the benefits of using Hermes will therefore be sharply reduced.
|
|
*/
|
|
def enableHermes = project.ext.react.get("enableHermes", false);
|
|
|
|
/**
|
|
* Architectures to build native code for.
|
|
*/
|
|
def reactNativeArchitectures() {
|
|
def value = project.getProperties().get("reactNativeArchitectures")
|
|
return value ? value.split(",") : ["armeabi-v7a", "x86", "x86_64", "arm64-v8a"]
|
|
}
|
|
|
|
def getCommitHash = { ->
|
|
if (project.hasProperty("commitHash")) {
|
|
return project.commitHash
|
|
}
|
|
return "unknown"
|
|
}
|
|
|
|
def getVersionCode = { ->
|
|
new ByteArrayOutputStream().withStream { stdOut ->
|
|
if (project.hasProperty("versionCode")) {
|
|
return project.versionCode.toString().toInteger()
|
|
}
|
|
|
|
exec {
|
|
commandLine "bash", "../../scripts/version/build_no.sh"
|
|
standardOutput = stdOut
|
|
errorOutput = System.err
|
|
}
|
|
return stdOut.toString().toInteger()
|
|
}
|
|
}
|
|
|
|
def getVersionName = { ->
|
|
new ByteArrayOutputStream().withStream { stdOut ->
|
|
// TODO: probably not used, cleanup
|
|
if (project.hasProperty("releaseVersion")) {
|
|
return project.releaseVersion
|
|
}
|
|
/* Necessary because Android Studio uses wrong PWD.
|
|
* Is actually absolute directory path of this file. */
|
|
def configDir = project.projectDir.toString()
|
|
version = new File(configDir + '/../../VERSION').text
|
|
return version.replaceAll("\\s","")
|
|
}
|
|
}
|
|
|
|
def getBuildUrl = { ->
|
|
new ByteArrayOutputStream().withStream { stdOut ->
|
|
if (project.hasProperty("buildUrl")) {
|
|
return project.buildUrl
|
|
}
|
|
return 'Local Build'
|
|
}
|
|
}
|
|
|
|
/* check if environment variable exists for given variable name first */
|
|
def getEnvOrConfig = { varName ->
|
|
def val = System.getenv(varName) ? System.getenv(varName) : project.property(varName)
|
|
return val
|
|
}
|
|
|
|
android {
|
|
ndkVersion rootProject.ext.ndkVersion
|
|
|
|
compileSdkVersion rootProject.ext.compileSdkVersion
|
|
|
|
compileOptions {
|
|
sourceCompatibility JavaVersion.VERSION_11
|
|
targetCompatibility JavaVersion.VERSION_11
|
|
}
|
|
|
|
defaultConfig {
|
|
applicationId "im.status.ethereum"
|
|
minSdkVersion rootProject.ext.minSdkVersion
|
|
targetSdkVersion rootProject.ext.targetSdkVersion
|
|
multiDexEnabled true
|
|
versionCode getVersionCode()
|
|
versionName getVersionName()
|
|
missingDimensionStrategy 'react-native-camera', 'general'
|
|
manifestPlaceholders = [commitHash: getCommitHash()]
|
|
/* this needs to be empty if we want APKs split by ABIs */
|
|
if (!getEnvOrConfig('ANDROID_ABI_SPLIT').toBoolean()) {
|
|
ndk {
|
|
abiFilters getEnvOrConfig('ANDROID_ABI_INCLUDE').split(";")
|
|
}
|
|
}
|
|
buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
|
|
|
|
if (isNewArchitectureEnabled()) {
|
|
// We configure the NDK build only if you decide to opt-in for the New Architecture.
|
|
externalNativeBuild {
|
|
ndkBuild {
|
|
arguments "APP_PLATFORM=android-21",
|
|
"APP_STL=c++_shared",
|
|
"NDK_TOOLCHAIN_VERSION=clang",
|
|
"GENERATED_SRC_DIR=$buildDir/generated/source",
|
|
"PROJECT_BUILD_DIR=$buildDir",
|
|
"REACT_ANDROID_DIR=$rootDir/../node_modules/react-native/ReactAndroid",
|
|
"REACT_ANDROID_BUILD_DIR=$rootDir/../node_modules/react-native/ReactAndroid/build",
|
|
"NODE_MODULES_DIR=$rootDir/../node_modules"
|
|
cFlags "-Wall", "-Werror", "-fexceptions", "-frtti", "-DWITH_INSPECTOR=1"
|
|
cppFlags "-std=c++17"
|
|
// Make sure this target name is the same you specify inside the
|
|
// src/main/jni/Android.mk file for the `LOCAL_MODULE` variable.
|
|
targets "rndiffapp_appmodules"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if (isNewArchitectureEnabled()) {
|
|
// We configure the NDK build only if you decide to opt-in for the New Architecture.
|
|
externalNativeBuild {
|
|
ndkBuild {
|
|
path "$projectDir/src/main/jni/Android.mk"
|
|
}
|
|
}
|
|
def reactAndroidProjectDir = project(':ReactAndroid').projectDir
|
|
def packageReactNdkDebugLibs = tasks.register("packageReactNdkDebugLibs", Copy) {
|
|
dependsOn(":ReactAndroid:packageReactNdkDebugLibsForBuck")
|
|
from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
|
|
into("$buildDir/react-ndk/exported")
|
|
}
|
|
def packageReactNdkReleaseLibs = tasks.register("packageReactNdkReleaseLibs", Copy) {
|
|
dependsOn(":ReactAndroid:packageReactNdkReleaseLibsForBuck")
|
|
from("$reactAndroidProjectDir/src/main/jni/prebuilt/lib")
|
|
into("$buildDir/react-ndk/exported")
|
|
}
|
|
afterEvaluate {
|
|
// If you wish to add a custom TurboModule or component locally,
|
|
// you should uncomment this line.
|
|
// preBuild.dependsOn("generateCodegenArtifactsFromSchema")
|
|
preDebugBuild.dependsOn(packageReactNdkDebugLibs)
|
|
preReleaseBuild.dependsOn(packageReactNdkReleaseLibs)
|
|
|
|
// Due to a bug inside AGP, we have to explicitly set a dependency
|
|
// between configureNdkBuild* tasks and the preBuild tasks.
|
|
// This can be removed once this is solved: https://issuetracker.google.com/issues/207403732
|
|
configureNdkBuildRelease.dependsOn(preReleaseBuild)
|
|
configureNdkBuildDebug.dependsOn(preDebugBuild)
|
|
reactNativeArchitectures().each { architecture ->
|
|
tasks.findByName("configureNdkBuildDebug[${architecture}]")?.configure {
|
|
dependsOn("preDebugBuild")
|
|
}
|
|
tasks.findByName("configureNdkBuildRelease[${architecture}]")?.configure {
|
|
dependsOn("preReleaseBuild")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* Arbitrary project metadata
|
|
* https://docs.gradle.org/current/dsl/org.gradle.api.plugins.ExtraPropertiesExtension.html
|
|
**/
|
|
project.ext {
|
|
buildUrl = getBuildUrl()
|
|
}
|
|
/**
|
|
* Fix for: (https://github.com/ReactiveX/RxJava/issues/4445)
|
|
* Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
|
|
* > com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException:
|
|
* Duplicate files copied in APK META-INF/rxjava.properties
|
|
*/
|
|
packagingOptions {
|
|
exclude 'META-INF/rxjava.properties'
|
|
exclude '/lib/mips64/**'
|
|
exclude '/lib/armeabi/**'
|
|
|
|
pickFirst '**/armeabi-v7a/libc++_shared.so'
|
|
pickFirst '**/x86/libc++_shared.so'
|
|
pickFirst '**/arm64-v8a/libc++_shared.so'
|
|
pickFirst '**/x86_64/libc++_shared.so'
|
|
pickFirst '**/x86/libjsc.so'
|
|
pickFirst '**/armeabi-v7a/libjsc.so'
|
|
|
|
/** Fix for: Execution failed for task ':app:transformNativeLibsWithStripDebugSymbolForDebug'.
|
|
* with recent version of ndk (17.0.4754217)
|
|
*/
|
|
doNotStrip '*/mips/*.so'
|
|
doNotStrip '*/mips64/*.so'
|
|
}
|
|
dexOptions {
|
|
jumboMode true
|
|
javaMaxHeapSize "8g"
|
|
}
|
|
splits {
|
|
abi {
|
|
reset()
|
|
enable getEnvOrConfig('ANDROID_ABI_SPLIT').toBoolean()
|
|
include getEnvOrConfig('ANDROID_ABI_INCLUDE').split(";")
|
|
universalApk true
|
|
}
|
|
}
|
|
signingConfigs {
|
|
debug {
|
|
storeFile file('debug.keystore')
|
|
storePassword 'android'
|
|
keyAlias 'androiddebugkey'
|
|
keyPassword 'android'
|
|
}
|
|
}
|
|
buildTypes {
|
|
debug {
|
|
applicationIdSuffix ".debug"
|
|
debuggable true
|
|
versionNameSuffix "-SNAPSHOT"
|
|
resValue "string", "build_config_package", "im.status.ethereum"
|
|
signingConfig signingConfigs.debug
|
|
}
|
|
release {
|
|
minifyEnabled enableProguardInReleaseBuilds
|
|
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
|
|
signingConfig null
|
|
}
|
|
pr {
|
|
initWith release
|
|
applicationIdSuffix ".pr"
|
|
versionNameSuffix ".pr"
|
|
debuggable false
|
|
matchingFallbacks = ["release"]
|
|
// necessary to make react-native-config's code generation work
|
|
resValue "string", "build_config_package", "im.status.ethereum"
|
|
}
|
|
}
|
|
// applicationVariants are e.g. debug, release
|
|
applicationVariants.all { variant ->
|
|
variant.outputs.each { output ->
|
|
// For each separate APK per architecture, set a unique version code as described here:
|
|
|
|
// https://developer.android.com/studio/build/configure-apk-splits.html
|
|
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 = versionCodes.get(abi) + defaultConfig.versionCode
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
aaptOptions {
|
|
// disable PNG optimization as for some reason it cannot be trusted to provide deterministic output (see https://f-droid.org/en/docs/Reproducible_Builds/)
|
|
cruncherEnabled = false
|
|
}
|
|
|
|
sourceSets {
|
|
main { jniLibs.srcDirs 'libs' }
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
implementation fileTree(dir: "libs", include: ["*.jar"])
|
|
implementation "com.facebook.react:react-native:+" // From node_modules
|
|
implementation 'com.facebook.soloader:soloader:0.10.3+'
|
|
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
|
|
implementation "androidx.core:core-splashscreen:1.0.0"
|
|
|
|
if (enableHermes) {
|
|
//noinspection GradleDynamicVersion
|
|
implementation("com.facebook.react:hermes-engine:+") { // From node_modules
|
|
exclude group: 'com.facebook.fbjni' }
|
|
} else {
|
|
implementation jscFlavor
|
|
}
|
|
|
|
// react-native-screens
|
|
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
|
|
implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.1.0-alpha02'
|
|
|
|
implementation 'androidx.multidex:multidex:2.0.1' // only needed if minSdkVersion is less than 21 (https://developer.android.com/studio/build/multidex)
|
|
implementation project(':react-native-dialogs')
|
|
implementation project(':react-native-blur')
|
|
// Force using exact RN version instead of relying on gradle dependency resolution
|
|
// https://docs.gradle.org/current/userguide/introduction_dependency_management.html#sec:dependency_resolution
|
|
// NOTE: Uncomment if building RN from a fork
|
|
//compile ("com.facebook.react:react-native:0.55.4") { force = true } // From node_modules
|
|
implementation project(':react-native-status')
|
|
implementation project(':react-native-status-keycard')
|
|
implementation 'com.github.status-im:function:0.0.1'
|
|
implementation 'com.facebook.fresco:fresco:2.5.0'
|
|
implementation 'com.facebook.fresco:animated-gif:2.5.0'
|
|
implementation "com.squareup.okhttp3:okhttp-tls:4.9.2"
|
|
}
|
|
|
|
if (isNewArchitectureEnabled()) {
|
|
// If new architecture is enabled, we let you build RN from source
|
|
// Otherwise we fallback to a prebuilt .aar bundled in the NPM package.
|
|
// This will be applied to all the imported transtitive dependency.
|
|
configurations.all {
|
|
resolutionStrategy.dependencySubstitution {
|
|
substitute(module("com.facebook.react:react-native"))
|
|
.using(project(":ReactAndroid"))
|
|
.because("On New Architecture we're building React Native from source")
|
|
substitute(module("com.facebook.react:hermes-engine"))
|
|
.using(project(":ReactAndroid:hermes-engine"))
|
|
.because("On New Architecture we're building Hermes from source")
|
|
}
|
|
}
|
|
}
|
|
|
|
def getLocalNDKDir = { ->
|
|
def rootDir = project.rootDir
|
|
def localProperties = new File(rootDir, "local.properties")
|
|
if (!localProperties.exists()) {
|
|
return null
|
|
}
|
|
Properties properties = new Properties()
|
|
localProperties.withInputStream { instr ->
|
|
properties.load(instr)
|
|
}
|
|
return properties.getProperty('ndk.dir')
|
|
}
|
|
|
|
// Run this once to be able to run the application with BUCK
|
|
// puts all compile dependencies into folder libs for BUCK to use
|
|
task hemroidBuild(type: Exec) {
|
|
def localNdkDir = getLocalNDKDir()
|
|
def ndkDir = System.env.ANDROID_NDK_ROOT
|
|
if (localNdkDir != null) {
|
|
ndkDir = localNdkDir
|
|
}
|
|
|
|
def execPath = "$ndkDir/ndk-build"
|
|
def exec = new File(execPath)
|
|
if (!exec.exists()) {
|
|
throw new GradleException("No ndk-build binary found!")
|
|
}
|
|
executable execPath
|
|
}
|
|
|
|
preBuild.dependsOn hemroidBuild
|
|
|
|
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
|
|
|
|
def isNewArchitectureEnabled() {
|
|
// To opt-in for the New Architecture, you can either:
|
|
// - Set `newArchEnabled` to true inside the `gradle.properties` file
|
|
// - Invoke gradle with `-newArchEnabled=true`
|
|
// - Set an environment variable `ORG_GRADLE_PROJECT_newArchEnabled=true`
|
|
return project.hasProperty("newArchEnabled") && project.newArchEnabled == "true"
|
|
}
|