id | title |
---|---|
Introduction.Android |
Detox for Android |
Detox for Android currently has several compatibility issues with React Native >= 0.50. See #608 for details.
Detox 7 was updated to support Android gradle plugin 3.0.0. This is a breaking change that makes it impossible to support previous Android gradle plugin versions.
https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html
For older Android gradle plugin support use detox@6.x.x
instead (previous setup guide here).
Detox 6 will not continue to be updated, to continue getting updates and features, update your Android gradle config and migrate to Detox 7.
In android/settings.gradle
add:
include ':detox'
project(':detox').projectDir = new File(rootProject.projectDir, '../node_modules/detox/android/detox')
In android/app/build.gradle
add this to defaultConfig
section:
defaultConfig {
...
testBuildType System.getProperty('testBuildType', 'debug') //this will later be used to control the test apk build type
missingDimensionStrategy "minReactNative", "minReactNative46" //read note
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
...
}
Please be aware that the minSdkVersion
needs to be at least 18.
Detox runs on multiple React Native versions, choose the correct build type to support the version you use.
Available versions:
minReactNative44
: Support for React Native 0.44-0.45minReactNative46
: Support for React Native 0.46+
In android/app/build.gradle
add this in dependencies
section:
dependencies {
...
androidTestImplementation(project(path: ":detox"))
androidTestImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test:rules:1.0.1'
...
}
And in android/build.gradle
you need to add this under allprojects > repositories
:
buildscript {
repositories {
...
google()
...
}
}
You need to add the file android/app/src/androidTest/java/com/[your.package]/DetoxTest.java
and fill it like this, except that you need to change the package to your projects name.
Add this part to your package.json
:
"detox" : {
"configurations": {
"android.emu.debug": {
"binaryPath": "android/app/build/outputs/apk/debug/app-debug.apk",
"build":
"cd android && ./gradlew assembleDebug assembleAndroidTest -DtestBuildType=debug && cd ..",
"type": "android.emulator",
"name": "Nexus_5X_API_24"
},
"android.emu.release": {
"binaryPath": "android/app/build/outputs/apk/release/app-release.apk",
"build":
"cd android && ./gradlew assembleRelease assembleAndroidTest -DtestBuildType=release && cd ..",
"type": "android.emulator",
"name": "Nexus_5X_API_26"
}
}
}
Pay attention to -DtestBuildType
, set either to debug
or release
according to the main apk type.
Following device types could be used to control Android devices:
android.emulator
. Boot stock SDK emulator with provided name
, for example Nexus_5X_API_25
. After booting connect to it.
android.attached
. Connect to already-attached android device. The device should be listed in the output of adb devices
command under provided name
.
Use this type to connect to Genymotion emulator.
Using the android.emu.debug
configuration from above, you can invoke it in the standard way.
detox test -c android.emu.debug
If you get an error like this:
Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/LICENSE
You need to add this to the android
section of your android/app/build.gradle
:
packagingOptions {
exclude 'META-INF/LICENSE'
}