作者:雨田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了萝玷,否則白混淆了