build.gradle 12.7 KB
Newer Older
Diego Mello's avatar
Diego Mello committed
1
def taskRequests = getGradle().getStartParameter().getTaskRequests().toString().toLowerCase()
Diego Mello's avatar
Diego Mello committed
2
def isFoss = taskRequests.contains("foss")
Diego Mello's avatar
Diego Mello committed
3

Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
4
apply plugin: "com.android.application"
5
apply plugin: 'kotlin-android'
Diego Mello's avatar
Diego Mello committed
6

Diego Mello's avatar
Diego Mello committed
7
if (!isFoss) {
Diego Mello's avatar
Diego Mello committed
8
9
10
    apply plugin: 'com.google.firebase.crashlytics'
    apply plugin: 'com.bugsnag.android.gradle'
}
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

import com.android.build.OutputFile

/**
 * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
 * and 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",
 *
Diego Mello's avatar
Diego Mello committed
27
 *   // the entry file for bundle generation. If none specified and
Diego Mello's avatar
Diego Mello committed
28
 *   // "index.android.js" exists, it will be used. Otherwise "index.tsx" is
Diego Mello's avatar
Diego Mello committed
29
 *   // default. Can be overridden with ENTRY_FILE environment variable.
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
30
31
 *   entryFile: "index.android.js",
 *
32
33
34
 *   // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format
 *   bundleCommand: "ram-bundle",
 *
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
 *   // 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"],
 *
 *   // supply additional arguments to the packager
 *   extraPackagerArgs: []
 * ]
 */

89
project.ext.react = [
90
    bundleAssetName: "app.bundle",
91
    iconFontNames: [ 'custom.ttf' ],
Diego Mello's avatar
Diego Mello committed
92
    enableHermes: true,  // clean and rebuild if changing
93
94
]

Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
95
apply from: "../../node_modules/react-native/react.gradle"
96
apply from: '../../node_modules/react-native-unimodules/gradle.groovy'
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
97
98
99
100
101
102
103
104
105

/**
 * Set this to true to create two separate APKs instead of one:
 *   - An APK that only works on ARM devices
 *   - An APK that only works on x86 devices
 * The advantage is the size of the APK is reduced by about 4MB.
 * Upload all the APKs to the Play Store and people will download
 * the correct one based on the CPU architecture of their device.
 */
106
def enableSeparateBuildPerCPUArchitecture = false
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
107
108
109
110

/**
 * Run Proguard to shrink the Java bytecode in release builds.
 */
111
def enableProguardInReleaseBuilds = false
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
112

