使用配置 APK,同时仍以棒棒糖前设备为目标

Posted

技术标签:

【中文标题】使用配置 APK,同时仍以棒棒糖前设备为目标【英文标题】:Use of Configuration APKs while still targeting pre lollipop devices 【发布时间】:2018-04-09 01:43:08 【问题描述】:

在为 Instant Apps 开发时,使用配置 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

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

【问题讨论】:

【参考方案1】:

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

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

// :feature/base/build.gradle

flavorDimensions 'delivery'

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

这必须在其他依赖于 API 级别

【讨论】:

@kayboardsurfer 我现在已经有 3 种产品风格在使用……我想我应该可以使用 2 个 flavorDimensions 值来组合这些。【参考方案2】:

免安装应用仅支持 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'

基础等级

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

    

即时毕业

android 
    defaultConfig 
        minSdkVersion rootProject.minSdkInstant
    

【讨论】:

这将允许对即时应用程序模块使用不同的minSdk....我遇到的问题是基本模块之类的东西(在即时应用程序和已安装的应用程序之间共享)......和我想开始使用该拆分功能 @JohnO'Reilly 您的基本模块应该有 minSdkVersion 17,而您的即时应用程序模块应该有 minSdkVersion 21。我已经用一个详细的例子编辑了我的答案 问题在于我无法为基本模块设置配置拆分 (developer.android.com/topic/instant-apps/guides/…)【参考方案3】:

如果您使用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 的位置。通过查看错误您将知道要添加哪些:

清单合并失败... 作为库的 AndroidManifest.xml 可能正在使用不可用的 API in 17 建议:使用兼容库,minSdk 最多为 17, 或者将此项目的 minSdk 版本增加到至少 21, 或者使用 tools:overrideLibrary="com.package.feature" 强制使用(可能导致运行时失败)

基础和功能/build.gradle

android 
    defaultConfig 
        minSdkVersion 21
    

通过构建已安装/即时 APK 来测试它,然后分析 minSdkVersion 值。安装的应该是 17,而您的基本/功能 APK 仍然是 21。

【讨论】:

以上是关于使用配置 APK,同时仍以棒棒糖前设备为目标的主要内容,如果未能解决你的问题,请参考以下文章

在棒棒糖前设备的工具栏上添加高程/阴影

apk分析 1

底页不适用于 Kitkat(棒棒糖前设备)

用于 Pre-Lollipop 设备的具有弯曲背景的 Android Ripple 按钮

棒棒糖设备上的 EditText 没有以强调色着色

Google Play发布App中遇到"多个APK:版本1未提供给任何设备配置使用。"问题的解决方法