React-native-code-push: Start app in Android emulator failed when set applicationIdSuffix in gradle config as "Multi-Deployment Testing" saied.

Created on 29 Jan 2018  Â·  9Comments  Â·  Source: microsoft/react-native-code-push

Steps to Reproduce

  1. modify android project config as "Multi-Deployment Testing".
  2. run app in android emulator from command line using "react-native run-android".
  3. there has error in console "Error type 3nError: Activity class {com.bicisims.sm/com.bicisims.sm.MainActivity} does not exist.".

Expected Behavior

App running in emulator

Actual Behavior

Start app in emulator failed.

image

But when remove "applicationIdSuffix" in "app/build.gradle", the app running ok.

apply plugin: "com.android.application"

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",
 *
 *   // the entry file for bundle generation
 *   entryFile: "index.android.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"],
 *
 *   // supply additional arguments to the packager
 *   extraPackagerArgs: []
 * ]
 */

project.ext.react = [
    entryFile: "index.js"
]

apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"

/**
 * 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.
 */
def enableSeparateBuildPerCPUArchitecture = false

/**
 * Run Proguard to shrink the Java bytecode in release builds.
 */
def enableProguardInReleaseBuilds = false

android {
    compileSdkVersion 23

    defaultConfig {
        applicationId "com.bicisims.sm"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        debug {
            buildConfigField "String", "CODEPUSH_KEY", '""'
            // applicationIdSuffix ".debug"
        }
        releaseStaging {
            matchingFallbacks = ['release', 'debug']
            buildConfigField "String", "CODEPUSH_KEY", '"RjdyrDlgcX2-BjvU9cF_1pyH3r2qr1f97FdBG"'
        }
        release {
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
            buildConfigField "String", "CODEPUSH_KEY", '"5QPhRIak14wf3Ky7c2BxAakczpzfByo9QYOrG"'
        }
    }
    // 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:
            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
            def versionCodes = ["armeabi-v7a":1, "x86":2]
            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
            }
        }
    }
}

dependencies {
    compile project(':appcenter-crashes')
    compile project(':appcenter-analytics')
    compile project(':appcenter')
    compile project(':react-native-code-push')
    compile project(':react-native-vector-icons')
    compile fileTree(dir: "libs", include: ["*.jar"])
    compile "com.android.support:appcompat-v7:23.0.1"
    compile "com.facebook.react:react-native:+"  // From node_modules
}

// 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'
}

if (System.properties['os.name'].contains("Mac")) {
    project.ext.react.nodeExecutableAndArgs = ["/usr/local/bin/node"]
}

Environment

  • react-native-code-push version: 5.2.1
  • react-native version: 0.52.1
  • iOS/Android/Windows version: Android 6.1 in emulator
  • Does this reproduce on a debug build or release build? debug build
  • Does this reproduce on a simulator, or only on a physical device? simulator

Most helpful comment

This is caused by using application id suffix, while the run-android command still executing the original one.
Check here: https://github.com/facebook/react-native/commit/d8f23f79c736812c6da2af5a637eb29bf62510e4
Specifying --appIdSuffix [string] when you doing the run-android thing fixes this.

All 9 comments

And there is another problem, I must add "matchingFallbacks = ['release', 'debug']" in releaseStaging config to make gradle works right. Otherwise it will fail like the following.

image

This is caused by using application id suffix, while the run-android command still executing the original one.
Check here: https://github.com/facebook/react-native/commit/d8f23f79c736812c6da2af5a637eb29bf62510e4
Specifying --appIdSuffix [string] when you doing the run-android thing fixes this.

Hi @jaggerwang, sorry for delay.
Could you please try solution that @EvianZhow offered.
Please let me know any results!

Still the same.

➜  app-dp-rn git:(master) ✗ react-native run-android --appIdSuffix .debug
Scanning folders for symlinks in /Users/jagger/projects/bici/gtgj/app-dp-rn/node_modules (19ms)
JS server already running.
Building and installing the app on the device (cd android && ./gradlew installDebug)...

> Configure project :app
Configuration 'compile' in project ':app' is deprecated. Use 'implementation' instead.

> Configure project :react-native-charts-wrapper
Configuration 'compile' in project ':react-native-charts-wrapper' is deprecated. Use 'implementation' instead.

> Configure project :react-native-code-push
Configuration 'compile' in project ':react-native-code-push' is deprecated. Use 'implementation' instead.

> Configure project :react-native-vector-icons
Configuration 'compile' in project ':react-native-vector-icons' is deprecated. Use 'implementation' instead.

> Task :app:generateBundledResourcesHashDebug
4f53cda18c2baa0c0354bb5f9a3ecbe5ed12ab4d8e11ba873c2f11161202b945

> Task :app:installDebug
Installing APK 'app-debug.apk' on '6.0-1080p(AVD) - 6.0' for app:debug
Installed on 1 device.


BUILD SUCCESSFUL in 28s
85 actionable tasks: 51 executed, 34 up-to-date
Running /Users/jagger/Library/Android/sdk/platform-tools/adb -s emulator-5554 reverse tcp:8081 tcp:8081
Starting the app on emulator-5554 (/Users/jagger/Library/Android/sdk/platform-tools/adb -s emulator-5554 shell am start -n com.bicisims.gtgjdp..debug/com.bicisims.gtgjdp.MainActivity)...
Starting: Intent { cmp=com.bicisims.gtgjdp..debug/com.bicisims.gtgjdp.MainActivity }
Error type 3
Error: Activity class {com.bicisims.gtgjdp..debug/com.bicisims.gtgjdp.MainActivity} does not exist.

Additional . assigned. --appIdSuffix debug should be just enough.

@jaggerwang
Just a friendly ping, any result?

Yes, it's working. Thanks!

Awesome!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

chrisjrex picture chrisjrex  Â·  4Comments

Phredward picture Phredward  Â·  3Comments

DeDuckProject picture DeDuckProject  Â·  3Comments

jaysig picture jaysig  Â·  3Comments

EdmundMai picture EdmundMai  Â·  4Comments