Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android 11 app crash with "The meta-data tag in your app's AndroidManifest.xml does not have the right value. Expected 12451000 but found 4323000"

My app starts crashing on Android 11 devices with the following error message "The meta-data tag in your app's AndroidManifest.xml does not have the right value. Expected 12451000 but found 4323000". I aware of such issues and I have already define correct value inside the manifest file as follows:

 <meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version" />

If I follow google_play_services_version I can found the expected value

<integer name="google_play_services_version">12451000</integer>

With the help of firebase analytics, I can confirm that it is happening with Android 11 devices only. impacted end user device

From the various SO posts I tried the following things so far:

1- Update all used play service and Firebase dependencies to the latest available version.

2- Used tools: replace with build clean process, in the meta-data tag as follows for both app module as well as for wear module:

<meta-data
        android:name="com.google.android.gms.version"
        android:value="@integer/google_play_services_version"
        tools:replace="android:value" />

3- Check all used 3rd part libs/SDK's manifest files for @integer/google_play_services_version but all are redirecting to the expected value i.e. 12451000.

Following are the build.gradle files: A- build.gradle {:app}-

apply from: '../release-config.gradle'
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'android-release-plugin'
apply plugin: 'testfairy'
apply from: '../sonar.gradle'
apply from: '../jacoco.gradle'
// Add the Firebase Crashlytics plugin.
apply plugin: 'com.google.firebase.crashlytics'

android.testOptions {
 unitTests.all {
    jacoco {
        includeNoLocationClasses = true
    }
}
unitTests.returnDefaultValues = true
}
tasks.sonarqube.dependsOn jacocoTestReport


android {
compileSdkVersion 30
buildToolsVersion '29.0.2'
ndkVersion "16.1.4479499"

kapt {
    javacOptions {
        option("-Adagger.gradle.incremental")
        option("-Adagger.formatGeneratedSource=disabled")
    }
}

dexOptions {
    javaMaxHeapSize "4g"
}

defaultConfig {
    applicationId "com.xx”
    minSdkVersion 23
    targetSdkVersion 30
    multiDexEnabled true
    testInstrumentationRunner 
    "androidx.test.runner.AndroidJUnitRunner"

    buildConfigField "String", "SERVER_BASE", ‘”————“’
    buildConfigField "String", "LOCUSLABS_ACCOUNT_ID", ‘”——“’
    buildConfigField "String", "GCM_SENDER_ID", ‘”———“’
    buildConfigField "String", "GRAB_ID", ‘”———“’
    buildConfigField "String", "GCT_CONVERSION_ID", ‘”———“’
    buildConfigField "String", "GCT_LABEL", ‘”———“’
    buildConfigField "String", "GCT_VALUE", ‘”——“’
}

signingConfigs {

}

buildTypes {
    debug {
        versionNameSuffix "(Debuggable)"
        debuggable true
        zipAlignEnabled true
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
        'proguard-rules.pro'
    }
    release {
        shrinkResources true
        signingConfig signingConfigs.release
        zipAlignEnabled true
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 
      'proguard-rules.pro'
        debuggable false
    }
}

flavorDimensions 'environment'

productFlavors {
    dev {
        applicationIdSuffix ".dev"
        buildConfigField "String", "SERVER_BASE", ‘”——————‘

        def internalVersion = 
         releaseConfig.getAppVersion().internalVersion
        resValue "string", "app_name", "xx (Test) ${internalVersion}"
    }

    stage {
        applicationIdSuffix ".stage"
        buildConfigField "String", "SERVER_BASE", ‘”—————“’—

        def internalVersion = 
        releaseConfig.getAppVersion().internalVersion
        resValue "string", "app_name", "xx (Stage) ${internalVersion}"
    }

    prod {
        buildConfigField "String", "SERVER_BASE", ‘”———“’——
        buildConfigField "String", "LOCUSLABS_ACCOUNT_ID", ‘”———“’
        buildConfigField "String", "GCM_SENDER_ID", ‘”——“’
        buildConfigField "String", "GRAB_ID", ‘”——“’
        buildConfigField "String", "GCT_CONVERSION_ID", ‘”———“’
        buildConfigField "String", "GCT_LABEL", ‘”———“’
    }
}

 packagingOptions {
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/ASL2.0'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/**rxjava.properties**'
}

lintOptions {
    abortOnError false
}

testfairyConfig {
    apiKey “———————“
}

testOptions {
    unitTests.returnDefaultValues = true
}

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
}

androidExtensions {
    experimental = true
}
}

