Skip to content

Instantly share code, notes, and snippets.

@jeiea
Created August 31, 2023 04:24
Show Gist options
  • Save jeiea/492eaf151d98cee88631a8bf5f3a899c to your computer and use it in GitHub Desktop.
Save jeiea/492eaf151d98cee88631a8bf5f3a899c to your computer and use it in GitHub Desktop.
React native kotlin DSL build script example
import com.facebook.react.utils.KotlinStdlibCompatUtils.toBooleanStrictOrNullCompat
import java.util.Properties
plugins {
id("com.android.application")
id("com.facebook.react")
}
apply(from = "../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle")
val applyNativeModulesAppBuildGradle: groovy.lang.Closure<Any> by extra
applyNativeModulesAppBuildGradle(project, null)
// https://github.com/microsoft/react-native-code-push/blob/df9f82b4db1219d609da1b28929b76dd91ae535d/docs/setup-android.md
//apply(from = "../../node_modules/react-native-code-push/android/codepush.gradle")
apply(from = "../../node_modules/@sentry/react-native/sentry.gradle")
/**
* This is the configuration block to customize your React Native Android app.
* By default you don't need to apply any configuration, just uncomment the lines you need.
*/
react {
/* Folders */
// The root of your project, i.e. where "package.json" lives. Default is '..'
// root = file("../")
// The folder where the react-native NPM package is. Default is ../node_modules/react-native
// reactNativeDir = file("../node_modules/react-native")
// The folder where the react-native Codegen package is. Default is ../node_modules/@react-native/codegen
// codegenDir = file("../node_modules/@react-native/codegen")
// The cli.js file which is the React Native CLI entrypoint. Default is ../node_modules/react-native/cli.js
// cliFile = file("../node_modules/react-native/cli.js")
/* Variants */
// The list of variants to that are debuggable. For those we're going to
// skip the bundling of the JS bundle and the assets. By default is just 'debug'.
// If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.
// debuggableVariants = ["liteDebug", "prodDebug"]
/* Bundling */
// A list containing the node command and its flags. Default is just 'node'.
// nodeExecutableAndArgs = ["node"]
//
// The command to run when bundling. By default is 'bundle'
// bundleCommand = "ram-bundle"
//
// The path to the CLI configuration file. Default is empty.
// bundleConfig = file(../rn-cli.config.js)
//
// The name of the generated asset file containing your JS bundle
// bundleAssetName = "MyApplication.android.bundle"
//
// The entry file for bundle generation. Default is 'index.android.js' or 'index.js'
// entryFile = file("../js/MyApplication.android.js")
//
// A list of extra flags to pass to the 'bundle' commands.
// See https://github.com/react-native-community/cli/blob/main/docs/commands.md#bundle
// extraPackagerArgs = []
/* Hermes Commands */
// The hermes compiler command to run. By default it is 'hermesc'
// hermesCommand = "$rootDir/my-custom-hermesc/bin/hermesc"
//
// The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
// hermesFlags = ["-O", "-output-source-map"]
}
/**
* The preferred build flavor of JavaScriptCore (JSC)
*
* 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.
*/
val jscFlavor = "org.webkit:android-jsc:+"
android {
namespace = "dev.reactnative.example"
defaultConfig {
applicationId = namespace
minSdk = rootProject.extra["minSdkVersion"] as Int?
targetSdk = rootProject.extra["targetSdkVersion"] as Int
compileSdk = rootProject.extra["compileSdkVersion"] as Int
ndkVersion = rootProject.extra["ndkVersion"] as String?
versionCode = 1
versionName = "1.0"
missingDimensionStrategy("store", "play")
}
signingConfigs {
getByName("debug") {
storeFile = file("debug.keystore")
storePassword = "android"
keyAlias = "androiddebugkey"
keyPassword = "android"
}
create("release") {
val properties = Properties()
properties.load(project.rootProject.file("local.properties").inputStream())
storeFile = file(properties.getProperty("upload_store_file"))
storePassword = properties.getProperty("upload_store_password")
keyAlias = properties.getProperty("upload_key_alias")
keyPassword = properties.getProperty("upload_key_password")
}
}
flavorDimensions += "deployment"
productFlavors {
create("development") {
dimension ="deployment"
applicationIdSuffix = ".dev"
signingConfig = signingConfigs.getByName("debug")
}
create("production") {
dimension ="deployment"
signingConfig = signingConfigs.getByName("release")
}
}
buildTypes {
getByName("debug") {
}
getByName("release") {
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
}
androidComponents.beforeVariants { builder ->
if (builder.flavorName == "development" && builder.buildType == "release") {
builder.enable = false
}
}
}
dependencies {
// The version of react-native is set by the React Native Gradle Plugin
implementation("com.facebook.react:react-android")
// https://github.com/Aleksefo/react-native-webp-format#android
implementation("com.facebook.fresco:webpsupport:2.5.0")
val FLIPPER_VERSION: String by rootProject
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}")
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude(group = "com.squareup.okhttp3", module = "okhttp")
}
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}")
val hermesEnabled: String by rootProject
if (hermesEnabled.toBooleanStrictOrNullCompat() == true) {
implementation("com.facebook.react:hermes-android")
} else {
implementation(jscFlavor)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment