Android SDK开发之 aar 打包详细步骤
一、Android中aar上传到本地Maven或者Nexus
project级别下创建一个 upload_local.gradle文件,名字随便起
//引入maven 插件
apply plugin: 'maven'
//打包main目录下代码和资源的 task
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.srcDirs
}
//配置需要上传到maven仓库的文件
artifacts {
archives androidSourcesJar
}
//这几个定义也可以放在 各自module下的 gradle.properties文件中
def GROUP_ID = "com.jzw"
def ARTIFACT_ID = "components"
def VERSION = "1.0.0"
//上传到Maven仓库的task
uploadArchives {
repositories {
mavenDeployer {
//指定maven仓库url
repository(url: "http://localhost:8081/nexus/content/repositories/releases/") {
//nexus登录默认用户名和密码
authentication(userName: "admin", password: "admin123")
pom.groupId = GROUP_ID// 唯一标识(通常为模块包名,也可以任意)
pom.artifactId = ARTIFACT_ID // 项目名称(通常为类库模块名称,也可以任意)
pom.version = VERSION // 版本号
}
//解决生成的pom 没有groupid 和版本号的问题
pom.whenConfigured { pom ->
pom.dependencies.forEach { dep ->
if (dep.getVersion() == "unspecified") {
println("--modify the dependenies module in pom.xml--->>" + dep.getArtifactId())
dep.setGroupId(GROUP_ID)
dep.setVersion(VERSION)
}
}
}
}
}
}
在需要打包aar的module 中引入gradle
一般在build.gradle的底部引入apply from: "upload_local.gradle"
执行打包上传的任务
在studio的Gradle中对应的module下找到 upload–> uploadArchives 任务执行即可
使用打包好的aar
project 下的build.gradle中配置本地maven的仓库的地址, 之后使用implamentation 引入
二、使用novoda 插件上传到bintray
使用 com.novoda:bintray-release 这个插件可以比较简单的把aar(包含依赖的三方aar) 上传到bintray,这种上传在pom中有依赖的三方aar的配置,使用时不用额外引入三方aar
project 级别的build.gradle中的dependencies 下添加依赖
classpath 'com.novoda:bintray-release:0.9.2'
完整配置
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.6.2'
classpath 'com.novoda:bintray-release:0.9.2'
}
}
allprojects {
repositories {
google()
jcenter()
maven { url 'https://jitpack.io' }
}
//编码 ,javadoc 检查忽略
tasks.withType(Javadoc) {
options.addStringOption('Xdoclint:none', '-quiet')
options {
encoding 'UTF-8'
charSet 'UTF-8'
}
}
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
需要上传的module下新建upload.gradle文件,名字随意起,内容如下
//引入novoda 插件,这行也可以放在对应module 的build.gradle文件的顶部引入
//这里方便复用,放在了upload.gradle中
apply plugin: 'com.novoda.bintray-release'
//这几个定义也可以放在 各自module下的 gradle.properties文件中
def GROUP_ID = "com.components"
def ARTIFACT_ID = "common"
def VERSION = "1.0.0"
//添加
publish {
userOrg = 'jingzhanwu'// bintray.com用户名
groupId = GROUP_ID //jcenter上的路径
artifactId = ARTIFACT_ID //项目名称
publishVersion = VERSION //版本号
desc = 'Oh hi, this is a components library for a android.' //描述,不重要
website = 'https://github.com/xxx/xxx' //网站,不重要;尽量模拟github上的地址,例如我这样的;当然你有地址最好了
}
在对应module的build.gradle底部引入 upload.gradle文件
一般是在文件底部引入
apply from: "upload.gradle"
开始打包上传
在studio 的命令行窗口 Terminal 中执行上传命令
gradlew clean build bintrayUpload -PbintrayUser=zhangsan -PbintrayKey=zhangsanKey -PdryRun=false
说明:
gradlew clean build bintrayUpload:执行一个gradlew任务,先clean,再build,最后执行bintrayUpload
-PbintrayUser:指定 你bintray的用户名
-PbintrayKey: 指定 你bintray的ApiKey 值,这个值可以在自己bintray中查看
-PdryRun:一般指定为false
三、本地指定目录打包生成aar
对应module 下新建upload_local.gradle文件,名字随意起,内容如下
//引入maven插件
apply plugin: 'maven'
//这几个定义也可以放在 各自module下的 gradle.properties文件中
def GROUP_ID = "com.jzw"
def ARTIFACT_ID = "components"
def VERSION = "1.0.0"
uploadArchives {
repositories.mavenDeployer {
// 配置本地仓库路径,项目根目录下的repository目录中
repository(url: uri('../repository')) {
pom.groupId = GROUP_ID //唯一标识(通常为模块包名,也可以任意)
pom.artifactId = ARTIFACT_ID //项目名称(通常为类库模块名称,也可以任意)
pom.version = VERSION // 版本号
}
//解决生成的pom 没有groupId 和版本号的问题
pom.whenConfigured { pom ->
pom.dependencies.forEach { dep ->
if (dep.getVersion() == "unspecified") {
println("--modify the dependenies module in pom.xml--->>" + dep.getArtifactId())
dep.setGroupId(GROUP_ID)
dep.setVersion(VERSION)
}
}
}
}
}
说明:
repository(url: uri(’…/repository’)) :
这里指定aar生成的路劲为当前module上一级的repository,也就是工程的根目录下的repository目录,你也可以指定到其他任意的目录
对应module下的build.gradle文件中引入upload_local.gradle
一般在文件尾部引入
apply from: "upload_local.gradle"
在studio右侧的Gradle栏中找到对应module下 upload 下的uploadArchives任务,并双击执行它
等待执行完毕,没有出错的情况下会在指定的本地目录下生成对应版本的 aar以及pom文件
使用本地aar
工程的gradle文件中添加本地maven的url,即上面repository 指向的本地目录,之后使用implamentation引入即可
project 级别的gradle下指定aar目录
maven { url 'F:\\AndroidLibrary\\repo' }
module中引入
implementation('com.jzw:components:1.0.0') { transitive = true }
四、Android aar 拷贝到sdk一起打包成新的aar
1、需要将一个aar包与项目产生的aar包合并成一个,其中项目是源码
2、项目是源码
解压依赖aar
解压aar,利用build,gradle
//很重要,因为解压后如果copy资源文件到raw里,这时R文件已经编译了,所以要在R文件编译之前执行此操作
tssks.withType(com.android.build.gradle.tasks.NdkCompile) {
compileTask -> compileTask.dependsOn(unzipAAR)
}
task unzipAAR(type: Exec) {
commandLine 'unzip', '-o', file("libs/xxxx.aar").getAbsolutePath(), '-d', file('MyAAR')
}
unzipAAR.doLast {
copy {
from 'MyAAR/res/raw'
into 'src/main/res/raw'
}
copy {
from 'MyAAR/classes.jar'
into 'libs/jars/'
rename { String fileName -> "xxxx.jar"}
}
//这里libs文件夹下只有一个jar
copy {
from 'MyAAR/libs/'
into 'libs/jars/'
rename { String fileName -> "xxxx.jar"}
}
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn unzipAAR
}
如果有ndk编译,so的copy动作要放在ndk之后
task copyJNIso (type: Copy) {
from 'MyAAR/jni'
into 'src/main/libs'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn copyJNIso
}
copyJNIso .mustRunAfter 'ndkBuild'
清除操作
创建一个makeclean.sh文件,可以是libs/makeclean.sh
build.gradle文件还要添加
task makeClean(type: Exec) {
executable 'sh'
args "libs/makeclean.sh"
}
clean.dependsOn 'makeClean'
makeclean.sh
···
!/bin/sh
rm -rf MyAAR
rm -rf libs/jars/xxxx.jar
rm-rf libs/jars/xxxxx.jar
rm -rf src/main/res/raw
···
本文地址:https://blog.csdn.net/qq_19979101/article/details/107792558