玩转Android studio 插件开发、测试、JCenter库发布(2)

本文详细介绍了如何在Android Studio中开发并发布自定义依赖库到JCenter仓库的过程,包括注册账号、获取APIKey、定义相关网站及Group,以及通过构建脚本实现依赖库的生成、打包、上传和审核。

AI 驱动代码审查实战

Claude code-review 插件深度解析,把 AI 智能审查接进 CI/CD 流水线

上一节,我们以实例的方式,讲解了android studio依赖库的开发过程,但是,似乎还没有完成。
是的,还缺少插件的生成、发布和使用。

下面我们便接着上一节,继续讲解依赖库的生成、发布和使用

依赖库的发布,是在build.gradle构建脚本中处理的。
在讲解构建脚本之前,我们先说下JCenter库的申请等前期准备工作。

1、注册账号
https://bintray.com/上注册一个账号。

2、获取API Key
注册后,在https://bintray.com/profile/edit页面的左边菜单的最下面有API Key,

这里写图片描述

复制明文API key,后面会用到。

3、定义相关网站
有单独的官方网站那是最好的,没用的话就用git网址就可以了。

def siteUrl = ‘https://github.com/xxxxxx‘// project homepage
def gitUrl = ‘https://github.com/xxxxxx.git‘// project git

4、定义Group(上一节已经定义,此处只是了解原因)
举个例子,当我们引用recylerview的时候是这样的:

compile'com.android.support:recyclerview-v7:21.0.2'

引号内字符串以冒号分割为三部分,第一部分就是group,第二部分是name, 第三部分是version。
其中group和version分别对应上一节最后在build.gradle中添加的信息,而name对应我们的模块名,由于上一节中模块名为app,所以name=app。
合起来,上一节开发的依赖库的引用就应该是这样:

compile 'com.myutils:app:0.1'

接着,便是上传依赖库到Jcenter库。需要知道的是上传到Jcenter库至少需要四个文件,除了打包的aar之外,还需要pom和javadoc,source,否则是通不过Jcenter库审核的。不过不用紧张,这些我们都可以用脚本生成。
添加创建javadocjar、sourcejar、pom和aar(也可以是jar)的脚本任务。

5、打包javadocjar和sourcejar
这两个也是上传到jcenter必须要的。

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
}

6、定义pom并打包aar

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'
                name 'Utils For Android'      //project title
                url siteUrl
                // Set your license
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id 'test'      //your user id
                        name 'csky'  // your user name
                        email 'csky@qq.com'   // your email
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}

7、配置个人信息
上传到jcenter的网站BinTray,需要用户验证,需要2个值。

// 示例值, 仅供参考
bintray.user=openproject                        // your bintray user name
bintray.apikey=c5434272d5xxxxxxxx225564155753   // your bintray api key

第二个API Key就是你在上面记录的API Key。
因为这个属于个人隐私,一般不能传到网上去,所以需要在记录到工程下的local.properties中(利用gitignore忽略这个文件到git),然后脚本再从local.properties中读取这两个值。

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 = "utils"                 //project name in jcenter
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

到目前为止,完整的build.gradle脚本如下:
项目根目录下build.gradle脚本内容为:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.3.0'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

app目录下build.gradle脚本内容为:

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

group = "com.myutils"
version = "0.1"

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "example.com.myutils"
        minSdkVersion 8
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"

        ndk {
            moduleName "hello-jni"
            ldLibs "log", "z", "m"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.1.1'
}

def siteUrl = 'https://github.com/xxxxxx'       // project homepage
def gitUrl = 'https://github.com/xxxxxx.git'

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'
                name 'Utils For Android'          // project title
                url siteUrl
                // Set your license
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id 'test'                   // your user id 
                        name 'csky'                 // your user name
                        email 'csky@qq.com'         // your email
                    }
                }
                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 = "utils"             //project name in jcenter
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

8、上传到Jcenter仓库
根据上面的build.gradle,会产生几个特别的gradle任务:

javadocJar
sourcesJar
install
bintrayUpload

通过gradew执行这些任务即可。

gradew javadocJar
gradew sourcesJar
gradew install
gradew bintrayUpload

或者通过Android Studio的最右边栏的Gradle窗口分别可视化操作,点击执行。

9、请求审核
当bintrayUpload成功之后,
在我的主页https://bintray.com/openproject/右下部分Latest Activity块,会看到你提交了一个项目,
从这个Latest Activity列表中点击你的项目,
进入详情页https://bintray.com/openproject/maven/lesscode-core/view
找到Maven Central标签,
鼠标放上去它会提示你去提交审核,点击进入后,随便写什么都可以了。
只要上面没问题,一般审核很快,几个小时就差不多了。
库的默认地址:http://dl.bintray.com/申请的名字/maven
这次审核通过了,后面升级就不用再审核了。

