AndroidStudio发布Library到jCenter

jFrog_Bintray

在开发过程中,常常引用优秀的第三方依赖库,我们也可以发布自己的依赖库到jCenter上,公开分享依赖库,供大家方便集成使用,不用再麻烦导入jar包或者Library工程。


个人主页


使用AndroidStudio或者IDEA上,只需要添加几行代码到build.gradle文件就可以使用这个library了,如

1
2
3
dependencies {
compile 'com.excellence:basetools:1.2.2'
}

依赖库服务器

Android Studio是从build.gradle里面定义的Maven 仓库服务器上下载library的。Apache Maven是Apache开发的一个工具,提供了用于贡献library的文件服务器。总的来说,只有两个标准的Android library文件服务器:jCenter 和 Maven Central(这里只介绍jCenter)

jCenter

jCenter是一个由 bintray.com维护的Maven仓库
我们在项目的build.gradle 文件中如下定义仓库,就能使用jCenter了:

1
2
3
4
5
allprojects {
repositories {
jcenter()
}
}

发布library

申请Bintray账号

  • 注册账号
    各位大兄弟需要一个bintray账号,进入Bintray主页注册账号,注意注册个人账号https://bintray.com/signup/oss ,注册企业账号https://bintray.com/signup ,我们需要注册个人账号,如果使用企业账号会出现上传的依赖库到期等问题。
    注意注册邮箱问题:不能使用QQ、163等邮箱,如果使用GitHub快速登录,也要注意GitHub邮箱不能是QQ、163等邮箱。
    注册个人账号

  • 登录
    登录

  • 创建AndroidLibrary仓库
    Add New Repository新建仓库,注意仓库的命名:maven,因为上传依赖时,会默认上传到maven仓库
    创建仓库

  • 记录API KEY
    右上角菜单->Edit Profile->API key,输入登录密码,出现API KEY,复制API KEY,用于上传依赖,注意API KEY保密
    API KEY

引入bintray-release

  • 创建Module
    启动AndroidStudio,然后新建一个Android Library的Module
    AndroidLibrary

  • 项目的build.gradle引入
    在你的项目的build.gradle添加bintray-release的classpath,注意是项目的build.gradle,不是module的,如:

    1
    2
    3
    4
    dependencies {
    classpath 'com.android.tools.build:gradle:2.1.0'
    classpath 'com.novoda:bintray-release:0.3.4' // 添加
    }
  • 配置待上传的Module的build.gradle,详细设置可查看官方WiKi
    打开刚刚新建的Module里的build.gradle文件,添加配置,如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    apply plugin: 'com.android.library'
    apply plugin: 'com.novoda.bintray-release' // 添加

    // 添加
    publish {
    userOrg = 'veizhang' // bintray.com注册的用户名[必填]
    repoName = 'maven' // 远程仓库名称,可不填,默认名称:maven,可改为其他已创建的仓库名
    groupId = 'com.excellence' // jCenter上的路径[必填]
    artifactId = 'basetools' // 项目名称[必填]
    publishVersion = '1.2.2' // 版本号[必填]
    desc = 'Android通用适配器和常用的工具类' // 依赖描述[可写可不写]
    website = 'https://github.com/VeiZhang/BaseToolsLibrary' // Git远程仓库链接[必填,否则出现400的错误,不会自动创建依赖包]
    }

    至此,准备工作已完成,准备上传

  • 上传
    打开AndroidStudio下方的Terminal命令窗口,cd module进入待上传的Module目录中,然后输入命令,执行完毕。

    1
    gradle clean build bintrayUpload  -PbintrayUser=veizhang  -PbintrayKey=xxxxxxxxxxxxxxxxxxxxxxxxxxx  -PdryRun=false

    注意:

    需要替换PbintrayKey为账号里的API KEY;
    PdryRun=false,执行命令,没有问题则会上传,如果改成PdryRun=true会运行所有的环节,但不会上传;
    PbintrayUser对应用户名;
    

    上传成功后,在你的maven仓库里出现Module
    jCenter上传成功

  • 审核
    此时还不能引用,最后一步,只需要进入上传的依赖库中,点击Add to Jcenter,给管理员审核依赖,提交的时候要做一个简短的英文描述,尽量不要用中文,审核一般需要等待几个小时,如果想快速通过审核,Module中什么都不写,新建完Module后直接上传审核,这种方式亲测可快速通过审核审核成功后可以引用依赖,如图

    1
    compile 'com.excellence:basetools:1.2.2'

