Android Library Maven發(fā)布SDK至(Github、碼云)

作者:雨田Android開發(fā)

鏈接:http://www.reibang.com/p/6182c474b66f

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)冰啃,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

1 需求

你是否用過友盟、微信阎毅、微博焚刚、支付寶的sdk?

有沒有想研究一下對(duì)方的代碼净薛,卻發(fā)現(xiàn)已經(jīng)混淆了汪榔?

你有沒有想過有一天,你也會(huì)進(jìn)入一家牛逼的企業(yè)肃拜,需要發(fā)布自己SDK痴腌?

又或者僅僅是滿足自己的虛榮心,發(fā)布一個(gè)自己得意的工具燃领?

這篇文章正是為實(shí)現(xiàn)這一目的

2 開發(fā)環(huán)境及工具

MAC(Windows也無所謂士聪,路徑不同而已)

Android Studio 2.3.1

JDK 1.8

Github

Maven

3 實(shí)現(xiàn)步驟

3.1 新建工程

新建一個(gè)工程TestModule,選擇empty activity猛蔽,讓Android studio生成一個(gè)最簡單的activity剥悟,這個(gè)工程我們用來做什么的呢?

大家知道曼库,你交付的代碼是需要有質(zhì)量保證的区岗,因此需要對(duì)他有過詳盡的測(cè)試,這個(gè)工程就是我們的測(cè)試工程毁枯,簡單來說就模擬用戶的開發(fā)環(huán)境

3.2 新建module

新版本的Android Studio已經(jīng)支持模塊開發(fā)慈缔,我們選擇File-->New-->New Module,此時(shí)會(huì)有一個(gè)彈框种玛,我們選擇Android Library藐鹤,并起名為MySDK

image

新建成功后,你會(huì)發(fā)現(xiàn)左側(cè)工程導(dǎo)航欄里赂韵,多出了一個(gè)模塊工程娱节,這個(gè)工程有著獨(dú)立的一套目錄結(jié)構(gòu),跟app一樣祭示。他有自己獨(dú)立的gradle配置

image

3.2 建立功能類

在mysdk這個(gè)模塊下的操作跟普通的Android工程沒有任何區(qū)別肄满,所以我們按平常一樣,建立一個(gè)新的activity质涛,起名叫mySDKTest悄窃,并自動(dòng)建好layout。這篇文章的重點(diǎn)不在功能蹂窖,所以我們?cè)谶@個(gè)layout中隨便建一個(gè)什么view,我們就建一個(gè)button吧恩敌,實(shí)現(xiàn)一個(gè)最簡單的功能瞬测,點(diǎn)擊這個(gè)button,就打印出一句“You clicked module button”。

假設(shè)月趟,這個(gè)就是我們最終要封裝的功能灯蝴。

image

<?xml version="1.0" encoding="utf-8"?><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:background="#ffffff"xmlns:android="http://schemas.android.com/apk/res/android"><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/button"android:text="Button"/></LinearLayout>

publicclassmySDKTestextendsAppCompatActivity{privatestaticfinalStringTAG="mySDKTest";@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_my_sdktest);Buttonbutton=(Button)findViewById(R.id.button);button.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Log.i(TAG,"You clicked module button!!");}});}}

3.3測(cè)試功能

此時(shí),你會(huì)發(fā)現(xiàn)你根本run不起來這個(gè)工程孝宗,根本沒有選項(xiàng)去跑這個(gè)功能穷躁,可選的只有app,沒有mysdk因妇。

image

這就是我們?cè)?.1新建工程時(shí)說這個(gè)工程是測(cè)試工程的原因问潭,因?yàn)镸odule根本跑不起來的啊

3.4配置依賴

因此我們要用到app來測(cè)試SDK,所以我們要在app中配置依賴mysdk婚被。

方法是在app的build.gradle里加入依賴語句

compile project(':mysdk')

此時(shí)狡忙,再去app的MainActivity里,你就可以import我們剛剛建立的mySDKTest了址芯。

同樣灾茁,我們實(shí)現(xiàn)一個(gè)button,點(diǎn)擊跳轉(zhuǎn)到mysdk的activity谷炸。

Buttonbutton=(Button)findViewById(com.flame.mysdk.R.id.button);button.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewview){Intentintent=newIntent(MainActivity.this,mySDKTest.class);startActivity(intent);}});

這樣就能跑起來測(cè)試了

跑起來后北专,點(diǎn)擊跳轉(zhuǎn)按鈕,會(huì)發(fā)現(xiàn)進(jìn)入了sdk的頁面旬陡,再點(diǎn)擊按鈕拓颓,會(huì)打出那句log。

之后你可以根據(jù)自己的需求季惩,繼續(xù)開發(fā)录粱,并測(cè)試。

image

3.5 管理依賴

3.5.1簡單方式

我們假設(shè)画拾,你已經(jīng)完成了功能開發(fā)和測(cè)試啥繁,現(xiàn)在需要發(fā)布出去或者提交給用戶,如何給到用戶呢青抛?

