爱一个人,希望她过更好,打从心里暖暖的,你比自己更重要 ,张小月啊,张小月。
前言:
因为一些事,已经接近三个月没有更新过技术分享总结了。
去年大概六七月份到今天的时候做了两个开源的项目,an-aw-base和an-aw-zxing,前面一个是基于自己的an-maven-base优化而来,主要是帮助开发者快速开发android应用程序,后面一个是基于an-maven-zxing优化而来,主要是集成了google的开源项目zxing二维码的扫描功能。更多信息请参考我的github地址:qydq (晴雨荡气(莳萝花 ))。说这么多也是想给自己宣传一下,这两个框架都支持jetpack和jcenter直接一行代码利用Gradle去依赖 。
ok,it's beginning ,
上面的两个开源项目,一开始发布的方法使用了很笨的方法,也就是我专栏《Android开发》介绍的如何打包aar到 ,用到的命令是 :gradlew clean build -generateRelease ,这句命令会在你的库文件的/build下面生成app-realease1.x.x.zip文件,然后我再利用生成的这个文件直接在bintray上面把项目上传上去。这样做很是费劲 ,当初也知道严振杰写了“AndroidStuio快速发布开源项目到Jcenter/Bintray”,当时想着以后再说,没想到差不多过了七八个月的时间,
利用笨的方法,gradlew clean build -generateRelease 编译的时间差不多都要10多分钟,那种方法也可以支持gradle依赖,但是今天决定摒弃这种笨(耗时)的方法,直接在android-studio中集成 。
这里我的示例项目是an-aw-base ,就当作更新另外一个版本,而且an-aw-base这次也做了升级,对android7.0以上系统当初没有考虑到兼容性会出现SecurityException或者FileUriExposedException。所以需要升级高的版本。
这里还是参考严正杰前辈的分享,非常止血,个人做了部分修改,原文地址:AndroidStuio快速发布开源项目到Jcenter/Bintray - 严振杰 - 博客频道 - CSDN.NET
必要的准备工作
如何申请Bintray帐号
如果申请bintray账号很简单,这里就不细说了。申请好账号后,我们要拿到apikey,怎么拿到apikey,看下面操作,
第一步:登陆后点击你的头像,再点击Edit Profile 出现下面的界面(晴雨荡气为我的ID),
第二步:在输入框中输入你的密码Confirm Password。(我的密码张小月都懂)这里显示*******************就是我的api key ,我们先保存起来,到时候会用到。
配置项目gradle和local.properties
我们上传项目到Jcenter时使用Gradle的task自动完成,所以只需要配置好gradle一句话就可以完成上传了,下面是项目中的配置。
正式开始之前我们上一张图,这里以an-aw-base2.0.2为例:
(一)配置项目的gradle文件
我们项目一般会有多个gradle配置文件,第一步要配置的是项目的gradle,而不是module/library的gradle,也就是上图[项目的gradle]标注的文件,把项目的内容改为如下内容即可。如果细心的同学会发现正杰前辈的dendent采用的android-maven-gradlepplugin的补丁的版本是1.3,而我这里修改成为了1.5我为什么知道是1.5了呢,具体可以参考这个网站,如果对方做了改变你们也要懂得去改变补丁的版本,另一个不用说你也知道了。
dcendents:dcendents/android-maven-gradle-plugin
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'
// jitpack发布github
classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
// 添加下面两行(y)代码即可。
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.4'
}
}
allprojects {
repositories {
jcenter()
}
tasks.withType(JavaCompile) {
configure(options) {
incremental = true
}
// options.compilerArgs << "-Xlint:unchecked" << "-Xlint:deprecation"
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
No service of type Factory available in ProjectScopeServices.错误解决:
https://code.google.com/p/android/issues/detail?id=219692
特别注意,如果你的AndroidStuio更新到了2.1.3,也就是你引用的Gradle插件是2.1.3:
classpath 'com.android.tools.build:gradle:2.1.3'
(二)配置要上传的library/module的gradle文件
第二步要配置的是要上传的module的gradle,而不是整个项目的gradle,也就是上图[library的gradle]标注的文件: 这个文件代码有点多,
apply plugin: 'com.android.library'
//配置jitpack
/*apply plugin: 'com.github.dcendents.android-maven'
group = 'com.github.qydq'*/
//配置bintray(笨的方法)
//ext {
// PUBLISH_GROUP_ID = 'cn.android.sunst'
// PUBLISH_ARTIFACT_ID = 'an-base'
// PUBLISH_VERSION = '2.0.1'
//}
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
android {
compileSdkVersion 25
buildToolsVersion "24.0.3"
defaultConfig {
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
useLibrary 'org.apache.http.legacy'
dataBinding {
enabled = true
}
sourceSets { main { res.srcDirs = ['src/main/res', 'src/main/res/color'] } }
lintOptions {
abortOnError false
// disable 'TypographyFractions', 'TypographyQuotes'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.1.1'
testCompile 'junit:junit:4.12'
compile 'org.xutils:xutils:3.4.0'
compile 'com.google.code.gson:gson:2.8.0'
compile 'com.android.support:design:25.1.1'
compile 'com.android.support:recyclerview-v7:25.1.1'
compile 'com.nineoldandroids:library:2.4.0'
}
version = "2.0.2"
// 定义两个链接,下面会用到。
def siteUrl = 'https://github.com/qydq/an-aw-base' // 项目主页。
def gitUrl = 'git@github.com:qydq/an-aw-base.git' // Git仓库的url。
// 唯一包名,比如compile 'com.qydq:an-aw-base:1.0.1'中的com.qydq就是这里配置的。
group = "com.qydq"
install {
repositories.mavenInstaller {
// 生成pom.xml和参数
pom {
project {
packaging 'aar'
// 项目描述,复制我的话,这里需要修改。
name 'AndServer For Android'// 可选,项目名称。
description 'The Android build the framework of the Http server.'// 可选,项目描述。
url siteUrl // 项目主页,这里是引用上面定义好。
// 软件开源协议,现在一般都是Apache License2.0吧,复制我的,这里不需要修改。
licenses {
license {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
}
}
//填写开发者基本信息,复制我的,这里需要修改。
developers {
developer {
id 'qydq' // 开发者的id。
name 'qydq' // 开发者名字。
email 'qyddai@gmail.com' // 开发者邮箱。
}
}
// SCM,复制我的,这里不需要修改。
scm {
connection gitUrl // Git仓库地址。
developerConnection gitUrl // Git仓库地址。
url siteUrl // 项目主页。
}
}
}
}
}
/*---build.gradle以下内容新增*/
// 指定编码
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}
// 打包源码
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}
task javadoc(type: Javadoc) {
failOnError false
source = android.sourceSets.main.java.sourceFiles
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
classpath += configurations.compile
}
// 制作文档(Javadoc)
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}
artifacts {
archives sourcesJar
archives javadocJar
}
// 这里是读取Bintray相关的信息,我们上传项目到github上的时候会把gradle文件传上去,所以不要把帐号密码的信息直接写在这里,写在local.properties中,这里动态读取。
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
user = properties.getProperty("bintray.user") // Bintray的用户名。
key = properties.getProperty("bintray.apikey") // Bintray刚才保存的ApiKey。
configurations = ['archives']
pkg {
repo = "maven" // 上传到maven库。(这里要特别注意,如果写了maven报404错误,请在bintray创建一个仓库,这里填改成你创建的仓库的名字,如何创建请看下图。)
name = "an" // 发布到Bintray上的项目名字,这里的名字不是compile 'cn.android.sunst:an-base:2.0.3'中的aw。
userOrg = 'bintray_user' // Bintray的用户名,2016年11月更新。
websiteUrl = siteUrl
vcsUrl = gitUrl
licenses = ["Apache-2.0"]
publish = true // 是否是公开项目。
}
}
//apply from: 'https://raw.githubusercontent.com/blundell/release-android-library/master/android-release-aar.gradle'
//apply from: 'https://raw.githubusercontent.com/bingoogolapple/PublishAar/master/central-publish.gradle'
上面有两个特别的地方要注意:
- 我们上传的开源项目一般会托管到github上,我们上传的时候会把项目和module的gradle文件传上去,所以不要把帐号密码的信息直接写在gradle文件中,而我们的local.properties文件一般不会上传(没经验的人可能会传),所以我们把用户隐私信息配置到local.properties, 在gradle中动态读取,如何读取,在上面最后一个代码块中有介绍。
- 我们看到在module/library的gradle中pkg下的name="an",这个名字是我们项目在Bintray中的名字,我们依赖的gradle时,
compile 'cn.android.sunst:an-base:2.0.3'
,那么compile中的an-base哪里配置呢?compile的library名称就是library/module的名称,如下图所示:
(三)在local.properties中为module/libraray配置用户隐私信息
我们会在local.properties中配置很多变量,别的地方动态引用或者读取,这样就可以做到修改一个地方,其它地方都可以不用改了:
ndk.dir=D\:\\ide\\android-sdk\\ndk-bundle
sdk.dir=D\:\\ide\\android-sdk
bintray.user=qyddai@gmail.com
bintray.apikey=fa************************5a
上传项目到Jcenter
准备工作都做完啦,最后一步就是上传操作了,点击AndroidStudio底部的Terminal,观察下Terminal显示的路径是否是你当前项目的root。
- 这里如果你系统配置了gradle的用户环境,输入gradle install,如果没有配置gradle用户环境,输入gradlew install,如果没有问题,最终你会看到BUILD SUCCESSFUL。
- 如果你看到了生成javadoc时编译不过,那么要看下在gradle中task javadoc下有没有failOnError false这句话,在刚才编写gradle时提示过了。如果加了这句而你的javadoc写的不规范会有警告,你不用鸟它。
- 最后一步,运行gradle install后看到BUILD SUCCESSFUL后,再输入上传命令gradle bintrayUpload,等一分钟左右就执行完了,会提示SUCCESSFUL。如图。
- 浏览器Download Center Automation & Distribution w. Private Repositories后会看到你的项目。
传完成咯,别着急喔,我们项目上传完成后还需要Bintray的管理员审核,所以在刚才项目页面点击进去查看详情,点击Add to Jcetner:只有等审核后我们的项目才能Gradle 依赖
这里有坑,请注意区分bintray中的名称和项目中的名称。
审核差不多一天的时间,你就会在bintray中收到消息,如图
在你的邮件中也可以收到推送的信息,Your request to include your package /has been approved。意思就是说,你的请求什么什么的,框架an-aw-base2.0.2可以应用了。如图。
题外话,明天就是3月28号了,28号啊。张小月啊,张小月啊,……,这篇日志发布到yTips专栏。