def powermock_version = "2.0.2"
def daggerVersion = "2.16"
def leak_canary_version = "2.0-beta-1"

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation project(':common')
implementation('com.facebook.android:facebook-android-sdk:5.15.3') {
    exclude group: 'com.android.support'
}
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.cardview:cardview:1.0.0'
implementation "androidx.constraintlayout:constraintlayout:2.0.2"
implementation "com.google.android.gms:play-services-base:17.4.0"
implementation "com.google.android.gms:play-services-location:17.1.0"
implementation "com.google.android.gms:play-services-maps:17.0.0"
implementation "com.google.android.gms:play-services-vision:20.1.2"
implementation "com.google.android.gms:play-services-wearable:17.0.0"
implementation 'androidx.core:core:1.3.2'
implementation 'com.romandanylyk:pageindicatorview:1.0.3'
implementation 'com.getbase:floatingactionbutton:1.10.1'
implementation 'com.wdullaer:materialdatetimepicker:4.2.3'

// need by grab sdk
implementation 'androidx.viewpager2:viewpager2:1.0.0'
implementation 'com.github.JakeWharton:ViewPagerIndicator:2.4.1'
implementation('com.squareup.retrofit2:retrofit:2.5.0') {
    // exclude Retrofit’s OkHttp peer-dependency module and define 
   your own module import
    exclude module: 'okhttp'
}
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
implementation 'com.squareup.okhttp3:logging-interceptor:3.9.1'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'

implementation 'com.google.zxing:core:3.3.3'
implementation 'io.reactivex.rxjava2:rxjava:2.1.10'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'com.airbnb.android:lottie:2.5.5'
implementation 'me.grantland:autofittextview:0.2.1'


implementation 'org.greenrobot:eventbus:3.1.1'
implementation 'com.github.bumptech.glide:glide:4.11.0'
kapt 'com.github.bumptech.glide:compiler:4.11.0'
implementation 'org.kamranzafar:jtar:2.2'
implementation 'org.tukaani:xz:1.5'
implementation 'io.reactivex:rxjava:1.3.0'
implementation 'io.reactivex:rxandroid:1.2.1'
implementation(name: 'locuslabs-android-sdk-2.3.10', ext: 'aar') {
    transitive = true
}
 implementation 'com.facebook.soloader:soloader:0.9.0'
implementation 'com.facebook.litho:litho-core:0.38.0'
implementation 'com.facebook.litho:litho-widget:0.38.0'
compileOnly 'com.facebook.litho:litho-annotations:0.38.0'
kapt 'com.facebook.litho:litho-processor:0.38.0'

// Firebase Dependencies
implementation "com.google.firebase:firebase-messaging:20.3.0"
// Add the Firebase Crashlytics SDK.
implementation 'com.google.firebase:firebase-crashlytics:17.2.2'
// Add the Firebase SDK for Google Analytics
implementation 'com.google.firebase:firebase-analytics:17.6.0'
implementation "com.google.firebase:firebase-core:17.5.1"

// Grab Dependencies
implementation(name: 'grab-framework-1.1.33', ext: 'aar')
implementation 'com.braintreepayments.api:braintree:2.16.0'
implementation 'com.android.volley:volley:1.1.1'
implementation 'androidx.recyclerview:recyclerview:1.1.0'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.amulyakhare:com.amulyakhare.textdrawable:1.0.1'
implementation 'de.hdodenhof:circleimageview:2.0.0'
implementation 'org.kamranzafar:jtar:2.2'
implementation group: 'com.googlecode.libphonenumber', name: 
'libphonenumber', version: '8.4.1'
implementation 'io.card:android-sdk:5.5.1'
api 'com.wunderlist:sliding-layer:1.2.5'

// Background Process
implementation 'com.evernote:android-job:1.4.2'

// Dagger
implementation "com.google.dagger:dagger-android:$daggerVersion"
implementation "com.google.dagger:dagger-android-support:$daggerVersion"
kapt "com.google.dagger:dagger-android-processor:$daggerVersion"
kapt "com.google.dagger:dagger-compiler:$daggerVersion"

// Paging
implementation 'androidx.paging:paging-runtime:2.1.2'

// Lifecycle
implementation "androidx.lifecycle:lifecycle-runtime:2.2.0"
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
kapt "androidx.lifecycle:lifecycle-compiler:2.2.0"

// Utils
implementation 'com.jakewharton.timber:timber:4.7.1'

//For updating styles attributes dynamically
implementation 'com.airbnb.android:paris:1.7.1'

// A memory leak detection library.
debugImplementation "com.squareup.leakcanary:leakcanary-android:${leak_canary_version}"
implementation "com.squareup.leakcanary:leakcanary-object-watcher-android:${leak_canary_version}"
implementation 'com.intuit.sdp:sdp-android:1.0.6'

wearApp project(':wearable')

//Test
testImplementation 'junit:junit:4.12'
testImplementation 'org.mockito:mockito-core:2.23.0'

testImplementation "org.powermock:powermock-module-junit4:${powermock_version}"
testImplementation "org.powermock:powermock-module-junit4-rule:${powermock_version}"
testImplementation "org.powermock:powermock-api-mockito2:${powermock_version}"
testImplementation "org.powermock:powermock-classloading-xstream:${powermock_version}"

androidTestImplementation('androidx.test.espresso:espresso-core:3.3.0') {
    exclude group: 'com.google.code.findbugs'
    exclude group: 'com.android.support', module: 'support-annotations'
}

