3

I want to distribute my App to as many users as possible through Google Play Store, but I'm experiencing strange behavior about the compatible devices for my updated App (I'm updating the App, keeping the same App id; the old version - the current online production version - was last updated on 2021).

I've already read all the related questions on Stack Overflow and also the official Android documentation. I'm using the latest version of Android Studio, building App Bundle format.

Play Console states for both versions the same amount of compatible devices (around 19k+).

On some devices the new one isn't compatible but the old one is and can be installed.

Here are some devices detected as incompatible by the Play Store (all not rooted):

  • OnePlus Nord with Qualcomm SDM765G, model AC2003, 5G Octa-core, Android 12, OxygenOS Contributor, kernel 4.19.157-perf+
  • EMUI HUAWEI Mate 20 Pro, model LYA-L09, GPU Turbo, EMUI version 12.0.0, processor Huawei Kirin 980, resolution 3120x1440, "Mainline" software updated 01-02-2023, Android 12
  • Redmi Note 10 Pro, MIUI Global 14.0.2.0, Android 13 TKQ1
  • Galaxy A50, model SM-A505FN/DS, OneUI 3.1, Android 11, Google Play Store updated at 01-03-2023, kernel 4.14.113, Knox 3.7

I've already tried these, with no success:

  • ask users to clear cache and data of Play Store App and Play Services App
  • ask users to update everything possible on their device
  • ask users to search for the App by name in the Play Store
  • ask users to follow the "internal test url" provided by Play Console to participate in the internal test as a tester -> in this case the web page says that the device is incompatible; for other users instead it says that they have already joined the test program but the url "download it from Google Play Store" leads to the App page that says the device is incompatible
  • rebuild and re-upload a new internal version of the App adding <supports-screens android:xlargeScreens="true" android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:anyDensity="true" android:resizeable="true" />

Here is the message on Play Store:

enter image description here

This App is not compatible for your device because it was created for an older version of Android.

My App targets Api 33 (Android 13) and the minimum target is 19 (Android 4.4). So, it's so obvious that the Android version is compatible!

Generated manifest in the .apk (old App version):

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    platformBuildVersionCode="29"
    platformBuildVersionName="10"
    package="com.app.my"
    android:compileSdkVersion="29"
    android:compileSdkVersionCodename="10"
    android:versionCode="24"
    android:versionName="2.1">

    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="29" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE" />

    <application
        android:theme="@ref/0xtheme"
        android:label="@ref/0xlabel"
        android:icon="@ref/0xicon"
        android:roundIcon="@ref/0xroundIcon"
        android:supportsRtl="true"
        android:appComponentFactory="androidx.core.app.CoreComponentFactory">

        <activity
            android:name="com.app.my.MainActivity"
            android:theme="@ref/0xtheme"
            android:label="@ref/0xlabel"
            android:screenOrientation="1">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="com.app.my.NotificationReceiver" />
        <receiver
            android:name="com.app.my.BootReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-12345" />

        <provider
            android:name="com.google.firebase.provider.FirebaseInitProvider"
            android:authorities="com.app.my.firebaseinitprovider"
            android:directBootAware="true"
            android:exported="false"
            android:initOrder="100" />
            
        <service
            android:name="com.google.firebase.components.ComponentDiscoveryService"
            android:directBootAware="true"
            android:exported="false">
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.crashlytics.CrashlyticsRegistrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.analytics.connector.internal.AnalyticsConnectorRegistrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.installations.FirebaseInstallationsRegistrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.dynamicloading.DynamicLoadingRegistrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
        </service>

        <service
            android:name="com.google.android.datatransport.runtime.backends.TransportBackendDiscovery"
            android:exported="false">
            <meta-data
                android:name="backend:com.google.android.datatransport.cct.CctBackendFactory"
                android:value="cct" />
        </service>

        <receiver
            android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
            android:enabled="true"
            android:exported="false"/>

        <service
            android:name="com.google.android.gms.measurement.AppMeasurementService"
            android:enabled="true"
            android:exported="false" />

        <service
            android:name="com.google.android.gms.measurement.AppMeasurementJobService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:enabled="true"
            android:exported="false" />

        <activity
            android:theme="@ref/0xtheme"
            android:name="com.google.android.gms.ads.AdActivity"
            android:exported="false"
            android:configChanges="0xfb0" />

        <provider
            android:name="com.google.android.gms.ads.MobileAdsInitProvider"
            android:exported="false"
            android:authorities="com.app.my.mobileadsinitprovider"
            android:initOrder="100" />

        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@ref/0x7f0a0009" />

        <service
            android:name="com.google.android.datatransport.runtime.scheduling.jobscheduling.JobInfoSchedulerService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="false"/>
        
        <receiver
            android:name="com.google.android.datatransport.runtime.scheduling.jobscheduling.AlarmManagerSchedulerBroadcastReceiver"
            android:exported="false" />

