我想使用Maven 资源过滤插件在外部为 Android 项目定义敏感配置数据。因此,我创建了一个包含敏感数据的 .properties 文件。它被排除在版本控制之外。
# /.app_config.properties
# Application configuration
#
# Do not add this file to source control.
# The values are read and inserted into source files by Maven.
google.maps.v2.api.key = abc123
api.base.url = https://example.com/api
在 Android 项目中,我在一个单独的 .xml 文件中管理所有敏感数据:
<!-- /res/values/app_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="config_google_maps_v2_api_key">ENTER_YOUR_GOOGLE_MAPS_V2_API_KEY_HERE</string>
<string name="config_base_url">ENTER_YOUR_SERVER_URL_HERE</string>
</resources>
对于 Maven,我创建了另一个 .xml 文件,它告诉在构建 .apk 时应该替换哪些字符串:
<!-- /filteres-res/app_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="config_google_maps_v2_api_key">${google.maps.v2.api.key}</string>
<string name="config_base_url">${api.base.url}</string>
</resources>
pom.xml
以下是Maven 过滤的相关部分:
<!-- /pom.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- Sure there is more configuration here -->
<build>
<finalName>${project.artifactId}</finalName>
<sourceDirectory>src</sourceDirectory>
<filters>
<filter>${project.basedir}/.app_config.properties</filter>
</filters>
<resources>
<resource>
<directory>${project.basedir}/filtered-res</directory>
<filtering>true</filtering>
<targetPath>${project.basedir}/res/values/</targetPath>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>${project.basedir}/filtered-res</directory>
<filtering>false</filtering>
<excludes>
<exclude>**/*.xml</exclude>
</excludes>
</resource>
</resources>
<pluginManagement>
<plugins>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<version>${android-maven-plugin.version}</version>
<extensions>true</extensions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<compilerArgument>-Xlint:deprecation</compilerArgument>
<!-- <resourceDirectory>${project.build.directory}/filtered-res</resourceDirectory> -->
</configuration>
</plugin>
</plugins>
</pluginManagement>
<plugins>
<plugin>
<groupId>com.jayway.maven.plugins.android.generation2</groupId>
<artifactId>android-maven-plugin</artifactId>
<configuration>
<sdk>
<platform>${sdk.platform}</platform>
</sdk>
<undeployBeforeDeploy>true</undeployBeforeDeploy>
</configuration>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>${maven-resources-plugin.version}</version>
<executions>
<execution>
<phase>initialize</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
<execution>
<id>default-resources</id>
<phase>DISABLED</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
问题是敏感数据实际上是写入/res/values/app_config.xml
而不是仅写入构建。这是构建后文件的样子:
<!-- /res/values/app_config.xml -->
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="config_google_maps_v2_api_key">abc123</string>
<string name="config_base_url">https://example.com/api</string>
</resources>