Android 中Goolgle 相关服务的移植
Android 中Goolgle 相關(guān)服務(wù)的移植
2011年02月24日 19:17:00?xiaofo?閱讀數(shù):4141
?
Google相關(guān)服務(wù)的移植
1.?為什么需要移植?
首先,我編譯了Android2.1的源碼,編譯之后產(chǎn)生out/target/product/generic/。這個(gè)目錄下面放著在目標(biāo)系統(tǒng)上運(yùn)行Android2.1所需要的最基本的運(yùn)行環(huán)境:包括ramdisk.img,system.img,userdata.img(當(dāng)然,還需要prebuilt/android-arm/kerne下面的kernel-qemu)。在設(shè)置環(huán)境變量之后,通過啟動emulator,就可以看到最基本的Android2.1的系統(tǒng)了。
但是,最基本的Android系統(tǒng)中不包括Google提供的特色服務(wù)(包括電子市場,地圖,語音搜索,資訊和天氣,Gmail,GoogleTalk,YouTube),所以就考慮要在目標(biāo)系統(tǒng)上安裝相應(yīng)的特色服務(wù)。
我就通過adb?install,試圖安裝相應(yīng)的服務(wù)程序(.apk文件),但是發(fā)現(xiàn)安裝失敗。打印信息后,發(fā)現(xiàn)原來缺少相應(yīng)的庫和權(quán)限聲明。Android2.1源碼并不包含這些庫文件和權(quán)限聲明。后來,在網(wǎng)站上找到了Google定制手機(jī)的相應(yīng)固件Googlebits
(包含 app etc framework lib幾個(gè)文件夾)
這其中就包含了Google服務(wù)程序的.apk文件,.jar庫,.so庫,.xml權(quán)限聲明。
????我就通過adb?remount獲取system的讀寫權(quán)限,然后adb?push把這些文件直接push到emulator的/system中去,重啟avd。這時(shí),我發(fā)現(xiàn)剛剛push到/system中的文件都沒了。貌似有個(gè)啟動文件在系統(tǒng)啟動時(shí),對/system目錄進(jìn)行了還原。總之,我并不能獲取system的root權(quán)限,沒法進(jìn)行有效的讀寫。
????然后,我就想把這些服務(wù)的.apk,.jar,.so,.xml直接編譯到system.img中去,目標(biāo)系統(tǒng)就可以直接加載這些安裝文件和庫文件。要編譯到system.img中去,就需要對源碼進(jìn)行相應(yīng)的修改,即將Google的特色服務(wù)移植到Android2.1系統(tǒng)中去。
2.?移植的過程
2.1?generic_with_google
在編譯的過程中,默認(rèn)選擇編譯/build/target/product下的generic,所以會生成out/target/product/generic目錄。另外,在/build/target/product目錄下還有一個(gè)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 |
通過這個(gè)mk文件應(yīng)該可以將google特色服務(wù)所需要的安裝文件和庫文件編譯到system.img中。所以,我嘗試著修改了generic_with_google.mk。但是,修過過后在編譯的過程中遇到了很多的問題,例如:系統(tǒng)缺省的generic.mk還是會編譯,并且會與generic_with_google沖突,產(chǎn)生多個(gè)目標(biāo)匹配的問題。貌似這種方法還有待研究。接著我嘗試著另一種方法。
2.2vendor下的代碼定制
這個(gè)我使用了實(shí)驗(yàn)室?guī)熜趾兔兔偷脑趍8上移植Android所定制的vendor/m8的編譯規(guī)則。主要包括四個(gè)mk文件:AndroidBoard.mk,AndroidProducts.mk,BoardConfig.mk,fkh.mk。主要的改動:
將GoogleBits的安裝文件,庫和權(quán)限聲明文件放在vendor/emulator/google目錄下;
在AndroidBoard.mk中添加這些文件的操作:(以Google?Talk為例)
(1)?權(quán)限聲明
| $(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?/ |
這樣在最后產(chǎn)生的目錄下產(chǎn)生system文件夾并打包到system.img中去;
為了查看效果,我把編譯產(chǎn)生的system.img復(fù)制到windows下的android-sdk/platform中去(google的這些特色服務(wù)都需要網(wǎng)絡(luò)的支持,而服務(wù)器上的模擬器無法上網(wǎng)),啟動模擬器,使用adb?shell,發(fā)現(xiàn)這些庫和安裝文件已經(jīng)加載到system目錄下了,移植成功。
2.3自己制作system.img
另一種方法是比較笨的方法,但很實(shí)用。自己嘗試著制作system.img。考慮到system.img是yaffs2文件系統(tǒng),所以可以自己制作。主要使用了sdk中android-7/platform/image/system.img,一個(gè)解壓工具(unyaffs)和一個(gè)打包工具(out/host/linux-x86/bin/mkyaffs2image)。解壓system.img后將googlebits下相應(yīng)的庫,權(quán)限聲明和安裝文件放到對應(yīng)的目錄下,然后打包成system.img。然后將制作后的system.img復(fù)制到sdk中,啟動模擬器,可以使用(這種方法不僅添加了相應(yīng)的庫和安裝文件,還避免了模擬器不能上網(wǎng)的問題)。
?
?
總之,上面三種方法中,自己制作system.img最為簡單快捷。
?
3.?Google?Bits?中安裝文件,權(quán)限聲明和庫文件
?
[c-sharp]?view plain?copy
?
總結(jié)
以上是生活随笔為你收集整理的Android 中Goolgle 相关服务的移植的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端js常用剪贴板(复制粘贴)操作和应用
- 下一篇: PTA乙级1048