androidTestImplementation('androidx.test:runner:1.3.0') {
    exclude group: 'com.android.support', module: 'support-annotations'
}
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation ("com.github.tomeees:scrollpicker:1.7.4")

 }

 apply plugin: 'com.google.gms.google-services'

B- Top-level build.gradle file:

buildscript {
ext.kotlin_version = '1.3.72'

repositories {       
    maven { url 'https://plugins.gradle.org/m2/' }
    maven { url "http://www.bugsense.com/gradle/" }
    mavenLocal()
    jcenter()
    google()
    }

    dependencies {
    classpath 'com.android.tools.build:gradle:4.0.2'
    classpath 'com.dminc.gradle:android-release-plugin:1.1.0.6'
    classpath 'com.testfairy.plugins.gradle:testfairy:2.0'
    classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.2'
    classpath 'com.google.gms:google-services:4.3.4'
    classpath 'com.google.firebase:firebase-crashlytics-gradle:2.3.0'
    classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }

    }

     allprojects {
     repositories {
     flatDir { dirs 'libs' }
     mavenLocal()
     mavenCentral()
     google()
     }
     }

I am checking for Play service availability from my Splash screen {luncher activity}. I even tried to catch thrown exception by applying try-catch and able to catch it successfully but app still crashing :

I am checking for Play service availability from my Splash screen {luncher activity}. I even tried to catch thrown exception by applying try catch and able to catch it successfully but app still crashing :

    public static int checkPlayServices(Context activity) {
     int retValue;

    try {
        int resultCode = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(activity);
        Timber.tag(TAG).d(  "This device is supported with api version%s",
                                                            GoogleApiAvailability.getInstance().getClientVersion(activity));

        if (resultCode != ConnectionResult.SUCCESS) {
            if (GoogleApiAvailability.getInstance().isUserResolvableError(resultCode)) {
                retValue = PLAY_STORE_RESOLVABLE_ERROR;
                Timber.tag(TAG).d( "This device is supported but can be resolved.");
            } else {
                Timber.tag(TAG).d(  "This device is not supported and cannot be resolved.");
                retValue = PLAY_STORE_UN_SUPPORT;
            }
        } else {
            retValue = PLAY_STORE_AVAILABLE;
        }
    } catch (java.lang.IllegalStateException e) {
        Timber.tag(TAG).d( "This device Throws Illegal state Exception. Probably caused by google_play_services_version");
        Timber.tag(TAG).e( e.getMessage());
        retValue = PLAY_STORE_VERSION_ERROR;
    } catch (java.lang.Exception e) {
        Timber.tag(TAG).d(  "This device Throws Exception. Exact Reason is unknown");
        Timber.tag(TAG).e(  e.getMessage());
        retValue = PLAY_STORE_ERROR;
    }
    return retValue;
}

I am able to catch but app still got crashes which leads me to another idea that maybe some other SDK dependency is throwing this exception. I check all 3rd SDK's and found that two other SDK's {Facebook and Braintree payments is also checking for Google play service}.

_ I have removed both SDK's but still getting crash.

Note: This crash is happening only on Android 11 devices/emulators for all build versions.

Now I have no option to try. Any leads would be very helpful.

Thanks in advance.

like image 734
Adarsh Yadav Avatar asked Oct 09 '20 10:10

Adarsh Yadav


People also ask

What is metadata in Androidmanifest file?

It's used in Android to add objects to the manifest, for example if using Google Service one would add it to designate the Google Services version the app binds to. Show activity on this post. Metadata is data that describes other data to inform other applications how to use the data itself.

When does Android vitals consider crashes excessive?

Android vitals considers crashes excessive when an app: Exhibits at least one crash in at least 1.09% of its daily sessions. Exhibits two or more crashes in at least 0.18% of its daily sessions. A daily session refers to a day in which your app was used.

What happens when an Android app crashes?

An app that is written using native-code languages crashes if there’s an unhandled signal, such as SIGSEGV, during its execution. When an app crashes, Android terminates the app's process and displays a dialog to let the user know that the app has stopped, as shown in figure 1.

How do I view crash stack traces in Android vitals?

You can view crash stack traces in Android vitals. The first step to fix a crash is to identify the place where it happens. You can use the stack trace available in the report details if you are using Play Console or the output of the logcat tool.

Why does my app crash when throwing an unhandled exception?

An app that is written using Java or Kotlin crashes if it throws an unhandled exception, represented by the Throwable class. An app that is written using native-code languages crashes if there’s an unhandled signal, such as SIGSEGV, during its execution.


1 Answers

Issue has been fixed.

Just change the order of the meta tag. The version tag should always come first.

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />

        <meta-data
            android:name="com.google.android.maps.v2.API_KEY"
            android:value="@string/google_api_key"
            tools:replace="android:value" />
like image 66
Rahul Gupta Avatar answered Sep 22 '22 17:09

Rahul Gupta