113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/**
 * 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);

Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
134
android {
Diego Mello's avatar
Diego Mello committed
135
136
    compileSdkVersion rootProject.ext.compileSdkVersion

137
    compileOptions {
Diego Mello's avatar
Diego Mello committed
138
139
140
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
141
142

    defaultConfig {
Diego Mello's avatar
Diego Mello committed
143
        applicationId APPLICATION_ID
Diego Mello's avatar
Diego Mello committed
144
145
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
146
        versionCode VERSIONCODE as Integer
Diego Mello's avatar
Diego Mello committed
147
        versionName "4.27.1"
Diego Mello's avatar
Diego Mello committed
148
        vectorDrawables.useSupportLibrary = true
Diego Mello's avatar
Diego Mello committed
149
        if (!isFoss) {
Diego Mello's avatar
Diego Mello committed
150
            manifestPlaceholders = [BugsnagAPIKey: BugsnagAPIKey as String]
Diego Mello's avatar
Diego Mello committed
151
            missingDimensionStrategy "RNNotifications.reactNativeVersion", "reactNative60" // See note below!
Diego Mello's avatar
Diego Mello committed
152
        }
Diego Mello's avatar
Diego Mello committed
153
        resValue "string", "rn_config_reader_custom_package", "chat.rocket.reactnative"
Diego Mello's avatar
Diego Mello committed
154
155
        testBuildType System.getProperty('testBuildType', 'debug')
        testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
156
    }
Guilherme Gazzo's avatar
Guilherme Gazzo committed
157

158
159
    signingConfigs {
        release {
160
161
162
163
164
            if (project.hasProperty('KEYSTORE')) {
                storeFile file(KEYSTORE)
                storePassword KEYSTORE_PASSWORD
                keyAlias KEY_ALIAS
                keyPassword KEY_PASSWORD
165
166
167
            }
        }
    }
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
168
169
170
171
172
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
Diego Mello's avatar
Diego Mello committed
173
            include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
174
175
176
177
        }
    }
    buildTypes {
        release {
Guilherme Gazzo's avatar
Guilherme Gazzo committed
178
179
            minifyEnabled enableProguardInReleaseBuilds
            setProguardFiles([getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'])
180
            signingConfig signingConfigs.release
Diego Mello's avatar
Diego Mello committed
181
            if (!isFoss) {
Diego Mello's avatar
Diego Mello committed
182
183
184
                firebaseCrashlytics {
                    nativeSymbolUploadEnabled true
                }
Diego Mello's avatar
Diego Mello committed
185
            }
186
        }
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
187
    }
Diego Mello's avatar
Diego Mello committed
188

Diego Mello's avatar
Diego Mello committed
189
190
191
192
193
194
    // packagingOptions {
    //     pickFirst '**/armeabi-v7a/libc++_shared.so'
    //     pickFirst '**/x86/libc++_shared.so'
    //     pickFirst '**/arm64-v8a/libc++_shared.so'
    //     pickFirst '**/x86_64/libc++_shared.so'
    // }
Diego Mello's avatar
Diego Mello committed
195

Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
196
    // applicationVariants are e.g. debug, release
Diego Mello's avatar
Diego Mello committed
197

Diego Mello's avatar
Diego Mello committed
198
    flavorDimensions "app", "type"
Diego Mello's avatar
Diego Mello committed
199
    productFlavors {
Diego Mello's avatar
Diego Mello committed
200
201
202
203
204
205
206
207
        official {
            dimension = "app"
            buildConfigField "boolean", "IS_OFFICIAL", "true"
        }
        experimental {
            dimension = "app"
            buildConfigField "boolean", "IS_OFFICIAL", "false"
        }
Diego Mello's avatar
Diego Mello committed
208
209
210
211
        e2e {
            dimension = "app"
            buildConfigField "boolean", "IS_OFFICIAL", "false"
        }
Diego Mello's avatar
Diego Mello committed
212
213
214
215
216
217
218
219
220
        foss {
            dimension = "type"
            buildConfigField "boolean", "FDROID_BUILD", "true"
        }
        play {
            dimension = "type"
            buildConfigField "boolean", "FDROID_BUILD", "false"
        }
    }
Diego Mello's avatar
Diego Mello committed
221
    sourceSets {
Diego Mello's avatar
Diego Mello committed
222
223
224
225
226
227
228
229
230
231
        // TODO: refactor making sure notifications are working properly both on debug and release
        experimentalPlayDebug {
            java.srcDirs = ['src/main/java', 'src/play/java']
            manifest.srcFile 'src/play/AndroidManifest.xml'
        }
        experimentalPlayRelease {
            java.srcDirs = ['src/main/java', 'src/play/java']
            manifest.srcFile 'src/play/AndroidManifest.xml'
        }
        officialPlayDebug {
Diego Mello's avatar
Diego Mello committed
232
233
234
            java.srcDirs = ['src/main/java', 'src/play/java']
            manifest.srcFile 'src/play/AndroidManifest.xml'
        }
Diego Mello's avatar
Diego Mello committed
235
        officialPlayRelease {
Diego Mello's avatar
Diego Mello committed
236
237
238
            java.srcDirs = ['src/main/java', 'src/play/java']
            manifest.srcFile 'src/play/AndroidManifest.xml'
        }
Diego Mello's avatar
Diego Mello committed
239
240
241
242
243
244
245
246
247
248
        e2ePlayDebug {
            java.srcDirs = ['src/main/java', 'src/play/java']
            res.srcDirs = ['src/experimental/res']
            manifest.srcFile 'src/play/AndroidManifest.xml'
        }
        e2ePlayRelease {
            java.srcDirs = ['src/main/java', 'src/play/java']
            res.srcDirs = ['src/experimental/res']
            manifest.srcFile 'src/play/AndroidManifest.xml'
        }
Diego Mello's avatar
Diego Mello committed
249
    }
