Android端生成META-INF信息文件的Gradle插件 RapidMetaInfPlugin
来源博客:Wang Jie's Blog
本文链接:http://blog.wangjiegulu.com/2018/02/05/Android端生成META-INF信息文件的Gradle插件 RapidMetaInfPlugin/
版权声明:本博客所有文章除特别声明外,均采用 CC BY 4.0 CN协议 许可协议。转载请注明出处。
Android端生成META-INF信息文件的Gradle插件 RapidMetaInfPlugin
1. 需求背景
最近新遇到了一个需求,想在自己的一些库中写入版本信息,在别人使用了我的库后,我可以通过apk文件检测出依赖了我的哪个版本的库。感觉这个需求有点多余?那就举个例子吧。
比如,我编写了一个开源库:RapidORM,并上传到了Maven中心库 ,假设一个我不认识的开发者(暂且称它为X
)在编写app,这个app中的代码对我来说是完全未知的,但是他通过在build.gradle
中添加了如下依赖:
compile "com.github.wangjiegulu:rapidorm:1.0.0"
compile "com.github.wangjiegulu:rapidorm-api:1.0.0"
apt "com.github.wangjiegulu:rapidorm-compiler:1.0.0"
很明显,X
依赖了我写的RapidORM
库。并且打包成了Apk文件然后发布。这时我下载了这个apk,并且希望得到这个apk中依赖的RapidORM
版本是多少?这个RapidORM
在构建这个aar时的开发环境是怎么样的?反编译可能有希望能拿到RapidORM
具体的版本号,但是aar当时的构建环境就无法得知了。
这时,我就希望在我发布RapidORM
的Release版本的时候能够在aar中携带好一些自定义的参数,并且这些信息会在依赖了这个库的开发者X
构建apk的时候跟随保存到apk文件中。
比较典型的一个例子当你依赖了RxJava
这个库,我们构建apk完成之后,会发现在我们的apk文件中的META-INF
文件夹下面会有一个rxjava.properties
文件,打开这个文件就会发现如下内容:
Manifest-Version=1.0
Implementation-Title=io.reactivex.rxjava2#rxjava;2.1.2
Implementation-Version=2.1.2
Built-Status=integration
Built-By=travis
Built-OS=Linux
Build-Date=2017-07-23_08:21:58
Gradle-Version=2.14
Module-Owner=benjchristensen@netflix.com
Module-Email=benjchristensen@netflix.com
Module-Source=
Module-Origin=https://github.com/ReactiveX/RxJava.git
Change=e4fbe4c
Branch=e4fbe4cfcb3c240d14a42a586eecbbd74cb379d2
Build-Host=testing-gce-361876de-b66f-4569-b841-e037b0fee9af
Build-Job=LOCAL
Build-Number=LOCAL
Build-Id=LOCAL
Created-By=1.7.0_80-b15 (Oracle Corporation)
Build-Java-Version=1.7.0_80
X-Compile-Target-JDK=1.6
X-Compile-Source-JDK=1.6
很显然,这个文件中包含了:RxJava版本号
, 构建的CI信息
,构建时间
, Gradle版本
, 模块负责人信息
, git分支
, JDK版本
等等。
通过这个方式,我可以在任意的apk中拿到它依赖的RxJava
的信息。
当然,你可以通过在build.gradle
进行如下配置来过排除这个rxjava.properties
文件(但是不建议这么做,这个文件也许能在你遇到问题时给你帮助):
android {
...
packagingOptions {
exclude 'META-INF/rxjava.properties'
}
}
2. RapidMetaInfPlugin Gradle 插件
RapidMetaInfPlugin: https://github.com/wangjiegulu/RapidMetaInfPlugin
因此,写了 RapidMetaInfPlugin 这个 Gradle 插件。
这次先说说怎么使用这个插件,以后抽时间再写一篇 Gradle 插件编写教程。之前也写过一个Gradle插件(详情见Android Gradle 插件 DiscardFilePlugin(清空类和方法))也挺实用的。
2.1 最终效果
通过这个插件,我们可以在apk
或者aar
(app
依赖后合并到apk
)中写入任意信息。
以上在这个apk
的META-INF
中生成了一个名为DAL_REQUEST.properties
的文件,内容中包含了dal_request
这个库的名字、版本号和url。
2.2 如何使用
在你的buildscript
的dependencies
中添加classpath
依赖(点击这里获取最新版本):
buildscript {
repositories {
jcenter()
google()
}
dependencies {
// ...
classpath ('com.github.wangjiegulu:rapidmetainf:x.x.x'){
exclude group: 'com.android.tools.build', module: 'gradle'
}
}
}
然后在你的apk或者aar的build.gradle
文件的顶部写入以下代码来使用插件:
apply plugin: 'com.github.wangjiegulu.plg.rapidmetainf'
然后通过如下方式填写你需要写进META-INF
目录中的文件信息:
rapidmetainf {
metaInfName 'DAL_REQUEST.properties'
metaInfProperties "archiveName=$dbarchiveName",
"archiveVersion=$dbarchiveVersion",
"archiveUrl=$dbarchiveUrl"
}
如上,metaInfName
表示在META-INF
目录中生成的文件名称(文件名任意取,但是不能以"."开头),metaInfProperties
表示要写入文件的数据,这个变量为数组类型,可通过Groovy语法来编写,比如通过$符号来引用ext
,通过如下命令参数的方式等等:
rapidmetainf {
metaInfName 'DAL_REQUEST_DEMO.properties'
String[] infArray = new String[10]
// ./gradlew clean build -PcommandKey=commandValue
infArray[0] = "propertyFromCommand=${getParameter('commandKey')}"
for(int i = 1; i < infArray.length; i++){
infArray[i] = "array_item_key_$i=array_item_value_$i"
}
metaInfProperties infArray
}
def getParameter(String key) {
// -D
String value = System.getProperty(key)
if (null != value && value.length() > 0) {
return value
}
// -P
if (hasProperty(key)) {
return getProperty(key)
}
return null
}
以上,CI构建时就可使用命令./gradlew clean build -PcommandKey=commandValue
来把commandValue
写入到文件中。
Android端生成META-INF信息文件的Gradle插件 RapidMetaInfPlugin的更多相关文章
- Android端通过HttpURLConnection上传文件到服务器
Android端通过HttpURLConnection上传文件到服务器 一:实现原理 最近在做Android客户端的应用开发,涉及到要把图片上传到后台服务器中,自己选择了做Spring3 MVC HT ...
- Android端通过HttpURLConnection上传文件到server
Android端通过HttpURLConnection上传文件到server 一:实现原理 近期在做Androidclient的应用开发,涉及到要把图片上传到后台server中.自己选择了做Sprin ...
- Android SDK生成时,自定义文件名称,而非系统第一分配的app-release.apk
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.tx ...
- 关于Android Studio升级到2.0后和Gradle插件不兼容的问题
今天升级AS到2.0后,用AS在真机上调试,发现报了如下错误: This version of Android Studio is incompatible with the Gradle Plugi ...
- 微信app支付(android端+java后台)
本文讲解使用微信支付接口完成在android开发的原生态app中完成微信支付功能, 文章具体讲解了前端android如何集成微信支付功能以及后台如何组装前端需要支付信息, 话不多话, 具体看文章内容吧 ...
- Android Gradle插件
目录 什么是Gradle 编写方法 buildSrc 基础概念 Extension 自定义Task Plugin Transformer Gradle用处 好文章 常见问题 Gradle插件练习地址: ...
- 怎样使用Android Studio开发Gradle插件
缘由 首先说明一下为什么会有这篇文章.前段时间,插件化以及热修复的技术非常热,Nuwa热修复的工具NuwaGradle,携程动态载入技术DynamicAPK,还有希望做最轻巧的插件化框架的Small. ...
- Android Studio 更新gradle插件
今天更新了CentOS, 更新了java版本. 然后gradle跪了..... 不吐槽java版本的兼容性问题了.... 反正有他自己的理由.... 那么就更新gradle咯.... 下面是方法... ...
- QLGame 2d Engine Android端环境搭建(通过jni读取assets目录的文件)
QLGame 2d Engine win端已经实现了一个动物的动画了,初步的东西已经完成,考虑在Android端也实现这些基本的东西,这样跨平台的引擎也就实现了! 要在Android下编程,首先要实现 ...
随机推荐
- [51nod1610]路径计数
路径上所有边权的最大公约数定义为一条路径的值. 给定一个有向无环图. T次修改操作,每次修改一条边的边权,每次修改后输出有向无环图上路径的值为1的路径数量(对1,000,000,007取模). Inp ...
- c语言_FILE结构体解释及相关操作
1. 文件和流的关系 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件 ...
- 爬 NationalData ,虽然可以直接下,但还是爬一下吧
爬取的是分省月度数据,2017年的,包括:居民消费价格指数,食品烟酒类居民消费价格指数,衣着类居民消费价格指数,居住类居民消费价格指数,生活用品及服务类居民消费价格指数,交通和通信类居民消费价格指数, ...
- 解决sql和beans中名字不一致问题
第二图使用别名 tid为sql中的名字,id为beans中的名字,推荐此方式
- Android studio启动后卡在refreshing gradle project(包解决)
这个问题几乎每个刚使用Android studio的同学都会碰到过,网上有各式各样的方法,有的说使用本地gradle,我试过多次,每次启动android studio时还是会检查更新,所以根本上解决的 ...
- 试用最强Spark IDE--IDEA
1.安装IntelliJ IDEA IDEA 全称 IntelliJ IDEA,是java语言开发的集成环境,IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手.代码自动提示 ...
- Git 忽略提交 .gitignore
在使用Git的过程中,我们喜欢有的文件比如日志,临时文件,编译的中间文件等不要提交到代码仓库,这时就要设置相应的忽略规则,来忽略这些文件的提交. Git 忽略文件提交的方法 有三种方法可以实现忽略Gi ...
- Java排序算法分析与实现:快排、冒泡排序、选择排序、插入排序、归并排序(二)
一.概述: 上篇博客介绍了常见简单算法:冒泡排序.选择排序和插入排序.本文介绍高级排序算法:快速排序和归并排序.在开始介绍算法之前,首先介绍高级算法所需要的基础知识:划分.递归,并顺带介绍二分查找算法 ...
- 手把手教你撸一个 Webpack Loader
文:小 boy(沪江网校Web前端工程师) 本文原创,转载请注明作者及出处 经常逛 webpack 官网的同学应该会很眼熟上面的图.正如它宣传的一样,webpack 能把左侧各种类型的文件(webpa ...
- Docker问题: Layer already being pulled by another client. Waiting.什么原因
问题描述:Layer already being pulled by another client. Waiting. 问题分析:这是 1.8版本的一个bug,会在1.9版本中修复.http://st ...