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 中的任何字符串。
我正在尝试为每个构建变体重命名我的 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 中的任何字符串。