Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use of Configuration APKs while still targeting pre lollipop devices

When developing for Instant Apps the use of Configuration APKs (https://developer.android.com/topic/instant-apps/guides/config-splits.html) offers useful option for cutting down on APK size. However it looks like they are only supported when using mindSdk of 21 or later. For example, you get following error if you try to use this capability for lower sdk versions.

MinSdkVersion 17 is too low (<21) to support pure splits, reverting to full APKs

Is there way to have base module for example use pure split functionality while still having installed app target pre lollipop devices?

like image 468
John O'Reilly Avatar asked Nov 30 '25 06:11

John O'Reilly


2 Answers

Since the minSdkVersion flag will toggle quite a few checks, this change is not done automatically for you.

I'd recommend introducing a product flavor for both the installed and instant module with different minSdkVersions, like this:

// :feature/base/build.gradle

flavorDimensions 'delivery'

productFlavors {
    instant {
        dimension 'delivery'
        minSdkVersion rootProject.minSdkInstant
    }
    installed {
        dimension 'delivery'
    }
}

This will have to be done similarly in other modules that depend on the feature module with API level < 21.

like image 74
keyboardsurfer Avatar answered Dec 01 '25 20:12

keyboardsurfer


Instant apps are only supported in API 21+ devices (link), older devices will only support full apk.

The better approach is to define different minSdk based on your module, like:

You can take a look at Google's analytics sample on GitHub

Project's gradle

ext {
    buildTools = '26.0.2'
    compileSdk = 26
    minSdk = 15
    minSdkInstant = 21
    versionCode = 1
    versionName = '1.0'
    supportLib = '26.1.0'
    firebaseVer = '10.2.4'
    instantAppsVer = '1.0.0'
}

Base gradle

android {
    compileSdkVersion rootProject.compileSdk
    buildToolsVersion rootProject.buildTools
    baseFeature true
    defaultConfig {
        minSdkVersion rootProject.minSdk
        targetSdkVersion rootProject.compileSdk
        versionCode rootProject.versionCode
        versionName rootProject.versionName
    }
    buildTypes {
        release {}
    }
}

Installed gradle

 defaultConfig {
        applicationId "com.example.android.instant.analytics"
        minSdkVersion rootProject.minSdk
        targetSdkVersion rootProject.compileSdk
        versionCode rootProject.versionCode
        versionName rootProject.versionName

    }

Instant gradle

android {
    defaultConfig {
        minSdkVersion rootProject.minSdkInstant
    }
}
like image 20
Ariel Carbonaro Avatar answered Dec 01 '25 21:12

Ariel Carbonaro