--- id: Introduction.Android title: Detox for Android --- **Detox for Android currently has several compatibility issues with React Native >= 0.50.** See [#608](https://github.com/wix/detox/issues/608) for details. ## Setup 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](https://github.com/wix/detox/blob/97654071573053def90e8207be8eba011408f977/docs/Introduction.Android.md)).
**Detox 6 will not continue to be updated, to continue getting updates and features, update your Android gradle config and migrate to Detox 7.** ### 1. Do the initial setup described in the Getting Started Guide - [Getting Started](Introduction.GettingStarted.md) ### 2. Add Detox dependency to an Android project In `android/settings.gradle` add: ```gradle include ':detox' project(':detox').projectDir = new File(rootProject.projectDir, '../node_modules/detox/android/detox') ``` In `android/app/build.gradle` add this to `defaultConfig` section: ```gradle 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. > ###### Choosing the right build type (in missingDimensionStrategy) >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.45 >* `minReactNative46`: Support for React Native 0.46+ In `android/app/build.gradle` add this in `dependencies` section: ```gradle 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`: ```gradle buildscript { repositories { ... google() ... } } ``` ### 3. Create Android Test class You need to add the file `android/app/src/androidTest/java/com/[your.package]/DetoxTest.java` and fill it like [this](../detox/test/android/app/src/androidTest/java/com/example/DetoxTest.java), except that you need to change the package to your projects name. ### 4. Add Android configuration Add this part to your `package.json`: ```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. ### 5. Run the tests Using the `android.emu.debug` configuration from above, you can invoke it in the standard way. ```sh detox test -c android.emu.debug ``` ## Troubleshooting ### Problem: `Duplicate files copied in ...` If you get an error like this: ```sh 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`: ```gradle packagingOptions { exclude 'META-INF/LICENSE' } ```