React-native-onesignal: Google Play Services Library Error

Created on 21 May 2018  ·  37Comments  ·  Source: OneSignal/react-native-onesignal

Description:

The registred device returns an error on OneSignal dashboard, therefore unable to receive push notifications.

Environment

react-native -v
react-native-cli: 2.0.1
react-native: 0.55.4

package.json

"dependencies": {
    "react": "16.3.1",
    "react-native": "0.55.4",
    "react-native-onesignal": "^3.2.3"
  }

Steps to Reproduce Issue:

  1. react-native init OneSignalTest
  2. cd OneSignalTest
  3. yarn install
  4. yarn add react-native-onesignal
  5. react-native link
  6. Follow : https://documentation.onesignal.com/docs#section-android-specific-instructions
  7. On android/app/build.gradle, insert compile project(':react-native-onesignal')on dependencies. It can't compile without that dependence.
  8. On App.js class, insert the listeners : https://documentation.onesignal.com/docs#section-usage
  9. On ComponentWillMount insert this OneSignal.configure(); to force a return on onIds.
    on Ids listener , erase the class method and create a local one, so we can see the id.
    If we didn't do it, the id would never return
OneSignal.addEventListener('ids', device => {
      console.log('[OneSignal]>>ids: ', device);
    });

On Init insert your app ID.

  1. then : react-native run-android.
    (On adb logcat it will return an error, but you will se the id on debug mode.)
  2. Search the id on OneSignal Dashboard and there it is.

Anything else:

E/OneSignal(31234): Unknown error getting FCM Token
E/OneSignal(31234): java.lang.NoSuchMethodError: No static method isDeviceProtectedStorage(Landroid/content/Context;)Z in class Landroid/support/v4/content/ContextCompat; or its super classes (declaration of 'android.support.v4.content.ContextCompat' appears in /data/app/com.onesignaltest-1/base.apk)
E/OneSignal(31234):     at com.google.firebase.FirebaseApp.zza(Unknown Source)
E/OneSignal(31234):     at com.google.firebase.FirebaseApp.initializeApp(Unknown Source)
E/OneSignal(31234):     at com.onesignal.PushRegistratorFCM.initFirebaseApp(PushRegistratorFCM.java:64)
E/OneSignal(31234):     at com.onesignal.PushRegistratorFCM.getToken(PushRegistratorFCM.java:50)
E/OneSignal(31234):     at com.onesignal.PushRegistratorAbstractGoogle.attemptRegistration(PushRegistratorAbstractGoogle.java:97)
E/OneSignal(31234):     at com.onesignal.PushRegistratorAbstractGoogle.access$100(PushRegistratorAbstractGoogle.java:37)
E/OneSignal(31234):     at com.onesignal.PushRegistratorAbstractGoogle$1.run(PushRegistratorAbstractGoogle.java:84)
E/OneSignal(31234):     at java.lang.Thread.run(Thread.java:818)

googleplayserviceserror

Edit 1:
I've tried to do those, but without success:

Most helpful comment

@brunoandradebr @DaniloCouto @ifanfaizal I fix, i change sdkVersion and version appcompat

Changes:
app/build.gradle

compileSdkVersion 26
buildToolsVersion "26.0.2"

In dependencies
change
compile "com.android.support:appcompat-v7:23.0.1"
to
compile "com.android.support:appcompat-v7:26.0.1"

My build.gradle (android)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        maven {  // <-- THIS
            url 'https://maven.google.com/' // <-- THIS
            name 'Google' // <-- THIS
        } // <-- THIS
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenLocal()
        jcenter()
        maven { 
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
        maven { // <-- THIS
            url 'https://maven.google.com/' // <-- THIS
            name 'Google' // <-- THIS
        } // <-- THIS
    }
}

In cmd: cd android && gradlew clean

Uninstall app from my AVD and compile with react-native

All 37 comments

@DaniloCouto This is definitely an android support library version issue. Can you post your app/build.gradle?

@DaniloCouto check the new version 3.2.4, they fix it.

@adirzoari , Still happens on 3.2.4, with the same errors on Adb logcat and on Onesignal User Dashboard.
yarn add [email protected]
package.json

"dependencies": {
    "react": "16.3.1",
    "react-native": "0.55.4",
    "react-native-onesignal": "3.2.4"
  },

