当前位置: 首页 > 知识库问答 >
问题:

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

曹华荣
2023-03-14

我试图重命名每个构建变量的APK文件,以包括应用程序名称、版本名、版本代码和构建编号(如果存在)。到目前为止,除了应用程序名之外,我的一切都正常工作。

我想使用与< code>AndroidManifest.xml文件用于android:label相同的值。这来自字符串资源< code>@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");
}

共有3个答案

芮意
2023-03-14

我必须使用@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中的任何字符串。

叶智
2023-03-14

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

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

苗承
2023-03-14

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

 类似资料:
  • 问题内容: 有什么办法可以从中读取文件? 我对库或类/代码文件仅在中定义的字符串不感兴趣 问题答案: 是的,您可以使用以下命令提取所有资源文件 脚步 - 要么

  • 我想知道一个应用程序的包名,我只知道那个应用程序的应用程序名。假设我想知道一个电子邮件应用程序的包名,只是它的名字,然后如何得到它 我只知道应用程序名。 这是代码,以获得所有的应用程序的包名称,但我需要知道特定的应用程序。

  • 我有一个Jenkins的工作,在那里我执行了一个Groovy脚本。从那个Groovy脚本中,我向另一个应用程序发出POST请求。我的Jenkins服务器和应用程序在不同的机器上。我需要从应用程序的代码中访问Jenkins环境变量。这可能吗? 我尝试使用System.getenv("ENVIRONMUT-VARIABLE-NAME")方法检索环境变量,但返回的结果为null。

  • 我一直在尝试开发一个android应用程序,可以从CIFS/SMB协议中提取信息。我尝试过JCIFS,但由于我的eclipse应用程序无法读取包(即使在我使用Javadoc读取包之后)而不断出现错误,我最后的办法就是寻求帮助。因此,有人能提供如何做到这一点的煽动/信息吗? 我试过这个:复制所有文件从服务器到Android设备 我试过这个:http://jcifs.samba.org/ 我试过这个:

  • 我正在构建一个模块,将数据保存到数据库中。完成模块后,我将把它做成一个JAR,这是常见的,任何人都会调用静态方法。有一个参数,它的名称是application name,我不想传递这个值,我想在向任何spring boot应用程序添加jar后动态获取这个值,然后任何人调用这个静态方法检索name application dynamic,所以spring boot包含应用程序属性have value

  • 这基本上意味着我没有读取该文件的权限。