Google相關服務的移植1. 為什麼需要移植?
首先,我編譯了Android2.1的源碼,編譯之後產生out/target/product/generic/。這個目錄下面放著在目標系統上運行Android2.1所需要的最基本的運行環境:包括ramdisk.img,system.img,userdata.img(當然,還需要prebuilt/android-arm/kerne下面的kernel-qemu)。在設定環境變數之後,通過啟動emulator,就可以看到最基本的Android2.1的系統了。
但是,最基本的Android系統中不包括Google提供的特色服務(包括電子市場,地圖,語音搜尋,資訊和天氣,Gmail,GoogleTalk,YouTube),所以就考慮要在目標系統上安裝相應的特色服務。
我就通過adb install,試圖安裝相應的服務程式(.apk檔案),但是發現安裝失敗。列印資訊後,發現原來缺少相應的庫和許可權聲明。Android2.1源碼並不包含這些庫檔案和許可權聲明。後來,在網站上找到了Google定製手機的相應韌體Googlebits
(包含 app etc framework lib幾個檔案夾)
這其中就包含了Google服務程式的.apk檔案,.jar庫,.so庫,.xml許可權聲明。
我就通過adb remount擷取system的讀寫權限,然後adb push把這些檔案直接push到emulator的/system中去,重啟avd。這時,我發現剛剛push到/system中的檔案都沒了。貌似有個開機檔案在系統啟動時,對/system目錄進行了還原。總之,我並不能擷取system的root許可權,沒法進行有效讀寫。
然後,我就想把這些服務的.apk,.jar,.so,.xml直接編譯到system.img中去,目標系統就可以直接載入這些安裝檔案和庫檔案。要編譯到system.img中去,就需要對源碼進行相應的修改,即將Google的特色服務移植到Android2.1系統中去。
2. 移植的過程
2.1 generic_with_google
在編譯的過程中,預設選擇編譯/build/target/product下的generic,所以會產生out/target/product/generic目錄。另外,在/build/target/product目錄下還有一個generic_with_google.mk:
# This is a generic product that isn't specialized for a specific device. # It includes the base Android platform including some Google-specific features. # If you do not want to include Google specific features, you should derive # from generic.mk |
通過這個mk檔案應該可以將google特色服務所需要的安裝檔案和庫檔案編譯到system.img中。所以,我嘗試著修改了generic_with_google.mk。但是,修過過後在編譯的過程中遇到了很多的問題,例如:系統預設的generic.mk還是會編譯,並且會與generic_with_google衝突,產生多個目標匹配的問題。貌似這種方法還有待研究。接著我嘗試著另一種方法。
2.2vendor下的代碼定製
這個我使用了實驗室師兄和猛猛的在m8上移植Android所定製的vendor/m8的編譯規則。主要包括四個mk檔案:AndroidBoard.mk,AndroidProducts.mk,BoardConfig.mk,fkh.mk。主要的改動:
將GoogleBits的安裝檔案,庫和許可權聲明檔案放在vendor/emulator/google目錄下;
在AndroidBoard.mk中添加這些檔案的操作:(以Google Talk為例)
(1) 許可權聲明
$(LOCAL_PATH)/google/etc/permissions/com.google.android.gtalkservice.xml:system/etc/permissions/com.google.android.gtalkservice.xml / |
(2) 安裝檔案
(3) .jar庫檔案
$(LOCAL_PATH)/google/app/gtalkservice.apk:system/app/gtalkservice.apk / |
(4) .so庫檔案
$(LOCAL_PATH)/google/framework/com.google.android.maps.jar:system/framework/com.google.android.maps.jar / |
這樣在最後產生的目錄下產生system檔案夾並打包到system.img中去;
為了查看效果,我把編譯產生的system.img複製到windows下的android-sdk/platform中去(google的這些特色服務都需要網路的支援,而伺服器上的模擬器無法上網),啟動模擬器,使用adb shell,發現這些庫和安裝檔案已經載入到system目錄下了,移植成功。
2.3自己製作system.img
另一種方法是比較笨的方法,但很實用。自己嘗試著製作system.img。考慮到system.img是yaffs2檔案系統,所以可以自己製作。主要使用了sdk中android-7/platform/image/system.img,一個解壓工具(unyaffs)和一個打包工具(out/host/linux-x86/bin/mkyaffs2image)。解壓system.img後將googlebits下相應的庫,許可權聲明和安裝檔案放到對應的目錄下,然後打包成system.img。然後將製作後的system.img複製到sdk中,啟動模擬器,可以使用(這種方法不僅添加了相應的庫和安裝檔案,還避免了模擬器不能上網的問題)。
總之,上面三種方法中,自己製作system.img最為簡單快捷。
3. Google Bits 中安裝檔案,許可權聲明和庫檔案
||--app<br /> |-EnhancedGoogleSearchProvider: Google搜尋引擎增強服務,安裝後將在設定(settings)的搜尋設定(search)中獲得更多關於搜尋引擎的服務<br /> |-GenieWidget: 根據地區下載不同語言的新聞和天氣<br /> |-Gmail:Gmail電子郵箱服務<br /> |-GmailProvider:電子郵箱的資料存放區服務<br />|-GoogleApps:Google公司專屬應用程式套件,類似office,支援WEB、POP3、SMTP、IMAP4、WAP收發郵件,還提供即時通訊、日曆、線上文檔、網站等全面服務<br />|-GoogleBackupTransport:可能是資料備份後,可以線上傳輸到網上,然後實現資料的儲存(與Android的backup服務相關)<br />|-GoogleCheckin:google簽入服務<br />|-GoogleContactsSyncAdapter:Google連絡人/通訊錄同步服務(連絡人的匯入和匯出)<br />|-GooglePartnerSetup:Google協作程式安裝嚮導(估計與賬戶的設定相關)<br />|-GoogleSearch:Google的搜尋服務,可以刪除的,不影響其他的搜尋功能<br />|-GoogleSettingsProvider:程式設定資料存放區服務<br />|-GoogleSubscribedFeedsProvider:Google資料同步服務<br />|-gtalkservice:gtalk服務<br />|-Maps:Google地圖<br />|-MarketUpdater:軟體管理服務(負責更新電子市場的程式)<br />|-MediaUploader:Google的媒體資料上傳服務<br />|-NetworkLocation:Google的網路定位服務<br />|-SetupWizard:手機設定嚮導(第一次安裝後出現的畫面)<br />|-Street:Google的街景視圖服務<br />|-Talk:Google Talk 服務(不建議卸載)<br />|-TalkProvider:Talk服務的支撐程式,估計與資料存放區相關<br />|-TtsService:TTS(Text To Speech)文本到語音的服務<br />|-Vending:Android Market(電子市場)<br />|-VoiceSearchWithKeyboard:語音輸進功能(通過語音鍵盤輸入,如果語速不快,基本可以準確判斷)<br />|-YouTube:手機“優酷”(世界最大的視頻分享網站YouTube)<br />||--etc<br /> |-permissons<br /> |-com.google.android.datamessaging.xml:(貌似不需要)<br /> |-com.google.android.gtalkservice.xml:對於framewokr/gtalk.jar的許可權聲明<br /> |-com.google.android.maps.xml:對於frameword/maps.jar的許可權聲明<br />||--framework<br /> |-com.google.android.gtalkservice.jar:支援gtalk的api的源檔案編譯產生<br /> |-com.google.android.maps.jar:支援maps的api的源檔案編譯產生<br />||--lib<br /> |-libgtalk_jni.so:支援gtalk的動態連結程式庫<br />|-libspeech.so:支援語音搜尋和語音撥號相關動態連結程式庫