Launcher源碼初探

 

最近研究Launcher,總結下。

 

主要涉及3個方面,作爲Launcher源碼研究的入門:

1.源碼的下載;

2.源碼的編譯;

3.結構初探。

 

[下載源碼]
1.下載Msysgit (目前最新的是Git-1.7.4-preview20110204.exe),一路按默認配置安裝;
2.任一地方新建一個目錄(用於儲存下載下來的源碼);
3.點擊目錄右鍵,選擇Git Bash,這是會彈出一個命令輸入框;
4.打開官方源碼下載網站 ,找到你要下載的部分(完全下載的請參考repo的使用,並需要linux系統支持);
5.按照網頁上部的提示,在命令窗口中輸入,這裏以Launcher.git爲例:
  git clone git://android.git.kernel.org/platform/pakages/apps/Launcher.git
*這樣下載到的是最新更新版本的代碼,如果想指定下載某個版本

<
  1.
  git clone git://android.git.kernel.org/ + project path

  2. 進入到下載目錄
  cd <dir>

  3.獲取分支
  git branch

  4.關聯
  git checkout <branch_name> -b <your_branch_name>

  5.同步數據
  git pull
>

<貌似還有點問題,瞭解具體操作的麻煩說聲- -!>
6.等待下載完畢。

-----------------------------------------
參考資料:
Git和Repo掃盲——如何取得Android源代碼

git-clone指定branch
-----------------------------------------

[編譯和運行]
準備工作:
1. 下載好的roject源碼(此處爲Launcher);
2. 編譯好的Android源碼(下文給出編譯好的Launcher相關類庫的下載鏈接)。

 

具體操作:
1.將下載的Project源碼導入Eclipse
新建Android項目,選擇"Create project from existing source",並指定項目的路徑,如下圖:


 
下面的SDK你要根據你下載的Project所支持的Android版本選擇,然後“finish”。

此時你會發現項目是佈滿"紅叉"的:


 
接下來的任務就是去掉這些"紅叉",使項目能順利編譯。

PS:有的Project源碼可能丟失了R.java,可以通過以下方法解決:
第1種方法: 右擊工程->選擇Android Tools->選擇Fix Project Properties
第2種方法: 右擊工程->選擇Properties->選擇 Android->Apply


2.重名包名
爲了避免與系統默認的包名衝突,所以需要進行修改。
在src/com.android.launcher上點擊右鍵,"Refactor" -> "Rename...",名字可以自定義(我這裏改成com.study.launcher),選項如下圖選擇(全選上):


 
點擊"Preview>",進行預覽(途中彈出警告的話,不用管,繼續"Countinue"),這裏要去掉一些不必要的修改,否則就會改亂了。

進入到這麼一個界面:


 
找到以下選項,去掉前面的鉤子:


 

 
點擊"OK",等待處理完畢...

ps:過程中可能會彈出這樣一個錯誤提示,直接"Abort"就好:


 
*結束後可能會彈出這樣的提示框:



 
點“Yes”。


到此第一步操作完畢,但是你會發現"紅叉"依舊,我們接下來繼續處理...

3.導入Android類庫
這個需要一個編譯好的Android源碼所生成的對應的jar包(具體可參考文章"關於使用Eclipse調試Launcher的完美解決方法 ")

這裏 可以下載編譯好的Launcher的classes.jar(其他的Project的話需要你自己來準備了...)。

導入jar,
這裏要注意的是,直接"Add To Library"好像有點問題,我這試了幾次都會導致Eclipse卡着不動了...
另一個測試可行的方法是(原文請參考"Android中如何編譯運行系統自帶桌面Launcher2源碼 "):
1).新建一個User Library
在項目上右鍵,“Build Path” -> “Add Libraries...”,選擇"User Library","Next";

在彈出的新界面,點選右側的"User Libraries",彈出如下界面:


 
點擊"New"創建一個名爲"framework"的庫,然後點選"Add JARs..."指定到classes.jar。

2).添加User Library
確定後,返回如下界面,打上"framework"前面的小勾:


 
點擊"finish"。

