Use of Configuration APKs while still targeting pre lollipop devices

前端 未结 3 1402
眼角桃花
眼角桃花 2021-01-20 14:56

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

相关标签:
3条回答
  • 2021-01-20 15:14

    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.

    0 讨论(0)
  • 2021-01-20 15:17

    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
        }
    }
    
    0 讨论(0)
  • 2021-01-20 15:27

    You can specify a different lower minSdkVersion for your application module if you use tools:overrideLibrary Please see How do I use tools:overrideLibrary in a build.gradle file?

    This is how I did it:

    app/build.gradle

    android {
        defaultConfig {
            minSdkVersion 17
        }
    }
    

    app’s manifest

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.package.app" xmlns:tools="http://schemas.android.com/tools" >
    
        <uses-sdk tools:overrideLibrary="com.package,com.package.feature"/>
    
    </manifest>
    

    You will need to add all the package names where you wish to override their minSdkVersion. You will know which ones to add by looking at the error:

    Manifest merger failed ... AndroidManifest.xml as the library might be using APIs not available in 17 Suggestion: use a compatible library with a minSdk of at most 17, or increase this project's minSdk version to at least 21, or use tools:overrideLibrary="com.package.feature" to force usage (may lead to runtime failures)

    base and feature/build.gradle

    android {
        defaultConfig {
            minSdkVersion 21
        }
    }
    

    Test it by building the installed/instant APKs, then analyzing then for the minSdkVersion value. The installed should be at 17, and your base/feature APKs will still be on 21.

    0 讨论(0)
提交回复
热议问题