<!-- not in the new version -->
    
    <uses-permission android:name="com.android.vending.CHECK_LICENSE" />

        <provider
            android:name="androidx.lifecycle.ProcessLifecycleOwnerInitializer"
            android:exported="false"
            android:multiprocess="true"
            android:authorities="com.app.my.lifecycle-process" />

    </application>
</manifest>

Generated manifest in the .aab (new App version):

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    platformBuildVersionCode="33"
    platformBuildVersionName="13"
    package="com.app.my"
    android:compileSdkVersion="33"
    android:compileSdkVersionCodename="13"
    android:versionCode="33"
    android:versionName="3.0.3">

    <uses-sdk android:minSdkVersion="19" android:targetSdkVersion="33" />

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE" />

    <application
        android:theme="@style/AppTheme"
        android:label="@string/app_name"
        android:icon="@mipmap/ic_launcher"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:appComponentFactory="androidx.core.app.CoreComponentFactory">
        
        <activity
            android:name="com.app.my.MainActivity"
            android:theme="@style/AppTheme.NoActionBar"
            android:label="@string/app_name"
            android:screenOrientation="portrait"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <receiver android:name="com.app.my.NotificationReceiver" />
        <receiver
            android:name="com.app.my.BootReceiver"
            android:exported="false" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>

        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-12345" />

        <provider
            android:name="com.google.firebase.provider.FirebaseInitProvider"
            android:authorities="com.app.my.firebaseinitprovider"
            android:directBootAware="true"
            android:exported="false"
            android:initOrder="100" />
        
        <service
            android:name="com.google.firebase.components.ComponentDiscoveryService"
            android:directBootAware="true"
            android:exported="false" >
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.crashlytics.CrashlyticsRegistrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.analytics.connector.internal.AnalyticsConnectorRegistrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
            <meta-data
                android:name="com.google.firebase.components:com.google.firebase.installations.FirebaseInstallationsRegistrar"
                android:value="com.google.firebase.components.ComponentRegistrar" />
        </service>
        
        <service
            android:name="com.google.android.datatransport.runtime.backends.TransportBackendDiscovery"
            android:exported="false" >
            <meta-data
                android:name="backend:com.google.android.datatransport.cct.CctBackendFactory"
                android:value="cct" />
        </service>
        
        <receiver
            android:name="com.google.android.gms.measurement.AppMeasurementReceiver"
            android:enabled="true"
            android:exported="false" >
        </receiver>
        
        <service
            android:name="com.google.android.gms.measurement.AppMeasurementService"
            android:enabled="true"
            android:exported="false" />
            
        <service
            android:name="com.google.android.gms.measurement.AppMeasurementJobService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:enabled="true"
            android:exported="false" />
        
        <activity
            android:theme="@android:style/Theme.Translucent"
            android:name="com.google.android.gms.ads.AdActivity"
            android:exported="false"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize" />
        
        <provider
            android:name="com.google.android.gms.ads.MobileAdsInitProvider"
            android:exported="false"
            android:authorities="com.app.my.mobileadsinitprovider"
            android:initOrder="100" />
        
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        
        <service
            android:name="com.google.android.datatransport.runtime.scheduling.jobscheduling.JobInfoSchedulerService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="false" >
        </service>
        
        <receiver
            android:name="com.google.android.datatransport.runtime.scheduling.jobscheduling.AlarmManagerSchedulerBroadcastReceiver"
            android:exported="false" />