@Nightsd01 Sure thing, here it is:
app/build.gradle(I've deleted the generated comments)

apply plugin: "com.android.application"

import com.android.build.OutputFile

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

apply from: "../../node_modules/react-native/react.gradle"

def enableSeparateBuildPerCPUArchitecture = false

def enableProguardInReleaseBuilds = false

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.onesignaltest"
        minSdkVersion 16
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false 
            include "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        }
    }
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def versionCodes = ["armeabi-v7a":1, "x86":2]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) { 
                output.versionCodeOverride =
                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
            }
        }
    }
}

dependencies {
    compile project(':react-native-onesignal') // I just added this line 
    compile fileTree(dir: "libs", include: ["*.jar"])
    compile "com.android.support:appcompat-v7:23.0.1"
    compile "com.facebook.react:react-native:+" 
}

task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}

Edit 1:
I've added these at start of the file. Nothing has changed:

buildscript {
    repositories {
        maven { url 'https://plugins.gradle.org/m2/' } // Gradle Plugin Portal 
    }
    dependencies {
        classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:[0.10.0, 0.99.99]'
    }
}

apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'
...
...
...
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    ...
    ...
}

Of course, I've clean the android project with gradlew clean and tried to rebuild.

@DaniloCouto Are you just using the react-native-onesignal example project...?

Can you also post your AndroidManifest.xml file? Thanks

@Nightsd01 I've created a new react-native project and added the react-native-onesignal package through Yarn.

Here it is:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.onesignaltest">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- Onesignal Instruction -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> <!-- Onesignal Instruction -->

    <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:allowBackup="false"
      android:theme="@style/AppTheme"
      > <!-- android:launchMode="singleTop" I Was wrong at this line-->
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="adjustResize"
        android:launchMode="singleTop"> <!-- brunoandradebr made a pretty nice observation right here -->
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
      </activity>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
    </application>

</manifest>

Edit 1:
Following #387 sollution, i've added this line. Nothing has changed

<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>

Edit 2:
As well observed by @brunoandradebr , the android:launchMode="singleTop" need to be on activity tag not on application tag.
But it's still not working..

Same problem here , @DaniloCouto you fix it???

I got the same problem.. @DaniloCouto did you manage to fix it? I searched about it everywhere and still no works :(

@ifanfaizal, @lahed Sorry to hear that, but i'm here to find a solution too...
I've tried to follow those without success:

Danilo, you are supposed to insert
android:launchMode="singleTop"
Inside Activity context not in Application as onesignal instruction.
Btw it's not working as well =[

@brunoandradebr Well observed my fellow countryman.
As you said, it's still not working.

compile "com.google.android.gms:play-services-gcm:+"

Added this to dependence after install Google Play Service from android studio sdk manager, and somehow worked, but the app crashed, then I refreshed onesignal user list and the error keep persisting =[

I think it's working now! I'v installed Google Play Service from Android Studio, It's not supposed to insert any line, you need to close bundle and compile again. It's showing subscribed with a check icon! I don't even inserted onesignal extra lines, it's the same way react native has created.

@brunoandradebr @DaniloCouto @ifanfaizal I fix, i change sdkVersion and version appcompat

Changes:
app/build.gradle

compileSdkVersion 26
buildToolsVersion "26.0.2"

In dependencies
change
compile "com.android.support:appcompat-v7:23.0.1"
to
compile "com.android.support:appcompat-v7:26.0.1"

My build.gradle (android)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        maven {  // <-- THIS
            url 'https://maven.google.com/' // <-- THIS
            name 'Google' // <-- THIS
        } // <-- THIS
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenLocal()
        jcenter()
        maven { 
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
        maven { // <-- THIS
            url 'https://maven.google.com/' // <-- THIS
            name 'Google' // <-- THIS
        } // <-- THIS
    }
}

In cmd: cd android && gradlew clean

Uninstall app from my AVD and compile with react-native

@lahed Aaahhh it's working bro!! 💃 thank you very much for your solution.. I spent 3 days to make it work but no results at all.. and today, you just save my life 😃

@lahed , works like a charms, thx.
I guess it's closed...?
What OneSignal team could do about this ?
An improved react-native link ?

@lahed ty, its work

i have 2 project using one signal
project 1 no need OneSignal.init
but project 2 need to OneSignal.init
any one can explain it?

@stevanus1997 maybe u already defined the init on the build.gradle in project 2 (?) (in other words, u defined OneSignal init with an older way) so u didn't need to init again in App.js

project 1

defaultConfig {
        applicationId "com.xxxxx"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
        manifestPlaceholders = [
               onesignal_app_id: "xxxxxxxxx",
               onesignal_google_project_number: "xxxxxxxxx"
       ]
    }

project 2

defaultConfig {
        applicationId "com.xxxx"
        minSdkVersion 16
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
        manifestPlaceholders = [
                onesignal_app_id               : "xxxxx",
                onesignal_google_project_number: "xxxxx"
        ]
        multiDexEnabled true
    }

@ifanfaizal thats my build.gradle

@lahed thank you so much. Now its working like charm...!!!

I followed @lahed's solution but I still get the same error from OneSignal's dashboard ... could someone show me his fixed android/build.gradle and android/app/build.gradle?

Try close compiler and recompile again.

Done that multiple times already 😕

Have you installed Google Play Service with Android Studio ?

Yup, the latest version of it, I'm running on Android 8.0

android/app/build.gradle:

apply plugin: "com.android.application"
apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'

import com.android.build.OutputFile

apply from: "../../node_modules/react-native/react.gradle"

def enableSeparateBuildPerCPUArchitecture = false
def enableProguardInReleaseBuilds = false

android {
    compileSdkVersion 27
    buildToolsVersion "27.0.2"

    defaultConfig {
        applicationId "xxx"
        minSdkVersion 16
        targetSdkVersion 27
        versionCode 31
        versionName "0.3.0"
        multiDexEnabled true
        vectorDrawables.useSupportLibrary = true
        ndk {
            abiFilters "armeabi-v7a", "x86"
        }
        manifestPlaceholders = [manifestApplicationId: "${applicationId}",
                                onesignal_google_project_number: "xxx"]
    }
    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
            signingConfig signingConfigs.release
        }
    }
    // 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
            }
        }
    }
}

