如果你做过第三方sdk开发,一定会对包的更新迭代叫苦不迭. 每次版本的更新都需要本地打包,在发给第三方. 于是在我们的Android Studo中,Jcenter由此应运而生. 接下来我们一步一步的解析,看看如何来实现吧.

    

Bintray有关设置


  • 什么是Jcenter

    Jcenter 是Jfrog Bintray的一个Maven仓库,用来存放一些更新包。谷歌很多支持包也都放在这个仓库里面.点这里可以看仓库地址。所以想使用Jcenter服务,需要注册Bintray账号并拿到key(key是啥后面介绍).

  • 申请Bintray账号

    需要注意的是,进入下载页会出现下图两种注册模式,如果使用 图(一) 方式注册,在打包的时候可能会出现因为找不到仓库 出现 ‘http/1.1 404 [Repo not found]’ 的异常. 推荐使用第二种 for_source_plan 方式注册.

    图(一)

    图(二)

    图一注册是 for_free_trail 模式,图二注册是 for_open_source 模式. 官方文档解释:
       
       If you are on the open source plan and have not yet created an 
    organization then your user profile page will be displayed. 
               
       Either way, you can access your personal profile page, or the 
    profile page of any other organization you own from the profile menu 
    in Bintray’s top ribbon
    

    更重要的一点,那个 图(一) 方式创建的账号,是有试用期的!!30天试用期,鬼知道30后会发生什么…

    注:如果使用第三方账号登录 如 Github 账号,Google账号,推特账号,默认是按照图一方式注册,可能出现找不到仓库的情况; 在按照第二种方式注册时,如果填写的内容不符合Bintray规范会出现点击 ‘Create Account’ 无反应. 比如填写邮箱Gmail的邮件地址是可以创建的,但如果你用 QQ邮箱 163邮箱 (其他邮箱没有测试)是没有反应的。

  • 登录Bintray网站,拿到ApiKey

    如果你是 for_free_trail 方式注册的账号,你的账号下拉框是这样的:

    图(三)

    这种方式在打包的时候出现了上面说的错误.故在弄不懂的情况下,先不对它作介绍了.着重看for_soure_open方式:

    图(四)

    点击Edit Profile,进入编辑页面,点击 API Key,点击 Show 即可拿到 API Key 了:

  • 创建maven仓库

    先在Bintray创建一个远程maven仓库,选择Maven仓库类型,如上图.

    点击 Add New Repository,如果创建成功。出现maven仓库表示创建成功.

    

Build Gradle脚本语言简介


  • 什么是Gradle?

    gradle是一种构建工具,不同于ant在于,它抛弃了基于XML的构建脚本转而采取基于Groovy的构建方式. 也是Android Studio默认采用的构建方式.

    Groovy 语法和java很相似,而且同源(有相同的jvm). 这也是Android Studio采用Gradle作为默认构建工具的原因之一. 要满足此次编译jcenter包脚本,无需掌握过多Groovy语法,只需了解即可.

  • Gradle 构成简介

    gradle构建基础概念:

        Project : 构建项目,在android studio上的体现是module
        Task : build.gradle中的运行单元
    

    gradle构建由三种文件组成:

       build.gradle : 构建脚本编写地址,主要用来写配置脚本和任务 
       gradle.properties :Gradle属性配置文件,可以在build.gradle
       中通过名称引用属性,例如:
         在gradle.properties中配置 PRO_NAME = test
         在build.gradle可以如下引用 
            task test << {
                           println $PRO_NAME
                           println "this project is $PRO_NAME"
                          }
       settings.gradle : project配置属性,多个项目组合时在.settings
         文件中加入才会参与构建.
                
    

    一些常用的声明解释:

         buildscript {} ;配置Gradle自身构建时需要用到的资源
         repositories{}; 配置时project需要用到的资源文件
         task{};声明一个运行任务,可以通过gradle 命名行调用执行
         apply plugin : 声明build时使用的插件,说明的构建项目的类型(android,java,web...)
         android: 如果是android项目,这里配置一些android项目的构建参数
    

    