Diego Mello's avatar
Diego Mello committed
250

Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
251
252
253
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // For each separate APK per architecture, set a unique version code as described here:
254
255
            // https://developer.android.com/studio/build/configure-apk-splits.html
            def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
256
257
258
259
260
261
262
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
            }
        }
    }
263
264
265
266
267
268
269
270
271
272
273
274

    bundle {
        language {
            enableSplit = false
        }
        density {
            enableSplit = true
        }
        abi {
            enableSplit = true
        }
    }
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
275
276
277
}

dependencies {
278
    addUnimodulesDependencies()
279
    implementation project(':@react-native-community_viewpager')
Diego Mello's avatar
Diego Mello committed
280
281
    playImplementation project(':react-native-notifications')
    playImplementation 'com.google.firebase:firebase-core:16.0.0'
Diego Mello's avatar
Diego Mello committed
282
283
284
    playImplementation project(':@react-native-firebase_app')
    playImplementation project(':@react-native-firebase_analytics')
    playImplementation project(':@react-native-firebase_crashlytics')
Diego Mello's avatar
Diego Mello committed
285
286
287
    implementation(project(':react-native-jitsi-meet')) { // https://github.com/skrafft/react-native-jitsi-meet#side-note
      exclude group: 'com.facebook.react',module:'react-native-svg'
    }
288
    implementation fileTree(dir: "libs", include: ["*.jar"])
Diego Mello's avatar
Diego Mello committed
289
    //noinspection GradleDynamicVersion
290
    implementation "com.facebook.react:react-native:+"  // From node_modules
Diego Mello's avatar
Diego Mello committed
291
292
293
294
295
296
297
298
299
300
    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
    debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
      exclude group:'com.facebook.fbjni'
    }
    debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
        exclude group:'com.facebook.flipper'
    }
    debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
        exclude group:'com.facebook.flipper'
    }
301
302

    if (enableHermes) {
303
      def hermesPath = "../../node_modules/hermes-engine/android/";
304
305
306
307
308
      debugImplementation files(hermesPath + "hermes-debug.aar")
      releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
      implementation jscFlavor
    }
Diego Mello's avatar
Diego Mello committed
309
310
311
312

    implementation "com.google.code.gson:gson:2.8.5"
    implementation "com.github.bumptech.glide:glide:4.9.0"
    annotationProcessor "com.github.bumptech.glide:compiler:4.9.0"
Diego Mello's avatar
Diego Mello committed
313
    implementation "com.tencent:mmkv-static:1.2.1"
Diego Mello's avatar
Diego Mello committed
314
315
    implementation 'com.squareup.okhttp3:okhttp:4.9.0'
    implementation "com.squareup.okhttp3:okhttp-urlconnection:4.9.0"
Diego Mello's avatar
Diego Mello committed
316
317
    androidTestImplementation('com.wix:detox:+') { transitive = true }
    androidTestImplementation 'junit:junit:4.12'
Rodrigo Nascimento's avatar
Rodrigo Nascimento committed
318
319
320
321
322
323
324
325
}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}
Diego Mello's avatar
Diego Mello committed
326

Diego Mello's avatar
Diego Mello committed
327
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
Diego Mello's avatar
Diego Mello committed
328
if (!isFoss) {
Diego Mello's avatar
Diego Mello committed
329
330
    apply plugin: 'com.google.gms.google-services'
}