repositories {
    maven { url "https://jitpack.io" }
}

dependencies {
    compile project(':react-native-image-picker')
    compile(project(':react-native-maps')){
        exclude group: 'com.google.android.gms', module: 'play-services-base'
        exclude group: 'com.google.android.gms', module: 'play-services-maps'
    }
    compile 'com.google.android.gms:play-services-base:+'
    compile 'com.google.android.gms:play-services-maps:+'
    compile project(':react-native-svg')
    compile project(':react-native-dialogs')
    compile project(':react-native-onesignal')
    compile fileTree(dir: "libs", include: ["*.jar"])
    compile project(':react-native-vector-icons')
    compile project(':react-native-i18n')
    compile project(':react-native-fetch-blob')
    compile (project(':react-native-camera')) {
        exclude group: "com.android.support"
        exclude group: "com.google.android.gms"
    }
    compile ("com.google.android.gms:play-services-vision:+") {
        force = true;
    }
    compile ('com.android.support:exifinterface:27.0.2') {
        force = true;
    }
    compile "com.android.support:appcompat-v7:27.0.2"
    compile 'com.android.support:support-vector-drawable:27.0.2'
    compile 'com.android.support:animated-vector-drawable:27.0.2'
    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'
}

android/build.gradle:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
        maven {
            url 'https://maven.google.com/'
            name 'Google'
        }
        maven { url 'https://plugins.gradle.org/m2/' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:[0.10.1, 0.99.99]'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenLocal()
        jcenter()
        maven { url "$rootDir/../node_modules/react-native/android" }
        maven {
            url "https://maven.google.com"
            name 'Google'
        }
        maven { url "https://jitpack.io" }
    }
}

Inside one signal list, remove actual device Option > Delete, uninstall debug app then compile again.

+1 not receive onIds with init call from react native js

