2014年7月17日

Build software better - Android AAR 類別庫的使用與分享


什麼是AAR

AAR檔案是Google為Android開發所設計的一種library格式,全名為Android Archive Library,與Java Jar Library不同的地方是AAR除了java code之外也包含res,也就是一些圖片、文字等資源檔案。會設計這種形式的類別庫是因為Google在Android SDK tool r14之後開始支援Library Project的開發方式,這種Library Project可以說是Android APP的半成品,其目標並不是製作成APK來執行,而是提供現成的View/Activiy等一些程式資源給其他開發者使用。而AAR正是這種Library Project編譯後的壓縮檔,壓縮後只需傳遞單一檔案即可分享,可說是相當方便。

目前熱門的網路服務提供者(如Google、Facebook、Evernotec或是Dropbox等)也大多利用這種形式提供開發者來整合其服務於自己的App中,開發者如果想整合這類的網路服務,例如登入畫面或是張貼文章等,可以直接使用服務商所提供的UI元件,將之內嵌於自己的App頁面上。

enter image description here



一切從Library Project開始

在Google還沒有支援AAR檔案之前,我們必須手動複製或匯入每個所需專案目錄到IDE中,以下圖的Facebook android sdk為例,我們可以從Facebook developer網站下載SDK壓縮檔,SDK目錄中會有一個名為facebook的android project目錄,開發者可以將此目錄當作自己project的library-project,設定完成之後便可以使用該library-project中所定義的view或activity,

enter image description here

使用方式通常先是將此facebook目錄匯入Eclipse,成為如下圖的FacebookSDK專案,接下來在自己專案的Java Build Path中將FacebookSDK專案勾選進來成為Library Project。

enter image description here

然而這種使用方式,常常需要手動搬移目錄,一旦Library有更新,也沒辦法對版本進行有效的管理。因此,改用AAR的方式來存取Library Project就會變得非常好用。

使用AAR之後,世界變得不同了

因為AAR只在gradle build system有支援,也就是你需要放棄Eclipse改用Android Studio這個新的IDE(對很多電腦效能被Eclipse搞垮的人來說應該算是好事),由於Android gradle project的目錄結構與舊往的不同,因此你將無法直接匯入舊的Eclipse專案,轉換方式可以參考這裡

一旦改用Android Studio之後,我們可以發現目錄結構已經不同以往,也多了一些gradle專屬的設定檔案,以上述所提及的Facebook服務整合為例,如果要使用Facebook sdk,我們可以在如下圖的build.gradle設定檔中多加入一個facebook aar的dependencies來源即可(編號1的紅框),其中compile代表此一dependency類別庫將是採static include的方式被包含於APK之中,來源字串則是maven類別庫的URI格式,參考範例如下:

compile 'fr.avianey:facebook-android-api:3.14.1@aar'

enter image description here

接下來可以開始編寫程式並直接存取Facebook所提供的API以及Res資源,其他詳細關於如何使用Facebook API可以參考此篇文章。編譯過後我們另外可以看到專案下的build目錄產生了facebook-android-api的子目錄(如上圖編號2紅框處),此目錄是由Maven由編譯時期從背景不知不覺幫我們下載下來的。如果以前只有使用傳統Java程式編譯方法,看到這裡常常會驚訝怎麼project dependency會變得這麼簡單?我記得第一次接觸到Maven時候,發現竟然不用上網找類別庫來下載,也不用再手動搬放檔案,直呼這根本是

『神乎其神 !!』

中央集中管理類別庫的概念 - Maven

使用者不再需要自行下載類別庫,甚至還可以任意指定所需版本,這背後是如何運作的呢?其實這是Maven Server的功勞,上述的Facebook Android Studio專案之中,專案外部有一個build.gradle設定檔,此檔案記載了Maven repostory的位置來源,如下圖所示,Google將Maven的中央伺服器的位置包裝於此mavenCentral() method中,這是所有android gradle專案的預設值,因此只要Maven central repostory上面所存放的類別庫,我們都可以利用相同的方式指定參考他,當然我們也可以在這個mavenCentral()列表下新增我們自定的其他Maven reposotry server.

enter image description here

如果要查詢Maven Central repository上面有哪些類別庫資源可以使用,我們也可以上maven網站上查詢,網址是http://mvnrepository.com/,例如Facebook SDK類別庫便可以於http://mvnrepository.com/artifact/fr.avianey/facebook-android-api/3.14.1 這個位置找到(如下圖),網頁內並可以查詢該類別庫於各種支援Maven的build script上的使用方式。

enter image description here

製作並分享自己的AAR檔案

如果我們也想要製作AAR檔案來分享自己的library project,現在透過gradle的設定便可以輕鬆達成,設定方式為在專案的build.gradle設定檔加入如下的內容:

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "http://YOUR_MAVEN_REPOSTORY_SERVER/URL"){
                authentication(userName: "YOUR_USER_NAME", password: "YOUR_PASSWORD")
            }
            pom.project {
                groupId 'com.yourcompany.lib'
                artifactId 'firstAARLib'
                version '1.0.0'
                packaging 'aar'
            }
        }
    }
}


設定完成後,我們可以在每次專案編譯完成後再執行如下的command line,gradle便會幫我們把專案編譯出的aar檔案上傳至所指定的maven server上。

gradle uploadArchives

如果有使用者想要使用我們上傳的AAR模組,使用方式則是在其專案的build.gradle中的repositories清單中加入我們的上傳的Server URL,範例如下:

repositories {
    mavenCentral()
    maven {
        url "http://YOUR_MAVEN_REPOSTORY_SERVER/URL"
    }
}

如此一來,我們的Android專案便可以模組化地將功能分工合作來完成,模組元件還可以方便地再利用並透過Maven的機制地進行版本管理,一切井然有序之後,便是專案開發效率大爆發的時候了!

2 則留言: