[英]split apk for densities: Galaxy S8+, Note 8, Galaxy S9+, Note 9 not supported
我正在使用屏幕密度为一个应用构建多个APK以减小APK大小,如下所示:
splits {
density {
enable true
reset()
include "mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
compatibleScreens 'small', 'normal', 'large', 'xlarge'
}
}
某些设备无法接收该版本的应用程序,并且在设备目录中查看时显示:
不支持所需的屏幕密度和尺寸-640,小-640,普通-640,大-640,XLARGE
有没有办法在拆分中定位这些设备? 我不能使用通用apk,因为它太大,并且扩展文件不是该项目的选项。
我在这篇文章中找到了解决方案https://medium.com/androiddevelopers/smallerapk-part-4-multi-apk-through-abi-and-density-splits-477083989006
不幸的是,目前暂时只有命名密度可用于include / exclude语句,因此您不能创建以280/360/420/480/560 dpi设备为目标的APK。
本文中发布的解决方案有效。 这是模块级别build.gradle的相关部分:
ext.densityCodes = ['mdpi': 1, 'hdpi': 2, 'xhdpi': 3, 'xxhdpi': 4, 'xxxhdpi': 5]
ext.additionalDensities = ['xhdpi': ['280'], 'xxhdpi': ['420', '400', '360'], 'xxxhdpi': ['560']]
import com.android.build.OutputFile
android.applicationVariants.all { variant ->
variant.outputs.each { output ->
if (output.getFilter(OutputFile.DENSITY) != null && project.ext.additionalDensities.containsKey(output.getFilter(OutputFile.DENSITY))) {
output.processManifest.doFirst {
def manifestFile = new File(project.buildDir, "intermediates" + File.separator + "manifests" + File.separator + "density" + File.separator + variant.buildType.name + File.separator + output.getFilter(OutputFile.DENSITY) + File.separator + "AndroidManifest.xml")
def manifestText = manifestFile.text
for (String density : project.ext.additionalDensities.get(output.getFilter(OutputFile.DENSITY))) {
manifestText = manifestText.replaceAll("</compatible-screens>", "<screen android:screenSize=\"small\" android:screenDensity=\"${density}\" />\n" +
"<screen android:screenSize=\"large\" android:screenDensity=\"${density}\" />\n" +
"<screen android:screenSize=\"xlarge\" android:screenDensity=\"${density}\" />\n" +
"<screen android:screenSize=\"normal\" android:screenDensity=\"${density}\" />\n </compatible-screens>")
}
manifestFile.text = manifestText
}
}
def baseAbiVersionCode =
project.ext.densityCodes.get(output.getFilter(OutputFile.DENSITY))
if (baseAbiVersionCode != null) {
output.versionCodeOverride =
baseAbiVersionCode * 1000 + variant.versionCode
}
}
}
我修改了这条线
def manifestFile = new File(project.buildDir, "intermediates" + File.separator + "manifests" + File.separator + "density" + File.separator + variant.buildType.name + File.separator + output.getFilter(OutputFile.DENSITY) + File.separator + "AndroidManifest.xml")
由于variant.buildType.name在文件系统中的位置不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.