@congnguyen91 That is expected. The onIds event will only fire when the subscription state (id's) actually change.

If you want to force onIds to fire, you can call OneSignal.configure() after initializing. This is confusing, I know, it's legacy. We'll be refactoring in the next major release to make this less confusing.

Hi @lahed, am I seeing your proposed changes right https://github.com/geektimecoil/react-native-onesignal/issues/525#issuecomment-392224930, the min. required compileSdkVersion and buildToolsVersion is now 26 (which means Android 8.0)? (which matches the notes in the setup guide: https://documentation.onesignal.com/v5.0/docs/react-native-sdk-setup#section-adding-the-gradle-plugin).

Does this mean Android 6.x is not supported anymore, because my current compileSdkVersion and buildToolsVersion is 23 and 23.0.2.

Thanks for your help!

@natterstefan I'm almost certainly not. The one that defines the lower devices is minSdkVersion, so, everything should work perfectly, unless a native API is not supported. I tested on Android 4.4 and it works fine

I solved here....
I uninstalled the google play services packages and onesignal in sequence.
After this i installed onesignal and everything works now.
Ps: Look in archives created after build and verify if the google play services dll is there.
P2s: I'm using onesignal with xamarin applications.

We have updated our documentation to include making sure compileSdkVersion and buildToolsVersion are 26+.
https://documentation.onesignal.com/docs/react-native-sdk-setup#section-adding-the-gradle-plugin

This is one of the things @lahed suggested in https://github.com/geektimecoil/react-native-onesignal/issues/525#issuecomment-392224930.

The other new part is adding the OneSignal Gradle plugin to your project. With this you won't have to manually update appcompat-v7 in your app/build.gradle and resolves issues with conflicting version in other plugins.

Make sure you have follow the new Adding the Gradle Plugin section before creating a new issue or replying here if your seeing the same issue

@lahed thank you so much, I've tried to figure out this issue for 2 days, and finally found a very helpful one here, thank you.

I had the same, but got it working by calling onesignal.configure() like this:

OneSignal.init("my-onesignal-id");
OneSignal.configure();

This was with:
"react-native": "~0.56.0",
"react-native-onesignal": "^3.2.6",

followed the onesignal documentation to the bell and had
apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'

other info:
gradle 3.1.3
ext {
compileSdkVersion = 27
buildToolsVersion = "27.0.3"
minSdkVersion = 16
targetSdkVersion = 27
supportLibVersion = "27.1.1"
googlePlayServicesVersion = "12.0.1"
playServicesVersion = googlePlayServicesVersion
}

In my case, I never got any errors on the OneSignal dashboard; the device was getting registered with OneSignal fine. The onIds were just not firing.

Adding this right after OneSignal.init() fixed my issue:

    OneSignal.configure();

Hope this helps others.

Same issue here

package.json:

{
  "name": "smartial",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "android": "react-native run-android",
    "ios": "react-native run-ios",
    "start": "react-native start",
    "test": "jest",
    "lint": "eslint .",
    "android-linux": "npx react-native run-android --terminal \"$PWD/shkonsole\""
  },
  "dependencies": {
    "@react-native-community/google-signin": "^4.0.3",
    "react-native-onesignal": "^3.7.3",
    "@sentry/react-native": "^1.4.1",
    "react-native-code-push": "^6.2.1",
    "react-native-google-places": "^3.1.2",
    "@react-native-community/datetimepicker": "^2.4.2",
    "@react-native-community/masked-view": "^0.1.10",
    "@react-navigation/material-bottom-tabs": "^5.2.12",
    "@react-navigation/native": "^5.4.3",
    "@react-navigation/stack": "^5.4.0",
    "react-native-gesture-handler": "^1.6.1",
    "native-base": "^2.13.12",
    "react-native-paper": "^3.10.1",
    "react-native-safe-area-context": "^2.0.3",
    "react-native-reanimated": "^1.9.0",
    "react-native-screens": "^2.8.0",
    "apisauce": "^1.1.1",
    "react-native-config": "^1.2.1",
    "react-native-easy-app": "^1.7.3",
    "react-native-vector-icons": "^6.6.0",
    "@thallyssonklein/border-layout-react-native": "^1.0.14",
    "recoil": "github:eveningkid/Recoil#react-native",
    "react": "16.13.1",
    "react-native": "0.63.2"
  },
  "devDependencies": {
    "@babel/core": "^7.10.0",
    "@babel/runtime": "^7.10.0",
    "@bam.tech/react-native-make": "^3.0.0",
    "@react-native-community/eslint-config": "^1.1.0",
    "babel-jest": "^26.0.1",
    "eslint": "^7.1.0",
    "jest": "^26.0.1",
    "metro-react-native-babel-preset": "^0.59.0",
    "react-test-renderer": "16.11.0"
  },
  "jest": {
    "preset": "react-native"
  }
}