<!-- the below aren't in the old versoin -->

    <uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
    <uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
    <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
    <uses-permission android:name="com.app.my.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" />
    <uses-permission android:name="com.google.android.gms.permission.AD_ID" />
    <permission android:name="com.app.my.DYNAMIC_RECEIVER_NOT_EXPORTED_PERMISSION" android:protectionLevel="signature" />
    
    <queries>
        <intent>
            <action android:name="android.intent.action.VIEW" />

            <category android:name="android.intent.category.BROWSABLE" />

            <data android:scheme="https" />
        </intent>
        <intent>
            <action android:name="android.support.customtabs.action.CustomTabsService" />
        </intent>
    </queries>
    
        <activity
            android:name="com.app.my.SettingsActivity"
            android:configChanges="orientation|screenSize"
            android:parentActivityName="com.app.my.MainActivity" />

        <provider
            android:name="androidx.core.content.FileProvider"
            android:authorities="com.app.my.provider"
            android:exported="false"
            android:grantUriPermissions="true"
            android:readPermission="com.ANOTHERapp.my.fileprovider.READ" >
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

        <service
            android:name="com.google.android.gms.ads.AdService"
            android:enabled="true"
            android:exported="false" />

        <activity
            android:name="com.google.android.gms.ads.OutOfContextTestingActivity"
            android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"
            android:exported="false" />

        <activity
            android:name="com.google.android.gms.common.api.GoogleApiActivity"
            android:exported="false"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

        <provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="com.app.my.androidx-startup"
            android:exported="false" >
            <meta-data
                android:name="androidx.emoji2.text.EmojiCompatInitializer"
                android:value="androidx.startup" />
            <meta-data
                android:name="androidx.work.WorkManagerInitializer"
                android:value="androidx.startup" />
            <meta-data
                android:name="androidx.lifecycle.ProcessLifecycleInitializer"
                android:value="androidx.startup" />
        </provider>

        <uses-library
            android:name="androidx.window.extensions"
            android:required="false" />
        <uses-library
            android:name="androidx.window.sidecar"
            android:required="false" />

        <service
            android:name="androidx.work.impl.background.systemalarm.SystemAlarmService"
            android:directBootAware="false"
            android:enabled="@bool/enable_system_alarm_service_default"
            android:exported="false" />
        <service
            android:name="androidx.work.impl.background.systemjob.SystemJobService"
            android:directBootAware="false"
            android:enabled="@bool/enable_system_job_service_default"
            android:exported="true"
            android:permission="android.permission.BIND_JOB_SERVICE" />
        <service
            android:name="androidx.work.impl.foreground.SystemForegroundService"
            android:directBootAware="false"
            android:enabled="@bool/enable_system_foreground_service_default"
            android:exported="false" />

        <receiver
            android:name="androidx.work.impl.utils.ForceStopRunnable$BroadcastReceiver"
            android:directBootAware="false"
            android:enabled="true"
            android:exported="false" />
        <receiver
            android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$BatteryChargingProxy"
            android:directBootAware="false"
            android:enabled="false"
            android:exported="false" >
            <intent-filter>
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
                <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$BatteryNotLowProxy"
            android:directBootAware="false"
            android:enabled="false"
            android:exported="false" >
            <intent-filter>
                <action android:name="android.intent.action.BATTERY_OKAY" />
                <action android:name="android.intent.action.BATTERY_LOW" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$StorageNotLowProxy"
            android:directBootAware="false"
            android:enabled="false"
            android:exported="false" >
            <intent-filter>
                <action android:name="android.intent.action.DEVICE_STORAGE_LOW" />
                <action android:name="android.intent.action.DEVICE_STORAGE_OK" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="androidx.work.impl.background.systemalarm.ConstraintProxy$NetworkStateProxy"
            android:directBootAware="false"
            android:enabled="false"
            android:exported="false" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="androidx.work.impl.background.systemalarm.RescheduleReceiver"
            android:directBootAware="false"
            android:enabled="false"
            android:exported="false" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.TIME_SET" />
                <action android:name="android.intent.action.TIMEZONE_CHANGED" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="androidx.work.impl.background.systemalarm.ConstraintProxyUpdateReceiver"
            android:directBootAware="false"
            android:enabled="@bool/enable_system_alarm_service_default"
            android:exported="false" >
            <intent-filter>
                <action android:name="androidx.work.impl.background.systemalarm.UpdateProxies" />
            </intent-filter>
        </receiver>
        <receiver
            android:name="androidx.work.impl.diagnostics.DiagnosticsReceiver"
            android:directBootAware="false"
            android:enabled="true"
            android:exported="true"
            android:permission="android.permission.DUMP" >
            <intent-filter>
                <action android:name="androidx.work.diagnostics.REQUEST_DIAGNOSTICS" />
            </intent-filter>
        </receiver>

        <service
            android:name="androidx.room.MultiInstanceInvalidationService"
            android:directBootAware="true"
            android:exported="false" />
        
    </application>

