有人能帮助我了解在使用google-play-services.aar时资源合并是如何工作的吗?
实现谷歌播放服务的AndroidManifest.xml可能有以下内容:
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
如果使用google-play-services_lib,则在res/values/version.xml
中找到google_play_services_version
整数,并且通过将google-play-services/res
文件夹传递给带有-S
标志的aapt工具来满足清单要求。
但是,当解压缩google-play-services.aar时,我看不到那个xml文件,只是简单地将解压缩后的.aar的res文件夹传递给aapt,就会引发关于No resource found
的相关投诉。
依赖.aar的应用程序如何将google_play_services_version整数获取到其R.java中?
在探究了这一点之后,我找到了一个足够接近我的目的的答案。
自Play Services 6.5以来,您现在可以选择性地添加某些Google Play Services模块,而不是以前的单片库。Google Play Services版本资源在Play Services子模块中定义。
当你在渐变构建中添加依赖项时,它可能看起来像这样:
dependencies {
compile 'com.google.android.gms:play-services:+'
}
使用此功能,gradle从安装在SDK中的m2 repo中为所有提取.aar。
当我手动打开它时,我在基本播放服务包中找不到版本号,这就是引发这个问题的原因。但后来我发现,播放服务的依赖性实际上正在引入其他几个播放服务模块。
这是由SDK m2 repo中的.pom明确表示的。./extras/google/m2repository/com/google/android/gms/play-services/7.0.0/play-services-7.0.0.pom
的pom将其他播放服务模块显示为deps:
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.google.android.gms</groupId>
<artifactId>play-services</artifactId>
<version>7.0.0</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>com.google.android.gms</groupId>
<artifactId>play-services-ads</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
<type>aar</type>
</dependency>
...
<dependency>
<groupId>com.google.android.gms</groupId>
<artifactId>play-services-wearable</artifactId>
<version>7.0.0</version>
<scope>compile</scope>
<type>aar</type>
</dependency>
</dependencies>
</project>
各个子模块的R.txt文件中都有google_play_services_version。
int integer google_play_services_version 0x7f050000
它被用作类路径资源,并进入每个gms模块的各种R.java文件。然后,在manifestMerging步骤中,它被添加到整个包的最终AndroidManifest.xml中。