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

时间:2015-06-29 18:31:18

标签: android groovy gradle build android-gradle

我正在尝试为每个构建变体重命名我的APK文件,以包含应用程序名称,versionName,versionCode和内部版本号。到目前为止,除了应用程序名称之外,我还能正常工作。

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

@string/app_name

但我只想阅读此值并使用它来命名我的APK文件。

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

3 个答案:

答案 0 :(得分:5)

我没有在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,因为它不值得 - 更好地硬编码字符串。我认为这不会减慢建设过程,但这是不必要的。

答案 1 :(得分:2)

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

应用程序名称不会经常更改,因此我很乐意将其硬编码(特别是因为最终用户看不到apk文件名,因此即使出现错误,影响也会很小)。如果您正在处理白标应用程序并且必须支持动态应用程序名称,则将值提取到gradle.properties文件(或您正在使用的其他类型的配置文件)应该是更好的选择而不是使用应用程序&# 39; s资源。

答案 2 :(得分:-1)

我有使用@Yaroslav的答案(https://stackoverflow.com/a/37432654/6711554)创建方法。

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中的任何字符串。