</manifest>

build.gradle of the old App version:

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'

android {
    compileSdkVersion 29

    defaultConfig {
        applicationId "com.app.my"
        minSdkVersion 19
        targetSdkVersion 29
        versionCode 24
        versionName "2.1"
        
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            debuggable true
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            debuggable false
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.google.android.material:material:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'androidx.navigation:navigation-fragment:2.1.0'
    implementation 'androidx.navigation:navigation-ui:2.1.0'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.1.0'
    implementation 'org.jetbrains:annotations-java5:15.0'
    implementation 'com.google.android.gms:play-services-ads:19.2.0'
    implementation project(path: ':lvl_library') // it was used for the Google licensing verification
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test.ext:junit:1.1.1'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
    // Import the Firebase BoM
    implementation platform('com.google.firebase:firebase-bom:27.1.0')
    // Add the dependency for the Firebase SDK for Google Analytics
    // When using the BoM, don't specify versions in Firebase dependencies
    implementation 'com.google.firebase:firebase-crashlytics'
    implementation 'com.google.firebase:firebase-analytics'
}

build.gradle of the new App version:

apply plugin: 'com.android.application'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'

android {
    compileSdkVersion 33

    defaultConfig {
        applicationId "com.app.my"
        minSdkVersion 19
        targetSdkVersion 33
        versionCode 34
        versionName "3.0.4"
        
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        debug {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            debuggable true
        }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            debuggable false
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_11
        targetCompatibility JavaVersion.VERSION_11
    }
    namespace 'com.app.my'
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'com.google.android.material:material:1.8.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'androidx.navigation:navigation-fragment:2.5.3'
    implementation 'androidx.navigation:navigation-ui:2.5.3'
    implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
    implementation 'com.google.android.gms:play-services-ads:21.5.0'
    implementation 'androidx.preference:preference:1.2.0'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
    implementation 'com.google.android.play:integrity:1.1.0'
    // Import the Firebase BoM
    implementation platform('com.google.firebase:firebase-bom:31.2.3')
    // Add the dependency for the Firebase SDK for Google Analytics
    // When using the BoM, don't specify versions in Firebase dependencies
    implementation 'com.google.firebase:firebase-crashlytics:18.3.5'
    implementation 'com.google.firebase:firebase-analytics:21.2.0'
}

Why aren't these devices detected as compatible? And how can I make my App as much compatible as possible?

Thanks!

user2342558
  • 5,567
  • 5
  • 33
  • 54
  • By "Google Play" you mean the Store app or the PlayServices? My guess would be that the latter is outdated. The users should be able to check if there is an update for Play Services available by browsing to https://play.google.com/store/apps/details?id=com.google.android.gms (should be redirected to PlayStore app and showing if there is an update available). Alternatively there are helper apps like https://play.google.com/store/apps/details?id=com.weberdo.apps.serviceinfo available for displaying the version. – Robert Apr 14 '23 at 17:58
  • @Robert I mean Google Play Store. I'll ask users to retry check the version of Google Play Services. Your suggested helper App is outdated at 2018 and doesn't support more than Android 9. – user2342558 Apr 15 '23 at 07:28
  • The helper app I have linked works fine on my Android 13 Pixel device. I don't know why you think it is limited to Android 9. – Robert Apr 15 '23 at 08:19
  • @Robert the App itself says in the "What's new" section that it supports Android 9 and was last updated on 2018 (5 years ago) (maybe it works also for the newer versions). Anyway, the user with the OnePlus Nord double checked that it already has installed the latest version of Google Play Store App (by using your link) – user2342558 Apr 15 '23 at 12:56

1 Answers1

5

I come from the thread: App was created for an older version of android

It seems that the Play Store has a strange bug when the internal test apk has a higher targetSdk than production, causing the message the application was created for an older android version to be displayed when you access the internal test.

In our case, following the last post in this thread: This app isn't available for your device because it was made for an older version of Android we've directly launched the new apk to production, and we didn't have any more problems.

I hope it helps you.

user2342558
  • 5,567
  • 5
  • 33
  • 54