Android Library打造自己的SDK,并Maven發(fā)布(Github、碼云)

1 需求

你是否用過友盟、微信、微博、支付寶的sdk?
有沒有想研究一下對方的代碼,卻發(fā)現(xiàn)已經(jīng)混淆了?
你有沒有想過有一天,你也會進入一家牛逼的企業(yè),需要發(fā)布自己SDK?
又或者僅僅是滿足自己的虛榮心,發(fā)布一個自己得意的工具?

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

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

  • MAC(Windows也無所謂,路徑不同而已)
  • Android Studio 2.3.1
  • JDK 1.8
  • Github
  • Maven

3 實現(xiàn)步驟

3.1 新建工程

新建一個工程TestModule,選擇empty activity,讓Android studio生成一個最簡單的activity,這個工程我們用來做什么的呢?
大家知道,你交付的代碼是需要有質量保證的,因此需要對他有過詳盡的測試,這個工程就是我們的測試工程,簡單來說就模擬用戶的開發(fā)環(huán)境

3.2 新建module

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

image

新建成功后,你會發(fā)現(xiàn)左側工程導航欄里,多出了一個模塊工程,這個工程有著獨立的一套目錄結構,跟app一樣。他有自己獨立的gradle配置

image

3.2 建立功能類

在mysdk這個模塊下的操作跟普通的Android工程沒有任何區(qū)別,所以我們按平常一樣,建立一個新的activity,起名叫mySDKTest,并自動建好layout。這篇文章的重點不在功能,所以我們在這個layout中隨便建一個什么view,我們就建一個button吧,實現(xiàn)一個最簡單的功能,點擊這個button,就打印出一句“You clicked module button”。
假設,這個就是我們最終要封裝的功能。

image
<?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測試功能

此時,你會發(fā)現(xiàn)你根本run不起來這個工程,根本沒有選項去跑這個功能,可選的只有app,沒有mysdk。

image

這就是我們在3.1新建工程時說這個工程是測試工程的原因,因為Module根本跑不起來的啊

3.4配置依賴

因此我們要用到app來測試SDK,所以我們要在app中配置依賴mysdk。
方法是在app的build.gradle里加入依賴語句

compile project(':mysdk')

此時,再去app的MainActivity里,你就可以import我們剛剛建立的mySDKTest了。
同樣,我們實現(xiàn)一個button,點擊跳轉到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);
            }
        });

這樣就能跑起來測試了
跑起來后,點擊跳轉按鈕,會發(fā)現(xiàn)進入了sdk的頁面,再點擊按鈕,會打出那句log。
之后你可以根據(jù)自己的需求,繼續(xù)開發(fā),并測試。

image

3.5 管理依賴

3.5.1簡單方式

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

image

3.5.2 Maven + Github

Apache Maven是Apache開發(fā)的一個工具,提供了用于貢獻library的文件服務器。
通過Maven + Github的方式,我們可以更簡單的發(fā)布,更便捷的做版本管理;用戶可以更簡單的導入。
也是我們重點要講的內容

3.5.2.1配置打包gradle

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

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

image

3.5.2.2配置maven-release-aar.gradle

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

注意看注釋!!

// 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 {
        //這里就是最后輸出地址,在自己電腦上新建個文件夾,把文件夾路徑粘貼在此
        //注意”file://“ + 路徑,有三個斜杠,別漏了
        repository(url: "file:///Users/flame/Documents/sourceTree/mysdk")

        pom.project {
            groupId project.PUBLISH_GROUP_ID
            artifactId project.PUBLISH_ARTIFACT_ID
            version project.PUBLISH_VERSION
        }
    }
}

//以下代碼會生成jar包源文件,如果是不開源碼,請不要輸入這段
//aar包內包含注釋
task androidSourcesJar(type: Jar) {
    classifier = 'sources'
    from android.sourceSets.main.java.sourceFiles
}

artifacts {
    archives androidSourcesJar
}

3.5.2.3生成AAR文件

  • 接下來就是生成最終的AAR文件了,在Android studio右側有個gradle側邊欄,點擊會有如下畫面,選擇mysdk,點擊uploadArchives
image
  • 最后build成功
image
  • 再去上面配置好的maven輸出路徑下看,會發(fā)現(xiàn)已經(jīng)有生成文件了。
  • 注意看,version是1.0,而且有jar包,解壓jar包就會得到全部源文件
  • 如果在上一步不開源,注釋掉生成jar包的代碼,這里就不會有jar包
image

3.5.2.4上傳至github

  • 將整個文件夾上傳至Github,注意,要上傳的是完整的路徑
  • 在github中新建organization,create new-new organization.
  • 此處需要注意,create new有兩個選項,new repository和new organization,此處務必要選擇organization,雖然區(qū)別不大,但是假如選擇repository的話不能夠作為私有倉庫導入到新項目(報Failed to resolve錯誤)

3.5.2.5 管理版本

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

  • 打開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)生成了對應代碼,那么如何引用呢?

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

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

3.6.1 本地模式

代碼就在我們本地,我們當然可以就近引用咯

我們在app的build.gradle中加入如下代碼,這里已經(jīng)省略了無關代碼

 repositories {

    jcenter()

    //略

    //指定絕對路徑
    maven { url "file:///Users/flame/Documents/sourceTree/mysdk" }
}

dependencies {
    //略

    //mysdk,這里可以指定版本,我們有1.0,1.1兩個版本可選
    compile('com.flame:mySDK:1.1')
}

3.6.2 網(wǎng)絡模式

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

只需把路徑指向Github即可

 repositories {

    jcenter()

    //略

    //指定Github路徑
    maven { url "https://github.com/flameandroid/mysdk/raw/master" }
}

dependencies {
    //略
?
    //mysdk,這里可以指定版本,我們有1.0,1.1兩個版本可選
    compile('com.flame:mySDK:1.1')
}

3.7 混淆

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

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

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

        release {
            // 不顯示Log
            buildConfigField "boolean", "LOG_DEBUG", "false"
            //混淆
            minifyEnabled true
            //Zipalign優(yōu)化
            zipAlignEnabled true

            // 移除無用的resource文件
            shrinkResources true
            //前一部分代表系統(tǒng)默認的android程序的混淆文件,該文件已經(jīng)包含了基本的混淆聲明,后一個文件是自己的定義混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}

4 注意事項

作者:點燃火焰
鏈接:http://www.lxweimin.com/p/6c1d2688ed2d
來源:簡書
著作權歸作者所有。商業(yè)轉載請聯(lián)系作者獲得授權,非商業(yè)轉載請注明出處。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容