密度拆分apk:Galaxy S8 +,Note 8,Galaxy S9 +,Note 9不支持

时间:2018-09-05 10:06:29

标签: android android-manifest

我正在为一个应用构建多个APK,以使用屏幕密度来减小APK大小,如下所示:

splits {


    density {


        enable true
        reset()

        include "mdpi", "hdpi", "xhdpi", "xxhdpi", "xxxhdpi"

        compatibleScreens 'small', 'normal', 'large', 'xlarge'

    }
}

某些设备无法接收该版本的应用程序,并在设备目录中显示:

  

不支持所需的屏幕密度和尺寸   -640,小   -640,正常   -640,大   -640,XLARGE

有没有一种方法可以在拆分中定位这些设备?我不能使用通用apk,因为它太大,并且扩展文件不是该项目的选项。

1 个答案:

答案 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在文件系统中的位置不同。