使用配置 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,同时仍以棒棒糖前设备为目标的主要内容,如果未能解决你的问题,请参考以下文章