Android 中Goolgle 相关服务的移植[转]
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?中安裝文件,權限聲明和庫文件
?
view plaincopy to clipboardprint??
總結
以上是生活随笔為你收集整理的Android 中Goolgle 相关服务的移植[转]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FPGA开发板
- 下一篇: 1048 习题4-4 三个整数求最大值