我們打開mysdk的目錄旗闽,在build-->outputs-->aar下面是有生成的AAR文件,你把這個(gè)文件拷貝一份給用戶其實(shí)蜜另,也是可以的适室,大家搜一下導(dǎo)入AAR文件即可。

image

3.5.2 Maven + Github

Apache Maven是Apache開發(fā)的一個(gè)工具举瑰,提供了用于貢獻(xiàn)library的文件服務(wù)器捣辆。

通過Maven + Github的方式,我們可以更簡單的發(fā)布此迅,更便捷的做版本管理汽畴;用戶可以更簡單的導(dǎo)入旧巾。

也是我們重點(diǎn)要講的內(nèi)容

3.5.2.1配置打包gradle

在mysdk的目錄下,新建一個(gè)名為maven-release-aar.gradle的文件忍些,并在build.gradle中添加如下字段:

applyfrom:'maven-release-kline-aar.gradle'

image

3.5.2.2配置maven-release-aar.gradle

可以這么理解鲁猩,maven-release-aar.gradle就是我們用來設(shè)置打包的腳本,在文件中添加如下代碼:

注意看注釋0瞻印廓握!

// 1.maven-插件apply plugin:'maven'//?

2.maven-信息ext{// ext is a gradle closure allowing the declaration of global propertiesPUBLISH_GROUP_ID='com.flame'PUBLISH_ARTIFACT_ID='mySDK'PUBLISH_VERSION=android.defaultConfig.versionName}// 3.maven-輸出路徑

uploadArchives{

? ? ? ?repositories.mavenDeployer{

//這里就是最后輸出地址,

在自己電腦上新建個(gè)文件夾嘁酿,把文件夾路徑粘貼在此//注意”file://“ + 路徑隙券,有三個(gè)斜杠,別漏了(如果路徑找不到注意要帶上對(duì)應(yīng)盤路徑)

repository(url:"file:///C:/Users/flame/Documents/sourceTree/mysdk")

pom.project{

groupId project.PUBLISH_GROUP_ID

artifactId project.PUBLISH_ARTIFACT_ID

version project.PUBLISH_VERSION

}

}

}

//以下代碼會(huì)生成jar包源文件痹仙,如果是不開源碼是尔,請(qǐng)不要輸入這段//aar包內(nèi)包含注釋

taskandroidSourcesJar(type:Jar){

classifier='sources'fromandroid.sourceSets.main.java.sourceFiles

}

artifacts{

archives androidSourcesJar

}

3.5.2.3生成AAR文件

接下來就是生成最終的AAR文件了,在Android studio右側(cè)有個(gè)gradle側(cè)邊欄开仰,點(diǎn)擊會(huì)有如下畫面拟枚,選擇mysdk,點(diǎn)擊uploadArchives

image

最后build成功

image

再去上面配置好的maven輸出路徑下看众弓,會(huì)發(fā)現(xiàn)已經(jīng)有生成文件了恩溅。

注意看,version是1.0谓娃,而且有jar包脚乡,解壓jar包就會(huì)得到全部源文件

如果在上一步不開源,注釋掉生成jar包的代碼滨达,這里就不會(huì)有jar包

image

3.5.2.4.1上傳至github

將整個(gè)文件夾上傳至Github奶稠,注意,要上傳的是完整的路徑

在github中新建organization捡遍,create new-new organization.

此處需要注意锌订,create new有兩個(gè)選項(xiàng),new repository和new organization画株,此處務(wù)必要選擇organization辆飘,雖然區(qū)別不大,但是假如選擇repository的話不能夠作為私有倉庫導(dǎo)入到新項(xiàng)目(報(bào)Failed to resolve錯(cuò)誤)

3.5.2.4.2上傳至碼云(

這是另外一篇文章,不要糾結(jié)兩篇文章的項(xiàng)目路徑谓传,只要參考對(duì)應(yīng)操作完成即可蜈项。

作者:啥啥啥娜娜)

鏈接:http://www.reibang.com/p/3e0b213ab03d

來源:簡書

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán)续挟,非商業(yè)轉(zhuǎn)載請(qǐng)注明出處紧卒。


1,首先在碼云上新建一個(gè)項(xiàng)目诗祸,如下圖所示


2常侦,本地新建一個(gè)文件夾


3浇冰,進(jìn)入新建的文件夾,點(diǎn)擊鼠標(biāo)右鍵聋亡,選擇git bash here


然后在窗口輸入 git init ?這時(shí)候文件夾會(huì)多出一個(gè).git文件夾,看不到文件夾的际乘,點(diǎn)擊鼠標(biāo)右鍵選擇“顯示不顯示隱藏的文件”就可以看到這個(gè)文件夾了

4坡倔,進(jìn)入剛剛在碼云新建的項(xiàng)目里,復(fù)制框框里的路徑

5脖含,然后在回到本地新建的文件夾里

繼續(xù)操作git ? ?

輸入git remote add origin + 你剛剛在碼云復(fù)制的那行路徑

6罪塔,繼續(xù)輸入 git pull origin master 命令,將碼云上的倉庫pull到本地文件夾

7养葵,將要上傳的文件征堪,添加到剛剛創(chuàng)建的文件夾? ?

