使用配置 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。
在开发免安装应用程序时,使用配置 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。