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

Android Gradle Read App Name from 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 插件文档中没有看到任何用于访问资源的方法,因此您可以使用以下代码通过搜索资源找到您的应用名称:

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 的观点,因为它不值得——最好硬编码一个字符串。我不认为它会减慢构建过程,但这是不必要的。

我已经使用@Yaroslav 的回答创建了方法 ()。

def getApplicationName() {
  try {
     def stringsFile = file("./src/main/res/values/string.xml")
     return new XmlParser().parse(stringsFile).string.find { it.@name.equals 'your_app_name' }.text()
  }catch(e){
     println(e)
     return "Default App Name"
  }
}

您可以从任何资源文件中读取 gradle 中的任何字符串。