一个字符解决Gradle aar编译参数传递问题是怎样一种体验

简介: aar是Android Studio提供的一个依赖库系统,可以很方便的让主项目来使用库项目的代码、资源。

aar是Android Studio提供的一个依赖库系统,可以很方便的让主项目来使用库项目的代码、资源。

但如何来给一个aar库传递编译参数呢(传递代码配置是很方便的,通过接口即可,但编译参数是不行的)?这个场景还是非常常见的,例如下面的这样一个项目:

├── app
│   ├── build.gradle
│   ├── libs
│   └── src
├── build.gradle
├── gradle.properties
└── testlibrary
    ├── build.gradle
    ├── libs
    └── src

这个示例来自公司对推送SDK的封装,我们都知道,第三方的推送SDK需要配置很多AppKey,这些都是在编译时就需要指定的,鄙司对第三方的推送SDK又做了一层封装,抽出了一个aar库,因此,需要在编译时将AppKey传递给aar。

爆栈上实际上已经有这个提问了,但很遗憾没有人回答,http://stackoverflow.com/questions/32955764/how-to-keep-placeholders-in-an-aars-manifest/32955888

app是我们的主项目,依赖testlibrary这样一个aar库项目(上面的目录中是以源码依赖的,但实际上我们是以aar的方式依赖)。这时候主项目依赖testlibrary的时候,需要给testlibrary传一个key,那么考虑将key写在gradle.properties中,通过manifestPlaceholders来进行引用,也就是这样:

testlibrary AndroidMainifest.xml:

<meta-data
    android:name="APP_KEY"
    android:value="${APP_KEY}"/>

testlibrary build.gradle:

manifestPlaceholders = [
        "APP_KEY" : app_key
]

其中app_key就是写在gradle.properties中的参数。

貌似这种方式就可以解决这种问题,但实际上,编译成aar后,你就会发现,在编译aar的时候,你在AndroidMainifest.xml中申明的manifestPlaceholders就已经被替换调了!而且,不管你怎么做,不替换调manifestPlaceholders的值,是肯定编译不过的。那么是不是意味着manifestPlaceholders这条路是行不通的呢?

我们先来仔细分析下问题的原因,我们在编写aar代码的时候,希望aar能够接收外界传来的编译参数,但是,在编译aar的时候,需要提供具体的值来替换这些manifestPlaceholders,否则,则编译不过,貌似整个过程就陷入了一个死循环。。。

解决办法自然是有的,比如,使用一个特殊的标志符,例如xxxxx_abc这样的标志,在主项目中,通过Task来进行Mainifest的替换,但是,这肯定不是我们想要的,因为,Gradle没有这么Low啊!!!解决的方法就是对Gradle文档进行阅读理解!!!地址如下:

http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger#TOC-Placeholder-support

我们定位到Android Manifest file merging,好好理解其中的每一句话,只到我们读到这句话:

The syntax for placeholder values is ${name} since @ is reserved for links. After the last file merging occurred, and before the resulting merged android manifest file is written out, all values with a placeholder will be swapped with injected values. A build breakage will be generated if a variable name is unknown.

有点意思吧,除了我们常用的${}的manifestPlaceholders写法,实际上,还有一种以@开头的写法!!!

OK,这种写法的含义就是,通过@开头来指定manifestPlaceholders的Key的时候,表示当前编译不执行manifestPlaceholders的替换!!!那么通过这种方式,我们就可以生成带manifestPlaceholders的aar库,从而解决我们前面提到的这个问题。

具体的解决方式如下:

testlibrary AndroidMainifest.xml:

<meta-data
    android:name="APP_KEY"
    android:value="${APP_KEY}"/>

testlibrary build.gradle:

manifestPlaceholders = [
        "@APP_KEY" : ""
]

是的,你没有看错,前面加一个@就可以了,这样你在编译aar的时候,就会保留本库中的manifestPlaceholders而不做任何替换!!!通过这样的设置,你就可以在主项目引用的时候再进行manifestPlaceholders的替换,从而实现编译参数传递。

在主项目中,配置manifestPlaceholders即可。

app build.gradle:

manifestPlaceholders = [
        "APP_KEY" : app_key
]

这里的app_key就是写在gradle.properties中的参数。

So easy,一个字符解决了所有问题。

目录
相关文章
|
Android开发
IDEA编译gradle提示This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 2020.3.1 or newer.
IDEA编译gradle提示This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 2020.3.1 or newer.
668 1
|
1天前
|
Java Apache Maven
在STS里使用Gradle编译Apache POI5.0.0
在STS里使用Gradle编译Apache POI5.0.0
|
3月前
|
Java Linux 开发工具
Azkaban【部署 01】Linux环境 CentOS Linux release 7.5.1804安装配置azkaban-3.70.0编译阶段(附安装包及gradle-4.6资源)
【2月更文挑战第4天】Linux环境 CentOS Linux release 7.5.1804安装配置azkaban-3.70.0编译阶段(附安装包及gradle-4.6资源)
36 1
|
Java 开发工具 Android开发
【错误记录】Android Studio 编译报错 ( Invalid Gradle JDK configuration found )
【错误记录】Android Studio 编译报错 ( Invalid Gradle JDK configuration found )
658 0
【错误记录】Android Studio 编译报错 ( Invalid Gradle JDK configuration found )
|
5月前
|
开发工具 Android开发 开发者
Android 项目编译 Gradle 配置说明
Android 项目编译 Gradle 配置说明
158 0
|
7月前
|
Java 数据库连接 API
Gradle依赖管理:编译时和运行时依赖的区别
Gradle依赖管理:编译时和运行时依赖的区别
50 0
|
8月前
|
Java 开发工具 Maven
Android 编译 gradle 内存 OOM 解决之路(二)
Android 编译 gradle 内存 OOM 解决之路
|
8月前
|
Java Android开发
Android 编译 gradle 内存 OOM 解决之路(一)
Android 编译 gradle 内存 OOM 解决之路
|
Java API Android开发
通过自定义Gradle插件修改编译后的class文件
通过自定义Gradle插件修改编译后的class文件
通过自定义Gradle插件修改编译后的class文件
|
Java Maven Android开发
使用idea和gradle编译spring5源码的方法步骤
使用idea和gradle编译spring5源码的方法步骤
使用idea和gradle编译spring5源码的方法步骤