Android Library打造自己的SDK诞挨,并Maven發(fā)布

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è)最簡(jiǎn)單的activity,這個(gè)工程我們用來做什么的呢躏精?
大家知道渣刷,你交付的代碼是需要有質(zhì)量保證的,因此需要對(duì)他有過詳盡的測(cè)試矗烛,這個(gè)工程就是我們的測(cè)試工程辅柴,簡(jiǎn)單來說就模擬用戶的開發(fā)環(huán)境

3.2 新建module

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

新建Android Module

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

相同目錄結(jié)構(gòu)

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è)最簡(jiǎn)單的功能少梁,點(diǎn)擊這個(gè)button洛口,就打印出一句“You clicked module button”。
假設(shè)凯沪,這個(gè)就是我們最終要封裝的功能第焰。

Paste_Image.png
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/button"
        android:text="Button"/>

</LinearLayout>
public class mySDKTest extends AppCompatActivity {

    private static final String TAG = "mySDKTest";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_sdktest);

        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Log.i(TAG, "You clicked module button!!");
            }
        });
    }
}

3.3測(cè)試功能

此時(shí),你會(huì)發(fā)現(xiàn)你根本run不起來這個(gè)工程妨马,根本沒有選項(xiàng)去跑這個(gè)功能挺举,可選的只有app,沒有mysdk烘跺。

只有app可選.png

這就是我們?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文搂。

        Button button = (Button)findViewById(com.flame.mysdk.R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(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è)試。

進(jìn)入sdk頁面稽物,并打印log

3.5 管理依賴

3.5.1簡(jiǎn)單方式

我們假設(shè)奄毡,你已經(jīng)完成了功能開發(fā)和測(cè)試,現(xiàn)在需要發(fā)布出去或者提交給用戶贝或,如何給到用戶呢吼过?
我們打開mysdk的目錄锐秦,在build-->outputs-->aar下面是有生成的AAR文件,你把這個(gè)文件拷貝一份給用戶其實(shí)盗忱,也是可以的酱床,大家搜一下導(dǎo)入AAR文件即可。

生成文件

3.5.2 Maven + Github

Apache Maven是Apache開發(fā)的一個(gè)工具趟佃,提供了用于貢獻(xiàn)library的文件服務(wù)器扇谣。
通過Maven + Github的方式,我們可以更簡(jiǎn)單的發(fā)布闲昭,更便捷的做版本管理罐寨;用戶可以更簡(jiǎn)單的導(dǎo)入。
也是我們重點(diǎn)要講的內(nèi)容

3.5.2.1配置打包gradle

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

apply from: 'maven-release-kline-aar.gradle'
Paste_Image.png

3.5.2.2配置maven-release-aar.gradle

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

注意看注釋!幔烛!

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

// 2.maven-信息
ext {// ext is a gradle closure allowing the declaration of global properties
    PUBLISH_GROUP_ID = 'com.flame'
    PUBLISH_ARTIFACT_ID = 'mySDK'
    PUBLISH_VERSION = android.defaultConfig.versionName
}

// 3.maven-輸出路徑
uploadArchives {
    repositories.mavenDeployer {
        //這里就是最后輸出地址啃擦,在自己電腦上新建個(gè)文件夾,把文件夾路徑粘貼在此
        //注意”file://“ + 路徑饿悬,有三個(gè)斜杠令蛉,別漏了
        repository(url: "file:///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)包含注釋
task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.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
uploadArchives
  • 最后build成功
build success
  • 再去上面配置好的maven輸出路徑下看,會(huì)發(fā)現(xiàn)已經(jīng)有生成文件了兔乞。
  • 注意看汇鞭,version是1.0,而且有jar包庸追,解壓jar包就會(huì)得到全部源文件
  • 如果在上一步不開源霍骄,注釋掉生成jar包的代碼,這里就不會(huì)有jar包
生成路徑

3.5.2.4上傳至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.5 管理版本

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

  • 打開mysdk的build.gradle另玖,修改defaultConfig下的versionName 為"1.1"
修改版本
  • 再來一次#3.5.2.3 - uploadArchives困曙,build成功后再看目錄,已經(jīng)生成了新的版本1.1

  • 再上傳至Github

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

新的版本

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 {
            // 不顯示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //混淆
            minifyEnabled true
            //Zipalign優(yōu)化
            zipAlignEnabled true

            // 移除無用的resource文件
            shrinkResources true
            //前一部分代表系統(tǒng)默認(rèn)的android程序的混淆文件,該文件已經(jīng)包含了基本的混淆聲明蜡励,后一個(gè)文件是自己的定義混淆文件
            proguardFiles getDefaultProguardFile('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閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜀漆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡咱旱,警方通過查閱死者的電腦和手機(jī)确丢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吐限,“玉大人鲜侥,你說我怎么就攤上這事≈畹洌” “怎么了描函?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)狐粱。 經(jīng)常有香客問我舀寓,道長(zhǎng),這世上最難降的妖魔是什么脑奠? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任基公,我火速辦了婚禮,結(jié)果婚禮上宋欺,老公的妹妹穿的比我還像新娘。我一直安慰自己胰伍,他們只是感情好齿诞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著骂租,像睡著了一般祷杈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渗饮,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天但汞,我揣著相機(jī)與錄音,去河邊找鬼互站。 笑死私蕾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胡桃。 我是一名探鬼主播踩叭,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了容贝?” 一聲冷哼從身側(cè)響起自脯,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斤富,沒想到半個(gè)月后膏潮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡满力,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年焕参,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脚囊。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡龟糕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出悔耘,到底是詐尸還是另有隱情讲岁,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布衬以,位于F島的核電站缓艳,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏看峻。R本人自食惡果不足惜阶淘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望互妓。 院中可真熱鬧溪窒,春花似錦、人聲如沸冯勉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽灼狰。三九已至宛瞄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間交胚,已是汗流浹背份汗。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蝴簇,地道東北人杯活。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像军熏,于是被迫代替她去往敵國和親轩猩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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