10、依赖库的引用(使用)
在需要引用依赖库的android studio工程中的build.gradle中添加引用:

compile 'com.myutils:app:latest.release'  //最新版,自动更新
或者
compile 'com.myutils:app:0.2'  //指定版本

剩下的便是在自己代码中尽情的享受依赖库带来的好处吧!

android studio 依赖库的开发到目前已经讲解完成类,下一篇,咱们就聊聊android studio 插件的开发。

AI 驱动代码审查实战

Claude code-review 插件深度解析,把 AI 智能审查接进 CI/CD 流水线

软件简介  飞鸽传书(IP Messenger),是由日本人Shirouzu Hiroaki (白水 启章)所发明的免费软件, 是一款局域网内即时通信软件,基于 TCP/IP(UDP)。可运行于多种操作平台(Win/Mac/UNIX/Java),并实现跨平台信息交流。不需要服务器支持, 支持文件/文件夹的传送 (2.00版以上),通讯数据采用 RSA/Blofish 加密 (2.00版以上),十分小巧,简单易用,而且你可以完全免费使用它。目前已有的版本包括: Win32, Win16, MacOS, MacOSX, X11, GTK, GNOME,Java 等, 并且公开源代码.系统要求  Microsoft Windows 95/98/Me/NT4.0/2000/XP/2003  95/98/NT4.0 ... 要求 comctl32.dll(公共控件) 的版本为 5.x 或更高.  (如果你安装的 IE 是 5.x 或更高版本, 那么就不必担心这个问题了)  注意: Windows 3.1(和 NT3.5x), 请使用 IP Messenger for Win16.使用说明  < 安装/卸载 >  执行 setup.exe 你可以将 IPMsg 安装到指定目录, 或者重新注册到启动组.  如果需要删除 IPMsg, 请先从控制面板中卸载, 再手动删除 IPMsg 目录.  < 系统托盘区图标 >  左键双击图标, 即可打开发送消息窗口.  右键点击图标, 可进入 [服务设置], [离开] 等.  < 发送消息窗口 >  - 发送消息时, 若勾选了 [封装], 则接收者要先打开信封才能看到消息,  如果你还勾选了 [上锁], 则接收者在打开信封时还需要输入密码.  (密码是由接收者自己在 [服务设置] 中设置的)  - 若要发送文件/文件夹, 可直接将文件/文件夹拖入发送消息窗口  或在发送消息窗口上点击右键, 再选择发送文件或发送文件夹  - 传送文件/文件夹时, 当接收者还没有保存(下载)文件/文件夹时,  若发送者关闭或重启了 IPMsg, 则附带的文件信息将被清除,  接收者将不能继续接收(下载)到此文件.  - 用户列表前缀符号说明  ":" 表示用户处于离开模式.  "|" 表示用户使用的不是 2.0 以上版本的 IPMsg,  将不支持文件/文件夹的传送, 并且不支持通信数据加密.  "|"(短线) 表示只支持文件/文件夹的传送.  - 拖动列表表头标题项可改变其顺序, 并可点击右键选择"保存列表顺序"  - 在消息输入窗口中, 可使用 Ctrl+Tab 输入制表符 Tab.  - 在发送消息窗口上点击右键, 可以进入设置显示优先级, 选择工作组,  搜索用户(Ctrl+F), 传送文件, 传送文件夹, 保存列表顺序, 字体设置,  窗口大小设置, 固定窗口位置, 列表显示设置.  - 在用户名上点击右键, 可设置其显示优先级  优先级按由小到大的顺序排序  - 通过设置显示优先级, 可将经常联系的用户至于列表顶端,  或者隐藏不需要联系的用户  < 接收消息窗口 >  - 在接收消息窗口上点击右键, 可以进入字体设置,  窗口大小设置, 固定窗口位置.  - 接收消息窗口标题栏中的 "+" 或 "-" 表示通信数据使用了加密算法  "+" 表示 RSA/1024 位, blowfish/128 位加密  "-" 表示 RSA/512 位, RC2/40 位加密  - 如果你收到的消息附带了文件, 将会显示出附件按钮.  点击按钮即可保存文件.  < 其他 >  - 如果需要(通过路由器)连接到广域网, 则需要设置广播地址.  详见广域网设置(广播设置)  - 其它功能都很容易理解, 你试一试就明白了操作技巧  1、隐藏/显示窗口Ctrl+D  2、按住Ctrl键再点[刷新]可保持现有用户,搜索新上线的用户  3、打开发送/接收消息窗口Ctrl+Alt+S/R(需要进行详细设置)  4、打开搜索窗口Ctrl+F  5、接收到多个文件,保存时可勾选[全部]软件原理  局域网聊天软件飞鸽传书是目前比较流行的局域网即时通讯软件,由于历史悠久,它具有比较多的用户。 因为 FreeEIM 的实现原理和飞鸽传书差不多,希望广大用户了解其原理后,在使用时更加得心应手。  开发多年的飞鸽,在他的基础上增加了些许功能,例如语音对话,这里继续讨论FreeEIM(飞鸽传书),前几天,详细的了解了FreeEIM(飞鸽传书)的网络协议,详细分析并且实现了FreeEIM(飞鸽传书)的消息传递过程,这里就FreeEIM(飞鸽传书)中的文件和文件夹的传输做详细的说明。  在FreeEIM(飞鸽传书)中,如果要进行文件或者文件夹的传输,首先需要做的就是消息的应答,通过UDP发送文件传输报文,另外的FreeEIM(飞鸽传书)客户端收到报文后,使用TCP协议发送应答报文,这样就开始进行文件的传输了。  这里开启两个线程,线程1负责文件的传送,线程2负责文件的接受,下边做一一说明。  首先,我们知道,可以发送多个文件,这些文件需要建立链表保存信息。  typedef struct file_info  {  struct file_info *next; //双向链表  struct file_info *forward;  char *file; //文件名  int type; //文件类型:文件或者文件夹  int size; //文件大小  struct sockaddr_in addr; //目标网络信息  } FILE_INFO;  [1]文件传送链表由专门的线程维护,这样,线程1就可以专心进行处理文件传输队列就可以了,线程1始终查询这个链表,如果表头为NULL,就说明没有要传输的文件,表头非空,就开始发送报文,获得正确的应答后,就可以开始文件的传输了,文件传输结束,将相应的链表节点删除。这里借鉴了很多程序中使用非常广泛的“命名池”相关的概念,只不过这里我们使用的是“文件池”,可以这么认为,如果有文件要传输,可以不用考虑是否有文件正在传输,只要把要传输的文件放入 “文件池”就可以了 , 同时,不用考虑“文件池”的大小,线程1是文件池的服务线程,它检测文件池的大小,如果非空,就会逐次传输文件。  这里需要特别注意的就是关于文件夹的传输,这个FreeEIM(飞鸽传书)一个难点,应为对与文件夹的内容是没有显示的,需要我们逐次的判断,在飞鸽传书中是这么处理的,如果是一个文件夹,就发送文件属性为IPMSG_FILE_DIR的信息包,FreeEIM(飞鸽传书)客户端收到这个信息包后,就创建这个文件夹,然后发起发送的FreeEIM(飞鸽传书)客户端,进入文件夹,传送文件夹内的文件,如果该文件夹下,还有文件夹,使用相同的方法,在文件夹内的文件传送结束后,就发送FREEEIM_FILE_RETPARENT信息包,接受的FREEEI_FILE_RETP报文的FreeEIM(飞鸽传书)客户端,执行返回上一级目录,FreeEIM(飞鸽传书)发送端,就需发送目录下的文件。这样循环操作,最终完成文件的传输,这个过程比较难以理解。  有了上边的知识,开发文件传输功能就变得简单多了,文件的接受也可以类推了,同样开启一个线程维护接受文件链表,逐次接受身下的文件,链表为空时。文件传输会遇到文件读写问题,有的文件发送是被打开了,这样会造成访问违规,所以要有相应的处理,才能让程序更加稳健。  程序启动时先读取用户配置文件,一般是"*.ini"格式,然后,使用Winsock的广播消息给整个局域网发送一个数据包,这时候,如果其他电脑已经运行了飞鸽传书,那么他收到这个包后,会将包的信息读取出来,当然,这个包里有用户的IP,用户名,性别等等。这样,在用户列表里就多了一个用户了。他的用户检查方式就如此简单而已。至于跨网段的实现,只需简单地修改一下广播地址就行了,如果不考虑速度,你可以给整个internet发广播消息。 消息发送,文件传输这些功能,都比较简单,如果你会网络编程,给你对方IP地址,这些功能实现起来再简单不过了。语音、视屏等,只需编写一些语音视频采集代码,传书的话,就像传文件一样。这里给段广播消息的实现代码吧:  // 发送广播登陆消息  void EM_UserLogin::SendLogin_BC(LPEM_DATA msg)  {  SOCKET m_socket;  m_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);  if (INVALID_SOCKET == m_socket)  {  MessageBox(0, "socket failed.", NULL, MB_OK);  }  SOCKADDR_IN sin;sin.sin_addr.s_addr = htonl(INADDR_BROADCAST);  sin.sin_family = AF_INET;  sin.sin_port = htons(BROADCAST_SEND_PORT);BOOL bOpt = TRUE;  if (SOCKET_ERROR == setsockopt(m_socket, SOL_SOCKET, SO_BROADCAST, (char*)&bOpt, sizeof(bOpt)))  {  // Error occurred  ::MessageBox(0,"BC setsockopt error.",0,0);  return;  }  char *tmpBuf = msg->GetBuffer();  if (SOCKET_ERROR == sendto(m_socket, tmpBuf, msg->GetLength(), 0, (PSOCKADDR)&sin, sizeof(sin)))  {  // Error occurred  ::MessageBox(0,"BC sendto error.",0,0);  return;  }closesocket(m_socket);  相关信息  - 所有的设置信息都保存在注册表的以下位置:  \\HKEY_CURRENT_USER\Software\HSTools\  用户密码以不可逆加密方式存储.  *******************************************************************  * 如果你忘记了密码, 可以在注册表中将此键值删除 *  * \\HKEY_CURRENT_USER\Software\HSTools\IPMsgEng\PasswordStr *  *******************************************************************  - 本软件使用的默认端口为 2425  若仅使用 UDP 协议的端口, 将不能传送文件/文件夹  (如果安装了防火墙, 则必须打开相应的 TCP 和 UDP 端口)  - 本软件为自由软件, 你可以随意传播, 但源码使用请参见许可协议.  - 只有在启动或退出程序, 使用离开模式, 刷新在线用户时 IPMsg 才会进行消息广播.  - 本软件由 Microsoft Visual C++ 6.0 编译广域网设置(广播设置)  - 主机号全部为 1 的 IP 地址, 即广播地址  例如, 连接到一个 C 类子网(24 位网络号, 8 位主机号), IP 地址为  aaa.bbb.ccc.ddd, 其广播地址即为: aaa.bbb.ccc.255  若对方处于另一个私有子网中, 广播可能无效.  - 更多问题, 请参阅相关资料或咨询你的网络管理员.  - 若两台主机的连接经过了多个路由器, 请直接指定对方IP地址  - 拨号上网用户请勾选 [拨号连接]  当刷新在线用户列表时, 列表不会被清空补充  - 启动飞鸽传书前, 你可以指定其运行时使用的端口,  且可以使用不同的端口打开多个窗口. 用法如下:  ipmsg.exe 2426 (你可在快捷方式上设置)  但是你只能与同时也使用该端口的用户通信.  - 所以你尽可选用你喜欢的端口运行本软件.  介于 10000 至 60000 可能更安全些.  你也可以咨询你的网络管理员.  - 如果有多个网卡(IP), 你可以将飞鸽传书与指定的网卡(IP)进行绑定.  命令格式如下(你可以在快捷方式上设置):  ipmsg.exe [端口] /NIC IP地址  例如:  C:\>ipmsg.exe /NIC 192.168.10.100  - 支持命令方式发送消息  命令格式如下:  ipmsg.exe [端口] /MSG [/LOG][/SEAL] <主机名或IP地址> <消息>  例如:  C:\>ipmsg.exe /MSG /SEAL localhost Hello.  支持  - IPMsg 的技术讨论区是开放的.  如果你想订阅相关邮件, 请联系 ipmsg-subscribe@ring.gr.jp  - 欢迎报告 bug, 以及提出建议  - 如果你有任何疑问, 请 E-mail 联系.  shirouzu@h.email.ne.jp  中文版可联系阿志: hiwyz@163.net  - 发送错误报告, 请勿必记录以下信息:  软件版本, 操作系统, 故障描述, 以及故障重现方法等.更新历史  ver 1.00 ... 日文版 (1996/08/19)  ver 1.31 ... 英文版/日文版 (1997/09/01)  ver 2.00 ... 英文版/日文版 (2002/11/19)  支持文件/文件夹传送  支持通信数据加密  ver 2.03 ... Bug 修正 (文件传送引起缓冲溢出)  广播设置支持主机地址(FQDN)解析  ver 2.04 ... 增加绑定网卡(IP)功能  ver 2.05 ... Bug 修正 (2.04版当激活发送/接收消息窗口时,无法注销/关闭系统)  ver 2.06 ... 很小的调整  ver 2007 ... 全面调整软件的界面可用性、性能稳定性注意:本版本为 IPMSG 2.06版 编译环境: WINXP & VS2005, 可正确编译。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值