Android Gradle从strings.xml中读取应用程序名称

我正在尝试为每个构建变体重命名我的APK文件,以包含应用程序名称,版本名称,版本代码以及存在时的内部版本号。 到目前为止,除了应用程序名称之外,我拥有一切工作。

我想使用AndroidManifest.xml文件用于android:label的相同值。 这来自一个字符串资源@string/app_name 。 我已经看到了使用以下方法替换资源值的能力:

resValue "string", "app_name", "Some new value"

但我只想读取这个值并使用它来命名我的APK文件。

android.applicationVariants.all { variant ->
    variant.outputs.each { output ->
        renameApk(variant, output)
    }
}

def renameApk(variant, output) {
    def apkPath = output.outputFile.parent
    def baseName = project.archivesBaseName

    baseName += "-${variant.buildType.name}"

    // add version name and version code
    baseName += "-v${variant.mergedFlavor.versionName}-${variant.mergedFlavor.versionCode}"

    // if built on jenkins ci, add jenkins build number:
    def buildNumber = System.getenv('BUILD_NUMBER')
    if (buildNumber && buildNumber.size() > 0) {
        baseName += "-b${buildNumber}"
    }

    // if the variant will not be zipAligned, specify that
    if (!output.zipAlign) {
        baseName += '-unaligned'
    }

    // set the output file
    output.outputFile = new File(apkPath, "${baseName}.apk");
}

我不认为这可以轻松完成。 资源分辨率是在移动设备上完成的,以适应诸如屏幕方向,本地化等等。 例如,Gradle构建系统无法知道使用哪种语言环境。 如果你坚持从资源中获取价值,你可以打开你想使用的特定的strings.xml文件,解析XML并自己获取价值。 在我看来,这是一个巨大的矫枉过正,而且会非常缓慢和丑陋。

应用程序名称并不经常更改,所以我会对其进行硬编码感到满意(尤其是因为apk文件名对最终用户不可见,所以即使发生错误,其影响也会很小)。 如果您正在使用白标签应用程序并且必须支持动态应用程序名称,那么将值提取到gradle.properties文件(或您正在使用的某种其他类型的配置文件)应该是更好的选择,而不是使用应用程序的资源。


我在Android Plugin文档中没有看到访问资源的任何方法,因此以下代码可用于通过搜索资源来查找您的应用的名称:

def getAppName() {
    def stringsFile = android.sourceSets.main.res.sourceFiles.find { it.name.equals 'strings.xml' }
    return new XmlParser().parse(stringsFile).string.find { it.@name.equals 'app_name' }.text()
}

但是我完全同意@Samuil Yanovski,因为它不值得 - 更好地对一个字符串进行硬编码。 我不认为这会减缓建设进程,但这是没有必要的。

链接地址: http://www.djcxy.com/p/86251.html

上一篇: Android Gradle Read App Name from strings.xml

下一篇: AppBar hides view when scrolling until collapsed