調整類庫加載次序,
將"framework"調整到最上(項目右鍵,"Build Path"->"Configure Build Path..."):



 
點擊"OK"返回。

這時再刷新下項目,
"紅叉"一下子消失很多了吧,但是在Launcher.java下還有錯誤。根據情況,將裏面的幾行代碼手動註釋掉即可。
PS:如果還是很多"紅叉",你點進類裏看看,估計就是因爲R.java的包引用問題,將import去掉即可(或者通過組合鍵"ctrl+shift+o"來自動修復類的引用導入)。

*如果發現R.java沒有生成,可以試着將gen/下的目錄刪了,再按上面的方式重新生成。

!!特別注意的是:
網上有些文章介紹說,直接通過自定義變量和手動調用相應的函數來跳過編譯錯誤,該種方法並不可取!因爲這些內部變量在內部可能會在某個地方被賦值的(具體我無從知道),但測試結果告訴我——如果Worksapce.java裏的mScrollX和mScrollY自己來提供的話,會導致滑屏出現問題...所以麻煩點還是搞到編譯好的jar包好。


4.修改AndroidManifest.xml
去掉其中的"android:sharedUserId="android.uid.shared" ":


 
5.編譯,運行
試試編譯,通過了:



 
ps:Project源碼默認沒有指定minSDK,你可以手動設定,避免提示錯誤。

*如果編譯出現問題,請查看LogCat中的提示,一般能快捷地定位到問題

打開模擬器運行看看,
按下"HOME"鍵:


 
啓動我們自己的Launcher,和系統的一模一樣吧~~


 
OK,大功告成!

-----------------------------------------
參考資料:
在Eclipse中調試運行launcher源碼 系列文章
關於使用Eclipse調試Launcher的完美解決方法
Android中如何編譯運行系統自帶桌面Launcher2源碼
-----------------------------------------

[結構研究]



 
*詳細布局情況可以通過SDK_dir/tools/hierarchyviewer.bat進行查看。

整個homescreen是一個包含三個child view的FrameLayout(com.android.launcher.DragLayer)。

第一個child就是桌面com.android.launcher.Workspace。這個桌面又包含三個child。每個child就對應一個桌 面。這就是你在Android上看到的三個桌面。每個桌面上可以放置下列對象:應用快捷方式,appwidget和folder。

第二個child是一個SlidingDrawer控件,這個控件由兩個子控件組成。一個是 com.android.launcher.HandleView,就是Android桌面下方的把手,當點擊這個把手時,另一個子控 件,com.android.launcher.AllAppsGridView就會彈出,這個子控件列出系統中當前安裝的所有類型爲 category.launcher的Activity。

第三個child是com.android.launcher.DeleteZone。當用戶在桌面上長按一個widget時,把手位置就會出現一個垃圾桶形狀的控件,就是這個控件。

在虛擬桌面上可以擺放四種類型的對象:
1. ITEM_SHORTCUT,應用快捷方式
2. ITEM_APPWIDGET,app widget
3. ITEM_LIVE_FOLDER,文件夾
4. ITEM_WALLPAPER,牆紙。

類簡介:
AddAdapter:添加桌面元素的適配器。
AllAppsGridView:Icon列表的的主界面,繼承gridView。
DeleteZone:luancher的刪除區域,繼承ImageView。
DragController:拖動控制接口。
DragLayer:整個launcher的父節點,繼承FrameLayout,實現接口DrayController。
DragSource:拖動源接口,定義了void onDropCompleted(View target, boolean success)。
DropTarget:拖動目標,定義很多拖動過程需要的方法:onDrop,onDragEnter,onDragOver,onDragExit,acceptDrop。
HandleView:launcher抽屜的開關,不過在android2.2已經沒用抽屜了。
Launcher:整個launcher的程序的入口,代碼量最大的一個文件。
Workspace:整個界面layout,幾個窗口就是他下面的子節點。

Launcher中實現了MVC模式(M:launchermode , V:draglayer ,C: launcher),以此爲主線,可以得到 Launcher對各個組件管理的細節(如drag的實現)。

 

