Android的Launcher研究:客製化桌面UI

jollen 發表於 July 17, 2009 3:13 AM

前言

能取得Android OS原始碼,並修改裡頭的內容,有時候也頗有樂趣。最近和幾位朋友聊到「Android框架的改造」,以及如何吸引對Android框架技術有興趣的同好一起交流的議題;我個人認為,一開始如果能丟出一個比較有樂趣的議題,或許可以有拋磚引玉的效果。

上週在北京進行Android培訓課程時,與eoeAndroid社群也進行了想法的交流,由於大家都體認到Android底層技術的重要性及其價值,而且eoeAndroid社群裡也有許多技術好手,所以就和eoeAndroid的創辦人靳岩兄有了一個共同主持研究Android底層技術「同好小組」的想法,希望能透過社群的方式,集合大家的智慧,一起把底層技術研究清楚。

因為要讓大家能有焦點,所以「發題」很重要,這個工作就由落在我身上了。由於第一次希望題目能簡單,並且有趣一點,至少要能達到發球的效果,吸引大家開始關心Android底層技術,所以原則是:希望能用最簡單的方式、讓大家體驗修改底層的樂趣。

題目說明: Launcher

第一次的題目是「Launcher」的修改。

Launcher就是Android的應用程式啟動器,Launcher的功能還包含:桌面的切換、應用程式快捷(shortcut)功能、背景圖(Wallpaper)功能等等。因此,修改Launcher可以改變一些很深層的UI功能。

在Android的桌面最下方,有一個圖示,按下後可以拉出應用程式圖示清單,這是Launcher提供的功能。這一次,因為我們覺得這個Launcher的圖示太製式化了,越看越不好看,所以想要修改一下,換張圖,要怎麼做到呢?

範例展示

例如,圖1是原始的圖示;圖2是修改後的圖示。

launcher-1.png
圖1: 原始圖示

launcher-2.png
圖2: 幫Launcher妝扮一下

實作說明 1/4: 取得Android原始碼與EeePC移植

這個功能並不難做,事實上,完全不用寫程式。只要把圖檔重做就可以了。只不過前提是,要知道:

1. 如何取得Android OS原始程式碼
2. 如何編譯Android OS

最簡單的做法是:

1. 下載Android原始碼後、取得EeePC的移植(product)
2. 編譯「TARGET_PRODUCT」為eee_701
3. 由於Launcher都是用Java語法寫成的,所以不會有架構(ARM/x86/...)的問題,編譯後可以取得Launcher.apk;APK套件是不分處理器平臺的

先學會如何由Android原始碼編譯出eee_701的image,才有辦法繼續進行。

實作說明 2/4: 修改圖檔

在Android原始碼的 packages/apps/ 目錄裡,存放了Android內建的應用程式原始碼,Launcher是Android的一個應用程式,所以從這裡找到它的原始碼,並進行修改工程。

切換到以下目錄:

<android source>/packages/apps/Launcher/

接著要修改src/目錄下的內容,還是res/目錄下的內容呢?圖檔屬於Android的「resource」,因此當然是到res/目錄下找到我們要的圖檔。

切換到以下目錄:

<android source>/packages/apps/Launcher/res/

又看到了一大堆目錄,圖檔的部份存放於:

  • drawable-land/ - landscope 模式的圖檔
  • drawable-port/ - portrait 模式的圖檔

我們先改一下portrait模式的圖檔。找到drawable-port/tray_handle_normal.png檔案如下:

tray_handle_normal-1.png

就是它了,換掉,把圖檔換成這個:

tray_handle_normal-2.png

換好後重編Android即可。一行程式都不用改。

實作說明 3/4: 安裝Launcher.apk

重編Android原始碼,接著可以在out/target/product/<product name>/system/app/找到Launcher.apk套件。把Launcher.apk安裝到AVD(Android 模擬器)裡做測試,方法如下:

1. 先啟動一個AVD
2. 執行adb將Launcher.apk手動安裝到AVD裡,指令如下:

$ adb install -r <your-path>/Launcher.apk

成功後可看到以下畫面:

338 KB/s (837376 bytes in 2.417s)
        pkg: /data/local/tmp/Launcher.apk
Success

實作說明 4/4: 重開機

已經完成了,直接重開即可。「重開」是把AVD重新啟動,不是把電腦重新開機 ;-)

應用與討論

歡迎大家上傳你的作品、或是貼圖與大家分享,方式是透過eoeAndroid社群的討論區:

http://www.eoeandroid.com/forumdisplay.php?fid=54

如果有更詳細的Launcher研究心得,或是希望能針對Launcher進行討論,歡迎至eoeAndroid的討論區發文。

讀者留言 (4)

  • UMEC 於 February 4, 2010 12:19:

    3. 由於Launcher都是用Java語法寫成的,所以不會有架構(ARM/x86/...)的問題,編譯後可以取得Launcher.apk;APK套件是不分處理器平臺的

    以上這句話有點問題!雖然apk是不分處理器平臺的,但是Launcher.apk卻比較特別,因為它和framework裡的core核心程式有API相容性的問題,所以這個launcher.apk不見得可以放在不同的平台裡,以上是小小的心得^^

  • 匿名 於 May 28, 2011 12:38:

    launcher 的资料还是这个好 http://www.bangchui.org/thread.php?fid=55

  • 姚子剛 於 September 6, 2013 12:37:

    請教一下,如果我現在需要把一台平板或者手機內建的軟體拿掉後,放入自己需要的程式,爾後只要系統有需要重置的情況,他就能把我之前放入的程式直接建立好,就類似系統重置後基本內建軟體就已經建立好了,我需要了解哪些東西?或者說我該往哪個方向去找尋,謝謝。

  • 李大帥 於 September 16, 2013 18:09:

    果然是各大公司只顧不問的人, 寫這麼弱的文章還 po上來

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。