android/build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext {
        buildToolsVersion = "28.0.3"
        minSdkVersion = 16
        compileSdkVersion = 28
        targetSdkVersion = 28

        googlePlayServicesAuthVersion = "16.0.1"
    }
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath('com.android.tools.build:gradle:3.6.3')
        classpath 'com.google.gms:google-services:4.1.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenLocal()
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url("$rootDir/../node_modules/react-native/android")
        }
        maven {
            // Android JSC is installed from npm
            url("$rootDir/../node_modules/jsc-android/dist")
        }

        google()
        jcenter()
        maven { url 'https://www.jitpack.io' }
    }
}

android/app/build.gradle

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. If none specified and
 *   // "index.android.js" exists, it will be used. Otherwise "index.js" is
 *   // default. Can be overridden with ENTRY_FILE environment variable.
 *   entryFile: "index.android.js",
 *
 *   // https://facebook.github.io/react-native/docs/performance#enable-the-ram-format
 *   bundleCommand: "ram-bundle",
 *
 *   // 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 = [
    enableHermes: false,  // clean and rebuild if changing
]

apply from: "../../node_modules/react-native/react.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

/**
 * 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);

android {
    compileSdkVersion rootProject.ext.compileSdkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        applicationId "com.smartial"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 24
        versionName "3.0.9"
        multiDexEnabled true
    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
        }
    }
    signingConfigs {
        debug {
            storeFile file('debug.keystore')
            storePassword 'android'
            keyAlias 'androiddebugkey'
            keyPassword 'android'
        }
        release {
            storeFile file('smartial-app.jks')
            storePassword KEYSTORE_PASSWORD
            keyAlias KEY_ALIAS
            keyPassword KEY_PASSWORD
        }
    }
    buildTypes {
        debug {
            signingConfig signingConfigs.debug
        }
        release {
            // Caution! In production, you need to generate your own keystore file.
            // see https://facebook.github.io/react-native/docs/signed-apk-android.
            signingConfig signingConfigs.release
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        }
    }

    packagingOptions {
        pickFirst "lib/armeabi-v7a/libc++_shared.so"
        pickFirst "lib/arm64-v8a/libc++_shared.so"
        pickFirst "lib/x86/libc++_shared.so"
        pickFirst "lib/x86_64/libc++_shared.so"
    }

    // 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:
            // https://developer.android.com/studio/build/configure-apk-splits.html
            def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
            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 {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    // implementation 'com.google.android.gms:play-services-auth:18.0.0'
    // implementation "com.google.android.gms:play-services-base:16.0.1"
    // implementation "com.google.firebase:firebase-core:16.0.6"
    // implementation "com.google.firebase:firebase-messaging:17.3.4"
    //noinspection GradleDynamicVersion
    implementation "com.facebook.react:react-native:+"  // From node_modules

    implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
    compile 'com.android.support:multidex:1.0.1' //enter the latest version

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

    if (enableHermes) {
        def hermesPath = "../../node_modules/hermes-engine/android/";
        debugImplementation files(hermesPath + "hermes-debug.aar")
        releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
        implementation jscFlavor
    }

    implementation project(':react-native-config')
    compile project(':react-native-onesignal') // I just added this line 
}

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

apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
apply from: "../../node_modules/react-native-code-push/android/codepush.gradle"
apply from: "../../node_modules/react-native-vector-icons/fonts.gradle"

apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle"

apply plugin: 'com.google.gms.google-services' // <--- this should be the last line

src/main/AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="com.smartial">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>


    <application
      android:name=".MainApplication"
      android:label="@string/app_name"
      android:icon="@mipmap/ic_launcher"
      android:allowBackup="false"
      android:theme="@style/AppTheme">
      <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
        android:launchMode="singleTask"
        android:windowSoftInputMode="adjustResize">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
      </activity>
      <activity android:name="com.facebook.react.devsupport.DevSettingsActivity" />
    </application>

</manifest>

src/debug/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>

    <application android:usesCleartextTraffic="true" tools:targetApi="28" tools:ignore="GoogleAppIndexingWarning" />
</manifest>

Was this page helpful?
0 / 5 - 0 ratings