最近研究Launcher,總結下。

 

主要涉及3個方面,作爲Launcher源碼研究的入門:

1.源碼的下載;

2.源碼的編譯;

3.結構初探。

 

[下載源碼]
1.下載Msysgit (目前最新的是Git-1.7.4-preview20110204.exe),一路按默認配置安裝;
2.任一地方新建一個目錄(用於儲存下載下來的源碼);
3.點擊目錄右鍵,選擇Git Bash,這是會彈出一個命令輸入框;
4.打開官方源碼下載網站 ,找到你要下載的部分(完全下載的請參考repo的使用,並需要linux系統支持);
5.按照網頁上部的提示,在命令窗口中輸入,這裏以Launcher.git爲例:
  git clone git://android.git.kernel.org/platform/pakages/apps/Launcher.git
*這樣下載到的是最新更新版本的代碼,如果想指定下載某個版本

<
  1.
  git clone git://android.git.kernel.org/ + project path

  2. 進入到下載目錄
  cd <dir>

  3.獲取分支
  git branch

  4.關聯
  git checkout <branch_name> -b <your_branch_name>

  5.同步數據
  git pull
>

<貌似還有點問題,瞭解具體操作的麻煩說聲- -!>
6.等待下載完畢。

-----------------------------------------
參考資料:
Git和Repo掃盲——如何取得Android源代碼

git-clone指定branch
-----------------------------------------

[編譯和運行]
準備工作:
1. 下載好的roject源碼(此處爲Launcher);
2. 編譯好的Android源碼(下文給出編譯好的Launcher相關類庫的下載鏈接)。

 

具體操作:
1.將下載的Project源碼導入Eclipse
新建Android項目,選擇"Create project from existing source",並指定項目的路徑,如下圖:


 
下面的SDK你要根據你下載的Project所支持的Android版本選擇,然後“finish”。

此時你會發現項目是佈滿"紅叉"的:


 
接下來的任務就是去掉這些"紅叉",使項目能順利編譯。

PS:有的Project源碼可能丟失了R.java,可以通過以下方法解決:
第1種方法: 右擊工程->選擇Android Tools->選擇Fix Project Properties
第2種方法: 右擊工程->選擇Properties->選擇 Android->Apply


2.重名包名
爲了避免與系統默認的包名衝突,所以需要進行修改。
在src/com.android.launcher上點擊右鍵,"Refactor" -> "Rename...",名字可以自定義(我這裏改成com.study.launcher),選項如下圖選擇(全選上):


 
點擊"Preview>",進行預覽(途中彈出警告的話,不用管,繼續"Countinue"),這裏要去掉一些不必要的修改,否則就會改亂了。

進入到這麼一個界面:


 
找到以下選項,去掉前面的鉤子:


 

 
點擊"OK",等待處理完畢...

ps:過程中可能會彈出這樣一個錯誤提示,直接"Abort"就好:


 
*結束後可能會彈出這樣的提示框:



 
點“Yes”。


到此第一步操作完畢,但是你會發現"紅叉"依舊,我們接下來繼續處理...

3.導入Android類庫
這個需要一個編譯好的Android源碼所生成的對應的jar包(具體可參考文章"關於使用Eclipse調試Launcher的完美解決方法 ")

這裏 可以下載編譯好的Launcher的classes.jar(其他的Project的話需要你自己來準備了...)。

導入jar,
這裏要注意的是,直接"Add To Library"好像有點問題,我這試了幾次都會導致Eclipse卡着不動了...
另一個測試可行的方法是(原文請參考"Android中如何編譯運行系統自帶桌面Launcher2源碼 "):
1).新建一個User Library
在項目上右鍵,“Build Path” -> “Add Libraries...”,選擇"User Library","Next";

在彈出的新界面,點選右側的"User Libraries",彈出如下界面:


 
點擊"New"創建一個名爲"framework"的庫,然後點選"Add JARs..."指定到classes.jar。

2).添加User Library
確定後,返回如下界面,打上"framework"前面的小勾:


 
點擊"finish"。

