快速开发与封装可集成的Android Library

前言

日常工作中不可避免的出现了很多常常需要复用的代码,例如我在做项目开发中使用到的对话框,因为使用了统一样式、统一的调用方法和接口、回调函数等,而每次开发新的工程都需要对其的代码、布局文件、图片文件以及颜色资源等进行代码部署,费时费力,若是能对其进行封装,将大大降低开发成本。
本次我将以Kongzue Dialog对话框库封装的过程为例,讲解如何快速开发和封装一个Android Library。

提示

请注意,本文所有操作均建立在可以链接互联网,正常可访问Google、bintray、GitHub等网站的前提下,若不能正常访问,请自行寻找办法,本文不再另外提供。

一、创建库项目

这里我使用了Android Studio 2.3.2版本作为IDE来进行Android Library的初步开发。
首先创建SDK的测试工程:DialogDemo,这是一个标准Android工程,用于测试Android Library是否正常使用以及最后测试从Maven仓库引入我们的库是否成功。


标准Android项目

创建完成后,点击Android Studio左上角的File->New->New Module在打开的对话框选择“Android Library”,点击Next下一步,分别输入库名称和模组名为“Dialog”和“dialog”,点击“Finish”完成库的创建。接下来就可以对创建好的Android Library库进行相应的开发了。
开发的过程中可以对Android Library的Application进行设置,以便于部分组件的初始化,首先创建Application类DialogPlugin,源代码如下:

public class DialogPlugin extends Application {

    private static Context context;
    private static Handler handler;
    public static boolean isDebug = true;

    @Override
    public void onCreate() {
        super.onCreate();
        //在这里初始化你需要初始化的东西
    }

    public static Context getContext() {
        return context;
    }

    public static Handler getHandler() {
        return handler;
    }

}

并在AndroidManifest.xml中完成绑定:

    <application
        android:name=".DialogPlugin"
        android:allowBackup="true"
        android:label="@string/app_name"
        android:supportsRtl="true">
    </application>

如果你需要输出Log日志,可以自行编写一个Log类对日志信息进行打印,但此处注意,日志输出应该是可控的,因此我在Application类DialogPlugin中预留了一个isDebug的参数来控制日志是否输出,如有需要可以提供给用户一个方法来决定是否开启日志打印模式。日志类Log的全文如下:

public class Log {

    public static void println(Object msg){
        if(!DialogPlugin.isDebug){
            return;
        }
        android.util.Log.d("kongzue.dialog>>>",msg.toString());
    }

}

开发的过程在此略过,根据创建的Android Library需要提供的功能进行开发即可,本例中封装的Dialog源代码可以进入https://github.com/kongzue/Dialog 查看。完成功能的相关开发后,就将进入封装的过程了。

Android Library库dialog的目录结构

二、Android Library的引用

在本地写好相应功能后就可以在Demo中进行调试了,进入DialogDemo 的build.gradle(Module:app)中,在dependencies { }中加入以下代码:

    compile project(':dialog')

然后在Demo工程中调用相应的Android Library相应组件方法进行测试,测试通过。

MessageDialog.show(this,"提示","提示信息","关闭",null);

完成此步后说明功能一切正常,接下来就是需要将Android Library上传到Maven仓库来进行在线引用了。

三、JFrog Bintray的注册和使用

JFrog Bintray分为收费版和免费开源版两个版本,进入JFrog Bintray首页( bintray.com )后点击右上角的Sign In进入登陆界面,注意,点击下边不明显的“Sign Up to an Open Source account”链接注册为免费版本(如图所示):


JFrog Bintray注册

注册过程需要填写的都十分简单,主要是姓名、用户名、密码、邮箱、你的国家,填写完毕后校验邮箱后直接注册完成即可。登录后进入你的设置,找到API Key,输入你的登陆密码提交后获得API密钥,步骤如下图所示:


Step1

Step2

记录你的API密钥,稍后需要用到。

回到首页,点击“Add New Repository”创建新目录,创建命名为“maven”的目录。


Step3

四、发布你的Android Library

接下来是关键,首先需要我们进入build.gradle(Project:DialogDemo)进行如下修改:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        //...
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.4.1'
        //...
    }
}

然后需要到我们创建的Android Library库的build.gradle(Module:dialog)中修改为如下代码:

apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'

def siteUrl = 'https://github.com/kongzue/Dialog' //项目在github主页地址
def gitUrl = 'https://github.com/kongzue/Dialog.git'   //Git仓库的地址

group = "com.kongzue.dialog"//发布aar前缀根节点
version = "1.0.0"//发布aar的库版本
//最后生成是compile 'com.kongzue.dialog:dialog:0.0.1' 就是group + :+module名字 + :+version

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.2"

    defaultConfig {
        minSdkVersion 14
        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'
        }
    }

}

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'
                name 'dialog'//添加项目描述
                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 'myzchh'//设置自己ID
                        name 'myzchh'//设置自己名字
                        email 'myzcxhh@live.cn'//设置自己邮箱
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}
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
}

artifacts {
    archives javadocJar
    archives sourcesJar
}

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    configurations = ['archives']
    pkg {
        repo = "maven"
        name = "dialog" //项目在JCenter的名字
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

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.3.1'
    testCompile 'junit:junit:4.12'
}

完成修改后进入local.properties文件添加如下代码:

bintray.user=你的用户名
bintray.apikey=你的API密钥

完成后,点开Android Studio的控制台Terminal,输入如下指令:

gradlew install

待提示“BUILD SUCCESSFUL”后完成。
注意,此处可能出现异常,有可能是因为字符集问题,可以通过尝试删除代码中的注释等中文进行解决,其他多半是网络问题没有下载下来相关文件,多次重试即可。
再执行如下命令上传文件:

gradlew bintrayUpload

完成后进入你的JFrog Bintray的maven目录,应该能够看到有一个叫做“dialog”的项目,点进去可以看到库的引用地址,如下图所示:


引用地址

回到Android Studio,进入build.gradle(Module:app),添加以下代码:

repositories {
    maven {
        url  "http://dl.bintray.com/myzchh/maven"
    }
}

将maven指向你的JFrog Bintray的maven仓库,接下来将之前在dependencies { }中引用代码:

    compile project(':dialog')

替换为

compile 'com.kongzue.dialog:dialog:1.0.0'

编译后即可完成库的引用。此处出现问题的话主要可能出现在网络连接上,以及不要使用“offline”的Gradle,具体设置方法为File->Setting->Build,Execution,Deployment->Gradle中关闭“Offline Work”设置即可。
一切搞定,Enjoy it!

声明

本文感谢以下两篇文章给于指点,并进行了补充和完善。
《Android studio 制作aar 使用Gradle发布项目到JCenter仓库》@WX_JIN的博客
http://blog.csdn.net/WX_JIN/article/details/51006703
《android SDK开发》
http://www.kancloud.cn/digest/phoebe/130447
如有疑问欢迎在评论区留言,如果本文对您有所帮助欢迎点击下边的“喜欢”按钮。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,069评论 4 358
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,212评论 1 287
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 105,912评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,424评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,741评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,194评论 1 206
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,553评论 2 307
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,289评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,923评论 1 237
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,251评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,775评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,144评论 2 249
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,698评论 3 228
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,936评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,658评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,214评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,159评论 2 258

推荐阅读更多精彩内容