从另一个XML文件获取值

3

我正在尝试构建一个使用Google地图API的Android应用程序,并希望将该项目放在GIT上。因此,我有一个API密钥,这些信息位于AndroidManifest.xml中,如下所示(我已在此处使用*key*替换了我的实际API密钥)

<meta-data
android:name="com.google.android.geo.API_KEY"
android:value= *key* />

我不想将这个敏感信息推到git上,但我又不能将此文件gitignore。是否有可能创建另一个XML文件来保存秘钥,并让AndroidManifest.xml从那个文件中获取秘钥(以便我可以gitignore这个文件)?
AndroidManifest.xml中有如下代码:
<activity
android:name=".MapsActivity"
android:label="@string/title_activity_maps"
android:launchMode="singleTop" />

我注意到label属性的值来源于res/values/strings.xml中的另一个XML文件:

  1. AndroidManifest.xml如何知道在哪里找到label的值?
  2. @符号代表什么意思?
  3. 我可以把名为Config.xml的XML文件放在任何地方吗?或者必须放在res文件夹中?
2个回答

5
为避免上传你的密钥:
  1. Create the key in a properties file and add the file in .gitignore

     API_KEY=XXXXXXXXXXX
    

    inside .gitignore, add the path

     secretKeys.properties 
    
  2. Read the file in app/build.gradle and create a string resource variable using buildConfigField

     def apikeyPropertiesFile = rootProject.file("apikey.properties")
     def apikeyProperties = new Properties()
     apikeyProperties.load(new FileInputStream(apikeyPropertiesFile))
    
     android {
    
       defaultConfig {
    
         buildConfigField("String", "API_KEY", apikeyProperties['API_KEY'])
       }
     } 
    
  3. Use the created variable!

查看博客文章获取完整细节。

AndroidManifest.xml 如何知道在哪里找到 label 的值?

Android 编译会为所有 XML 常量生成一个 R.java 文件,并将 XML 内容出现的所有位置与 R.Java 文件中的值进行映射。

@ 符号是什么意思?

这是一个特殊符号,由解析器用于解析特定的字符串资源。例如,@+id/root 表示将其解析为一个 id 资源字符串,并从 R.java 中替换值。

我可以把名为 Config.xml 的 XML 文件放在任何地方吗?或者它必须在 res 文件夹中?

不行,它必须在 res 文件夹中。


4

你应该将秘密字符串放在单独的XML文件中,并将该文件添加到gitignore中。然后,你可以在AndroidManifest.xml中引用该字符串。

例子:

app/src/main/res/values/secrets.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="google_api_key">abcdefg-12345</string>    
</resources>

app/src/main/AndroidManifest.xml

<manifest ...>
    <application ...>
        ...
        <meta-data
            android:name="com.google.android.geo.API_KEY"
            android:value="@string/google_api_key" />
        ...
    </application>
</manifest>


回答您的问题: 任何 Android XML 文件(例如 AndroidManifest.xml、布局和其他文件)都将属性的值解释为原始字符串,除非它以 @ 开头。前缀 @ 告诉它查找资源。 @string 表示字符串资源,@layout 表示布局,@drawable 表示可绘制项,@id 表示 ID,等等。这些资源通常在自己的文件中定义,但不总是如此。无论如何,该文件始终位于 res 的子目录中。对于您的情况,字符串定义在 res/values/some_file.xml 中。您可以在 res/values 中创建任意数量的文件,所有这些文件的内容会在 AAPT 编译步骤期间合并在一起,因此您可以按其定义名称引用任何文件,而无需考虑文件名。
有关 <meta-data> 标记的更多信息,请参见 https://developer.android.com/guide/topics/manifest/meta-data-element,有关字符串资源的信息,请参见 https://developer.android.com/guide/topics/resources/string-resource

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接