調整類庫加載次序,
將"framework"調整到最上(項目右鍵,"Build Path"->"Configure Build Path..."):



 
點擊"OK"返回。

這時再刷新下項目,
"紅叉"一下子消失很多了吧,但是在Launcher.java下還有錯誤。根據情況,將裏面的幾行代碼手動註釋掉即可。
PS:如果還是很多"紅叉",你點進類裏看看,估計就是因爲R.java的包引用問題,將import去掉即可(或者通過組合鍵"ctrl+shift+o"來自動修復類的引用導入)。

*如果發現R.java沒有生成,可以試着將gen/下的目錄刪了,再按上面的方式重新生成。

!!特別注意的是:
網上有些文章介紹說,直接通過自定義變量和手動調用相應的函數來跳過編譯錯誤,該種方法並不可取!因爲這些內部變量在內部可能會在某個地方被賦值的(具體我無從知道),但測試結果告訴我——如果Worksapce.java裏的mScrollX和mScrollY自己來提供的話,會導致滑屏出現問題...所以麻煩點還是搞到編譯好的jar包好。


4.修改AndroidManifest.xml
去掉其中的"android:sharedUserId="android.uid.shared" ":


 
5.編譯,運行
試試編譯,通過了:



 
ps:Project源碼默認沒有指定minSDK,你可以手動設定,避免提示錯誤。

*如果編譯出現問題,請查看LogCat中的提示,一般能快捷地定位到問題

打開模擬器運行看看,
按下"HOME"鍵:


 
啓動我們自己的Launcher,和系統的一模一樣吧~~


 
OK,大功告成!

-----------------------------------------
參考資料:
在Eclipse中調試運行launcher源碼 系列文章
關於使用Eclipse調試Launcher的完美解決方法
Android中如何編譯運行系統自帶桌面Launcher2源碼
-----------------------------------------

[結構研究]



 
*詳細布局情況可以通過SDK_dir/tools/hierarchyviewer.bat進行查看。

整個homescreen是一個包含三個child view的FrameLayout(com.android.launcher.DragLayer)。

第一個child就是桌面com.android.launcher.Workspace。這個桌面又包含三個child。每個child就對應一個桌 面。這就是你在Android上看到的三個桌面。每個桌面上可以放置下列對象:應用快捷方式,appwidget和folder。

第二個child是一個SlidingDrawer控件,這個控件由兩個子控件組成。一個是 com.android.launcher.HandleView,就是Android桌面下方的把手,當點擊這個把手時,另一個子控 件,com.android.launcher.AllAppsGridView就會彈出,這個子控件列出系統中當前安裝的所有類型爲 category.launcher的Activity。

第三個child是com.android.launcher.DeleteZone。當用戶在桌面上長按一個widget時,把手位置就會出現一個垃圾桶形狀的控件,就是這個控件。

在虛擬桌面上可以擺放四種類型的對象:
1. ITEM_SHORTCUT,應用快捷方式
2. ITEM_APPWIDGET,app widget
3. ITEM_LIVE_FOLDER,文件夾
4. ITEM_WALLPAPER,牆紙。

類簡介:
AddAdapter:添加桌面元素的適配器。
AllAppsGridView:Icon列表的的主界面,繼承gridView。
DeleteZone:luancher的刪除區域,繼承ImageView。
DragController:拖動控制接口。
DragLayer:整個launcher的父節點,繼承FrameLayout,實現接口DrayController。
DragSource:拖動源接口,定義了void onDropCompleted(View target, boolean success)。
DropTarget:拖動目標,定義很多拖動過程需要的方法:onDrop,onDragEnter,onDragOver,onDragExit,acceptDrop。
HandleView:launcher抽屜的開關,不過在android2.2已經沒用抽屜了。
Launcher:整個launcher的程序的入口,代碼量最大的一個文件。
Workspace:整個界面layout,幾個窗口就是他下面的子節點。

Launcher中實現了MVC模式(M:launchermode , V:draglayer ,C: launcher),以此爲主線,可以得到 Launcher對各個組件管理的細節(如drag的實現)。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章