gradle-small-plugin是一个gradle插件,用来打包安卓组件包。
- 在root工程的build.gradle中添加依赖:
buildscript {
repositories {
jcenter()
mavenLocal()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'net.wequick.tools.build:gradle-small:1.1.0-alpha2'
}
}
allprojects {
repositories {
jcenter()
mavenLocal()
}
}
- 应用工程配置插件
apply plugin: 'net.wequick.small'
gradle-small-plugin内部注册了5个插件:
名称 | ID | 类 |
---|---|---|
工程配置插件 | net.wequick.small | net.wequick.gradle.RootPlugin |
宿主配置插件 | net.wequick.small.host | net.wequick.gradle.HostPlugin |
App组件打包插件 | net.wequick.small.application | net.wequick.gradle.AppPlugin |
Library组件打包插件 | net.wequick.small.library | net.wequick.gradle.LibraryPlugin |
资源组件打包插件 | net.wequick.small.asset | net.wequick.gradle.AssetPlugin |
假设工程目录结构为:
Sample (Root)
|-- app (Host)
| `-- build.gradle
|-- app.home
| `-- build.gradle
|-- lib.utils
| `-- build.gradle
|-- web.about
| `-- build.gradle
`-- build.gradle
当在Root的build.gradle中配置aply plugin 'net.wequick.small
时,将会遍历其所有的子模块(subprojects):
- 对
app
模块应用 HostPlugin - 对
app.*
模块应用 AppPlugin - 对
lib.*
模块应用 LibraryPlugin - 对
[others].*
模块应用 AssetPlugin
用于配置宿主:
-
增加jni libs目录smallLibs
- 该目录用以存放其它组件包生成的*.so文件;
- 宿主运行时将自动复制其下*.so文件至应用程序缓存。
-
复制release签名配置到debug模式
- 各组件编译时使用宿主的release签名,以使得release版本的宿主可以通过比对签名来校验插件。为此在调试运行宿主的时候也使用release签名,避免调试时签名校验失败而中断。
-
增加buildLib task
- 宿主程序作为一个壳,通过该task预编译生成宿主的jar文件,供其它组件引用以便打包时分离。
用于App组件打包:
-
分离宿主、公共库的类与资源
- 移除宿主的主题资源(AppCompat),将插件中的Theme.AppCompat等资源id替换为宿主程序对应的id。(主题的递归应用在Native层的ResourcesType.cpp中实现,无法在Java层做动态替换,为此我们需要在编译阶段,提前做好主题的资源id映射)
- 移除其它公共资源
- 移除公共类
-
分配资源id
- 为保证整合在一起的程序资源id不冲突,对组件包分配 [0x03, 0x7e] 之间的package id。
用于公共库组件打包:
- 在编译App组件包时,使用
com.android.library
模式 - 在编译自己时,切换为
com.android.application
模式,并按App组件打包 - 增加buildLib task,生成jar包,供其它组件引用以便打包时分离
用于资源组件打包:
- 复制assets目录下文件
- 生成二进制AndroidManifest.xml
- 携带versionCode以供插件版本比对
- 使插件可以通过PackageManager的getPackageArchiveInfo方法获取签名信息
- 签名组件包
此类打包忽略所有java文件,直接将assets目录中的文件进行压缩打包。
aar-small内部内置了WebBundleLauncher(网页资源组件包加载器)用来加载web.*
的网页组件。
基于这个架构,您可以扩展自己的自定义组件,比如扩展支持Markdown组件:
- 新建
md.*
模块,该模块的src/main/assets
目录中添加index.md
文件 - 新建
MdBundleLauncher
类来加载md.*
模块