8,使用git add .? (. 表示所有的)或者 git add + 文件名? ? ? ? ? ? // 將文件保存到緩存區(qū)


9关拒,使用git commit -m '新添加的文件內(nèi)容描述'? ? ?//添加文件描述



10佃蚜、使用git push origin master ,將本地倉庫推送到遠(yuǎn)程倉庫


11着绊,回到碼云谐算,刷新試試,就可以看到新建項(xiàng)目了?



3.5.2.5 管理版本

剛剛提到之所以用maven的一個(gè)原因就是版本控制归露,這里我們就演示一下洲脂,所謂的版本控制

打開mysdk的build.gradle,修改defaultConfig下的versionName 為"1.1"

image

再來一次#3.5.2.3 - uploadArchives剧包,build成功后再看目錄恐锦,已經(jīng)生成了新的版本1.1

再上傳至Github

這樣我們就有了清晰的版本控制

image

3.6 如何引用

在之前的章節(jié)中,我們已經(jīng)生成了對(duì)應(yīng)代碼疆液,那么如何引用呢一铅?

首先我們先要在app的build.gradle里面移除之前的依賴方法

//注釋掉這段,不需要了//compile project(':mysdk')

3.6.1 本地模式

代碼就在我們本地枚粘,我們當(dāng)然可以就近引用咯

我們?cè)赼pp的build.gradle中加入如下代碼馅闽,這里已經(jīng)省略了無關(guān)代碼

repositories{jcenter()//略//指定絕對(duì)路徑maven{url"file:///Users/flame/Documents/sourceTree/mysdk"}}dependencies{//略//mysdk,這里可以指定版本馍迄,我們有1.0,1.1兩個(gè)版本可選compile('com.flame:mySDK:1.1')}

3.6.2 網(wǎng)絡(luò)模式

上面提到的方法福也,當(dāng)然是少數(shù),畢竟我們大多數(shù)都是在網(wǎng)絡(luò)導(dǎo)入依賴庫攀圈,這里就是需要用到之前上傳至Github的代碼了暴凑。

只需把路徑指向Github即可

repositories{jcenter()//略//指定Github路徑maven{url"https://github.com/flameandroid/mysdk/raw/master"}}dependencies{//略?//mysdk,這里可以指定版本赘来,我們有1.0,1.1兩個(gè)版本可選compile('com.flame:mySDK:1.1')}

3.7 混淆

我們打開External Libraries现喳,會(huì)發(fā)現(xiàn)mySDK已經(jīng)導(dǎo)入工程凯傲,而且還是完全開源的。

而很多時(shí)候我們是不需要開源的嗦篱,那么如何做到呢冰单?其實(shí)和普通的Android打包混淆一模一樣

把混淆過的代碼上傳至Github,這樣我們就完成了SDK的制作和發(fā)布

release{// 不顯示LogbuildConfigField"boolean","LOG_DEBUG","false"http://混淆minifyEnabledtrue//Zipalign優(yōu)化zipAlignEnabledtrue// 移除無用的resource文件shrinkResourcestrue//前一部分代表系統(tǒng)默認(rèn)的android程序的混淆文件灸促,該文件已經(jīng)包含了基本的混淆聲明诫欠,后一個(gè)文件是自己的定義混淆文件proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'}

4 注意事項(xiàng)

注意路徑一定要寫對(duì),特別是大小寫浴栽,路徑的大小寫不對(duì)是找不到文件的荒叼,這雖然是低級(jí)錯(cuò)誤,但其實(shí)挺常見的

注意Github路徑不是常見的https://github.com/flameandroid/mysdk.git典鸡,

而是https://github.com/flameandroid/mysdk/raw/master

注意如果選擇了混淆被廓,切勿在打包那步生成了jar,還上傳到Github了萝玷,否則白混淆了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嫁乘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子间护,更是在濱河造成了極大的恐慌亦渗,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汁尺,死亡現(xiàn)場(chǎng)離奇詭異法精,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)痴突,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門搂蜓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辽装,你說我怎么就攤上這事帮碰。” “怎么了拾积?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵殉挽,是天一觀的道長。 經(jīng)常有香客問我拓巧,道長斯碌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任肛度,我火速辦了婚禮傻唾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘承耿。我一直安慰自己冠骄,他們只是感情好伪煤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凛辣,像睡著了一般抱既。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蟀给,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天蝙砌,我揣著相機(jī)與錄音,去河邊找鬼跋理。 笑死,一個(gè)胖子當(dāng)著我的面吹牛恬总,可吹牛的內(nèi)容都是我干的前普。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼壹堰,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼拭卿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起贱纠,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤峻厚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谆焊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惠桃,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年辖试,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了辜王。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罐孝,死狀恐怖呐馆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莲兢,我是刑警寧澤汹来,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站改艇,受9級(jí)特大地震影響收班,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遣耍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一闺阱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舵变,春花似錦酣溃、人聲如沸瘦穆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扛或。三九已至,卻和暖如春碘饼,著一層夾襖步出監(jiān)牢的瞬間熙兔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工艾恼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留住涉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓钠绍,卻偏偏與公主長得像舆声,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柳爽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容