配置Android项目,开始编写脚本并执行查看效果


  • 配置根目录的build.gradle,添加如下代码:
     buildscript {//配置gradle编译环境
         repositories {
             jcenter()
         }
         dependencies {
             classpath 'com.android.tools.build:gradle:2.2.3' 
             //需要github插件,github上传即可打包至jcenter
             classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
             //jcenter资源包,允许脚本发布至Jcenter
             classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.5' 
         }
     }
     allprojects {
         repositories {
             jcenter()
         }
     }
   
  • 配置需要打包的module目录下的build.gradle
       //声明打包需要用到的插件
       apply plugin: 'com.android.library'
       apply plugin: 'com.github.dcendents.android-maven'
       apply plugin: 'com.jfrog.bintray'
       //android module配置
       android {
           compileSdkVersion 19
           buildToolsVersion "24.0.0"
           sourceSets {//指定gradle源码识别目录
               main {
                   manifest.srcFile 'AndroidManifest.xml'
                   java.srcDirs = ['src']
                   resources.srcDirs = ['src']
                   aidl.srcDirs = ['src']
                   renderscript.srcDirs = ['src']
                   res.srcDirs = ['res']
                   assets.srcDirs = ['assets']
               }       
           }
       }
       
       buildscript {
           repositories {
               jcenter()
           }
           dependencies {
               classpath 'com.android.tools.build:gradle:2.2.3'
           }
       }
       
       dependencies {
           compile fileTree(include: '*.jar', dir: 'libs')
       }
       
        // 项目的主页,改为自己的github主页地址
       def siteUrl = 'https://github.com/xx/xx'     
        // Git仓库的url,,改为自己的github 代码地址
       def gitUrl = 'https://github.com/xx/xx.git'  
       // Maven Group ID for the artifact,一般填你唯一的包名
       group = "com.your.package" 
       //项目引用版本号 artifactId,在此配置,更新时修改次版本号
       version = "1.0.2"
       //maven仓库配置
       install {
           repositories.mavenInstaller {
               pom {
                   project {
                       packaging 'aar'//打包方式
                       	//项目描述
                       name 'biu biu biu biu' 
                       url siteUrl

                       licenses {
                           license {
                               name 'The Apache Software License, Version 2.0'
                               url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                           }
                       }
                       developers {
                           developer { //开发者信息
                               id ''		//填写的一些基本信息
                               name ''
                               email ''
                           }
                       }
                       scm {
                           connection gitUrl
                           developerConnection gitUrl
                           url siteUrl
                       }
                   }
               }
           }
       }
       
       //遍历 soursSets,打包源码
       task sourcesJar(type: Jar) {
           from android.sourceSets.main.java.srcDirs
           classifier = 'sources'
       }
       
       task javadoc(type: Javadoc) {
           source = android.sourceSets.main.java.srcDirs
           classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
       }
       task javadocJar(type: Jar, dependsOn: javadoc) {
           classifier = 'javadoc'
           from javadoc.destinationDir
       }
       //输出maven
       artifacts {
           archives javadocJar
           archives sourcesJar
       }
       //读取local.properties中属性,私密属性在本地配置并添加至.gitignore.
       Properties properties = new Properties()
       properties.load(project.rootProject.file('local.properties').newDataInputStream())
       bintray {//你的bintray账号配置,配置正确才能在bintray账号中找到你的包
           user = properties.getProperty("bintray.user")
           key = properties.getProperty("bintray.apikey")
           configurations = ['archives']
           pkg {
               repo = "maven"
               name = "simple"	//发布到JCenter上的项目名字
               websiteUrl = siteUrl
               vcsUrl = gitUrl
               licenses = ["Apache-2.0"]
               publish = true
               publicDownloadNumbers = true
       
           }
       }
      
  • 配置local.properties

    bintray.user=your_bintary_account
    bintray.apikey=your_bintary_apiKey;
    
  • 执行命名,打包上次只Bintray的Maven仓库

    cd your_project_path
    ./gradlew install
    ./gradlew bintrayUpload
    

    一切顺利的话进入Bintray首页,点击Maven图标进入仓库详情即可在Bintray中看到你的包了.

    注意:
        打包好后,在通过 compile ‘group:name:version’ 格式来引用. 所以在配置 group,version,name时注意起名; 例如 :group 可以为你的包名 group:com.example.test; name:example ; version:0.9.1; 在引用时就要这样写: compile ‘com.example.test:example:0.9.1’(name是pkg{}目录的name,不是maven的pom中的name)
        第一次建立好group,name完成打包后不要修改,不然修改后虽然能在相应的Bintray生成成功,但是在jcenter中找不到。