在這里,我嘗試了一把將百度云的A820一直到風(fēng)華2(GN708W的4.1)上,雖然風(fēng)華2已經(jīng)有4.2的包。但是大家可以看到風(fēng)華2的4.2的包相對(duì)于4.1,也只是更新了boot和system兩個(gè)分區(qū)。
如果對(duì)于百度云ROM拼包移植不熟悉的,可以先看一下刷機(jī)大師論壇發(fā)布的MTK6577的教程:
http://bbs.mgyun.com/thread-22686-1-1.html
里面有講如何修改boot.img、build.prop以及提前開啟adb(這個(gè)對(duì)于調(diào)試很重要)等等
之前MTK6577的移植教程里有說明的,這里就不再重復(fù)介紹了。這里主要講述在拼包過程中遇到的問題的解決辦法!
GN708W移植教程及問題
先簡(jiǎn)單講一下我拼GN708W的幾個(gè)步驟及遇到的一些問題:
1、 解壓A820的ota包:
去百度云ROM官網(wǎng)上下載A820最新的ota包,然后解壓目錄ota-rom-34
2、 加入GN708W的驅(qū)動(dòng)和硬件強(qiáng)相關(guān)文件:
將以下目錄的所有文件拷貝到ota-rom-34對(duì)應(yīng)的目錄
/system/etc/firmware/*
/system/etc/permissions/*
/system/etc/mddb/*
/system/lib/hw/*
/system/lib/modules/*
/system/vendor/*
3、 參照MTK6577的教程去掉updater-script里面的機(jī)型校驗(yàn),然后打一個(gè)zip包,就可以開始用recovery刷入了。刷入之后,首先需要關(guān)注adb是否能夠正常使用。然后就看影響起機(jī)的關(guān)鍵進(jìn)程了。后面會(huì)進(jìn)行更詳細(xì)的介紹。
4、 遇到過一個(gè)不能起機(jī)的問題,是因?yàn)闆]有/data/app-lib目錄導(dǎo)致,這個(gè)是4.1和4.2的差異。4.2需要在init.rc中創(chuàng)建/data/app-lib目錄,因而將A820上的這個(gè)修改弄過來就可以了。
5、 這里遇到過前置攝像頭不能用的問題,在將/system/lib/libcam*所有的so庫(kù)用GN708W的之后就可以解決了。還有一個(gè)閃光燈不能用的問題,反編譯了BaiduGallery3D.apk(當(dāng)然得先去掉odex),然后修改了一些smali代碼做到的。已經(jīng)跟官方項(xiàng)目組的聯(lián)系,ROM-35會(huì)去掉一些強(qiáng)依賴,到時(shí)候就可以不修改smali代碼了。
6、 還有一個(gè)默認(rèn)存儲(chǔ)卡的問題,修改了init.rc,是參照A820的修改的,在init.rc的最后幾段。
關(guān)鍵進(jìn)程啟動(dòng)失敗的處理關(guān)鍵進(jìn)程
往往在拼包完之后,發(fā)現(xiàn)不能起機(jī),這個(gè)時(shí)候需要看以下的關(guān)鍵進(jìn)程是否都起來了(用adb shell ps查看):
當(dāng)然具體什么進(jìn)程能影響不能起機(jī),關(guān)鍵還的看init.rc的配置,不同的機(jī)型可能會(huì)有差別。如果這些進(jìn)程都正常起來了,系統(tǒng)還是不能起機(jī),這個(gè)時(shí)候你需要對(duì)比一下原生起來的進(jìn)程跟你的有什么差異了,是不是比你的要多一些進(jìn)程!
關(guān)鍵進(jìn)程啟動(dòng)失敗的處理方法
如果有進(jìn)程不能正常起機(jī),或者你發(fā)現(xiàn)它的進(jìn)程id不停地在變化,說明這個(gè)進(jìn)程是有問題的!
解決辦法:
adb shell后,手動(dòng)執(zhí)行進(jìn)程,看有什么錯(cuò)誤。
比如surfaceflinger沒有起來,執(zhí)行以下命令:
adb shell
surfaceflinger
1、 缺少so庫(kù):
比如我手動(dòng)刪掉了libcamdrv.so庫(kù),然后在adb shell之后運(yùn)行mediaserver,就會(huì)出現(xiàn)如下信息:
soinfo_link_image(linker.cpp:1635):could not load library "libmediaplayerservice.so" needed by "mediaserver";caused by soinfo_link_image(linker.cpp:1635): could not load library"libstagefright.so" needed by "libmediaplayerservice.so";caused by soinfo_link_image(linker.cpp:1635): could not load library"libskia.so" needed by "libstagefright.so"; caused bysoinfo_link_image(linker.cpp:1635): could not load library"libmhalImageCodec.so" needed by "libskia.so"; caused bysoinfo_link_image(linker.cpp:1635): could not load library"libJpgDecPipe.so" needed by "libmhalImageCodec.so"; causedby soinfo_link_image(linker.cpp:1635): could not load library"libcamdrv.so" needed by "libJpgDecPipe.so"; caused byload_library(linker.cpp:745): library "libcamdrv.so" nCANNOT LINKEXECUTABLE
這種信息需要從后面往前看,可以很輕松地看出是找不到libcamdrv.so庫(kù)。
2、缺少函數(shù):
少函數(shù)的提示信息跟缺少so庫(kù)的類似,你也只需要從后面往前看,找到對(duì)應(yīng)的函數(shù)名稱,然后去grep,找到對(duì)應(yīng)的so,然后push進(jìn)去。當(dāng)然C++的函數(shù)名比較長(zhǎng),不過沒有關(guān)系,一樣可以搜索出來的。
3、 段錯(cuò)誤(Segmentationfault):
當(dāng)你手動(dòng)運(yùn)行某個(gè)進(jìn)程,出現(xiàn)“Segmentationfault”的提示,或者用adb logcat看到有一堆DEBUG的log時(shí),則表示有段錯(cuò)誤!
比如,有一下DEBUG的log,下面是其中的backtrace片段:
這里是程序的調(diào)用的so庫(kù)的堆棧,可以看到最后的段錯(cuò)誤發(fā)生在libcamdrv.so,這個(gè)時(shí)候,你嘗試著將libcamdrv.so進(jìn)行替換。如果不行,再換下一個(gè),即camera.default.so,依次類推。
這個(gè)時(shí)候你會(huì)看到一些提示,比如so庫(kù)啊,或者少函數(shù)。如果是少so庫(kù),去百度的或者官方的找一個(gè)就是了。如果是少函數(shù),去grep一下,看哪個(gè)so庫(kù)有這個(gè)函數(shù),然后將這個(gè)so換進(jìn)去!哈哈~~~實(shí)在不行,把錯(cuò)誤日志貼到百度去搜索一下!
注意事項(xiàng):
有些進(jìn)程起來是需要帶參數(shù)的,比如在init.rc中看到有這樣一段:
servicegsm0710muxd /system/bin/gsm0710muxd -s /dev/ttyC0 -f 512 -n 8 -m basic
說明gsm07010muxd這個(gè)進(jìn)程是運(yùn)行的/system/bin/gsm0710muxd文件,并且?guī)в袇?shù)“-s/dev/ttyC0 -f 512 -n 8 -m basic”
所以在這種情況下,你要跑gsm07010muxd進(jìn)程,就得在adbshell之后輸入:
/system/bin/gsm0710muxd-s /dev/ttyC0 -f 512 -n 8 -m basic
當(dāng)然,由于/system/bin已經(jīng)加到PATH里面,你不輸入/system/bin/也是可以跑gsm0710muxd的。
怎樣利用objdump看文件的依賴關(guān)系:
在解決某些問題的時(shí)候,需要知道so庫(kù)或者bin之間的依賴關(guān)系,有些是動(dòng)態(tài)加載的,是沒有辦法直接看到的。但是通過鏈接的so庫(kù)都可以看到的。
可以用objdump命令查看,具體方法如下:
比如我想看surfaceflinger這個(gè)bin依賴哪些so庫(kù),則可以:
輸入:objdump -x surfaceflinger |grep NEEDED
輸出:
NEEDED libsurfaceflinger.so
NEEDED libbinder.so
NEEDED liblog.so
NEEDED libutils.so
NEEDED libc.so
NEEDED libstdc++.so
NEEDED libm.so
你就會(huì)知道surfaceflinger依賴于上面這些so庫(kù)了,當(dāng)然你如果想知道libsurfaceflinger.so依賴于哪些so庫(kù),這種方法同樣是可以用的!objdump -x libsurfaceflinger.so | grep NEEDED
然后嘗試去替換一下,哈哈~~~
adb不能用,怎樣抓取日志:
有些開發(fā)者可能覺得修改boot.img提前開啟adbd比較麻煩,下面我將教大家一種方法,怎樣在adb不能用的時(shí)候,抓取日志!
一般而言,android都會(huì)起動(dòng)一個(gè)install-recovery.sh的服務(wù),所以你只需要在/system/etc/install-recovery.sh里面增加輸出日志的,不就可以了嘛!
如果有install-recovery.sh,則追加上以下語句:
logcat –v time >> /sdcard/log
如果沒有install-recovery.sh,則新建一個(gè),需要有執(zhí)行權(quán)限哦!內(nèi)容如下:
#!/system/bin/sh
logcat –v time >> /sdcard/log
在系統(tǒng)運(yùn)行之后,把你的sdcard拿出來,就可以看到日志了。當(dāng)然,如果你的手機(jī)還不能識(shí)別sdcard,你就只能放到/data/local/tmp,然后進(jìn)到recovery去手動(dòng)mount /data分區(qū)拿出來了!