美文网首页Android成长干货Android技术
快速开发与封装可集成的Android Library

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

作者: kongzue | 来源:发表于2017-06-01 23:53 被阅读133次

    前言

    日常工作中不可避免的出现了很多常常需要复用的代码,例如我在做项目开发中使用到的对话框,因为使用了统一样式、统一的调用方法和接口、回调函数等,而每次开发新的工程都需要对其的代码、布局文件、图片文件以及颜色资源等进行代码部署,费时费力,若是能对其进行封装,将大大降低开发成本。
    本次我将以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
    如有疑问欢迎在评论区留言,如果本文对您有所帮助欢迎点击下边的“喜欢”按钮。

    相关文章

      网友评论

        本文标题:快速开发与封装可集成的Android Library

        本文链接:https://www.haomeiwen.com/subject/jgkyfxtx.html