使用配置 APK,同时仍针对棒棒糖之前的设备

Use of Configuration APKs while still targeting pre lollipop devices

在开发免安装应用程序时,使用配置 APK (https://developer.android.com/topic/instant-apps/guides/config-splits.html) 提供了减少 APK 大小的有用选项。然而,看起来它们仅在使用 21 或更高版本的 mindSdk 时才受支持。例如,如果您尝试将此功能用于较低的 sdk 版本,则会出现以下错误。

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

有没有办法让基本模块例如使用纯拆分功能,同时仍然安装了应用程序目标棒棒糖之前的设备?

免安装应用仅在 API 21+ 设备 (link) 中受支持,较旧的设备将仅支持完整的 apk。

更好的方法是根据您的模块定义不同的 minSdk,例如:

您可以在 GitHub

上查看 Google 的分析示例

项目的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'
}

基地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 {}
    }
}

已安装gradle

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

    }

即时gradle

android {
    defaultConfig {
        minSdkVersion rootProject.minSdkInstant
    }
}

由于 minSdkVersion 标志会切换很多检查,因此不会自动为您完成此更改。

我建议为具有不同 minSdkVersions 的安装模块和即时模块引入产品风格,如下所示:

// :feature/base/build.gradle

flavorDimensions 'delivery'

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

这必须在依赖于 API 级别 < 21 的功能模块的其他模块中以类似方式完成。

如果您使用 tools:overrideLibrary,您可以为您的应用程序模块指定一个不同的较低 minSdkVersion 请参阅 How do I use tools:overrideLibrary in a build.gradle file?

我是这样做的:

app/build.gradle

android {
    defaultConfig {
        minSdkVersion 17
    }
}

应用的清单

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

您需要在希望覆盖的地方添加所有包名称 minSdkVersion。看错误就知道要加哪些了:

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)

基础和feature/build.gradle

android {
    defaultConfig {
        minSdkVersion 21
    }
}

通过构建 installed/instant APK 进行测试,然后分析 minSdkVersion 值。安装应该在 17,你的 base/feature APKs 仍然在 21。