我正在为一个应用构建多个APK,以使用屏幕密度来减小APK大小,如下所示:
splits {
density {
enable true
reset()
include "mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"
compatibleScreens 'small', 'normal', 'large', 'xlarge'
}
}
某些设备无法接收该版本的应用程序,并在设备目录中显示:
不支持所需的屏幕密度和尺寸 -640,小 -640,正常 -640,大 -640,XLARGE
有没有一种方法可以在拆分中定位这些设备?我不能使用通用apk,因为它太大,并且扩展文件不是该项目的选项。
答案 0 :(得分:0)
我在这篇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在文件系统中的位置不同。