依赖引用

  • 依赖更新
    在开发过程中,不断拓展集成新功能到Module中,那我们要同时更新jCenter上的依赖,只需要把版本号提高,发布即可
    1
    2
    3
    publish {
    publishVersion = '1.2.2' // 更新版本
    }

问题集合

  • Could not create package ‘dorisgm/maven/commonlibrary2’: HTTP/1.1 400 Bad Request [message:Please enter a valid VCS URL for your package.]
    400 表示Bintray自动创建依赖库失败,原因是需要在gradle文件里添加website描述,这样才会自动创建依赖库;否则在Bintray网站上手动创建依赖库,然后上传也可以

  • Error:Execution failed for task ‘:xxxxx:bintrayUpload’.> Could not create package> ‘xxxxx/maven/xxxxxxxxx’: HTTP/1.1 401 Unauthorized
    401 这个错误很明显是认证错误,可能是你的用户名或者API key错了

  • Could not create package ‘xxxxx’: HTTP/1.1 404 Not Found [message:Repo ‘maven’ was not found]
    先Create Repository(名字默认是maven,必须要先创建仓库,或者把repoName改成其他已创建的仓库名),然后add new package如果没有出现Add to jCenter或者在bintray里面没有搜索到上传的依赖,则可能是Repository设置私有,改成public就可以了

  • Javadoc异常
    1.Execution failed for task ‘:core:mavenAndroidJavadocs’.Javadoc generation failed. Generated Javadoc options file (useful for troubleshooting): ‘/Users/zhou/git/app/core/build/tmp/mavenAndroidJavadocs/javadoc.options’
    2.androidstudio mavenAndroidJavadocs FAILED GBK编码不可映射

    JavaDoc注解出现异常,一般是有中文注解导致,改成英文;
    或者修改项目的build.gradle配置和修改Module的build.gradle配置
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    allprojects {
    repositories {
    jcenter()
    }

    /**避免中文注释:编码GBK的不可映射字符**/
    tasks.withType(Javadoc) {
    options{
    encoding "UTF-8"
    charSet 'UTF-8'
    links "http://docs.oracle.com/javase/7/docs/api"
    }
    }
    }
    1
    2
    3
    4
    5
    /**避免Javadocs错误:找不到引用**/
    tasks.withType(Javadoc) {
    options.addStringOption('Xdoclint:none', '-quiet')
    options.addStringOption('encoding', 'UTF-8')
    }
  • Execution failed for task ‘:core:lint’. Lint found errors in the project; aborting build.
    在上传过程中执行了lint检查,所以可能会报上面的错误。解决方法就是避免lint的检查,在Module的build.gradle下面就要添加如下配置:

    1
    2
    3
    4
    5
    android {
    lintOptions {
    abortOnError false
    }
    }
  • 下载的依赖看不了源码
    Module会被打包成arr文件,其中包含资源文件,大家在引用时可以查看源码。上传到Bintray时,如果混淆了(即开启了minifyEnabled true),可能会导致引用的Library看不到源码,去掉Module里混淆文件proguard-rules.pro的两行代码,即:
    1
    2
    -renamesourcefileattribute SourceFile                   #保证异常时显示行号
    -keepattributes SourceFile,LineNumberTable
谢谢老板,请尽情用红包来蹂躏我吧!!!
0%