1. 程式人生 > >Lenovo k860i 移植Android 4.4 cm11進度記錄【上篇已完結】

Lenovo k860i 移植Android 4.4 cm11進度記錄【上篇已完結】

2014.5.16

為了驗證一下下載的CM11的原始碼有沒有問題,決定編譯一下cm官方支援的機器,手上正好有臺nexus7 2012,就拿它為例測試一下在mac os x平臺的整個編譯過程。

1.
最開始,是在os x下面搭編譯環境,以前有說過的,詳見xda這個帖子。
http://forum.xda-developers.com/showthread.php?t=2510898

這個wiki裡面寫的是在linux下面編譯n7的方法,還是比較詳細的,建議先通讀一下,對於在os x下搭編譯環境也是很有指導意義的。
http://wiki.cyanogenmod.org/w/Build_for_grouper

2.
repo sync完cm11所有的原始碼之後,還需要拖device的檔案以及核心原始碼。按照官方wiki的說法,直接用breakfast grouper它就會自動從github上面拉所有需要的東西,但實測可能是網路原因這裡行不通,所以只能手動拖了,這裡只需要拖n7的device部分和kernel source部分。

從cm的官方github頁面 https://github.com/cyanogenmod 搜尋裝置代號,這裡就是grouper(nexus7 2012的代號),有兩個結果:android_kernel_asus_grouper和android_device_asus_grouper。點進去把這兩個專案git clone下來,或者直接用頁面右下方的Download ZIP下載焉。

3.
把上面的device和kernel下載下來之後要放對位置,cd 到cm11的原始碼樹的根目錄,我這裡是/Volumes/cm/cm11。
mkdir -p device/asus/grouper
mkdir -p kernel/asus/grouper

再把剛才下載的device和kernel解壓並放到上面新建的兩個目錄裡面。
就可以按照官方的編譯方法envsetup.sh->breakfast grouper->croot->brunch grouper -j4編譯了。

4.
[20:22:34]   GEN     /Volumes/cm/cm11/out/target/product/grouper/obj/KERNEL_OBJ/Makefile
[20:22:35]   SHIPPED scripts/kconfig/zconf.tab.c
[20:22:35]   HOSTCC  scripts/kconfig/zconf.tab.o
[20:22:35] scripts/kconfig/zconf.tab.c:200:10: fatal error: 'zconf.hash.c' file not found
[20:22:35] #include "zconf.hash.c"
[20:22:35]          ^
[20:22:36] host StaticLib: libclangFrontendTool (/Volumes/cm/cm11/out/host/darwin-x86/obj/STATIC_LIBRARIES/libclangFrontendTool_intermediates/libclangFrontendTool.a)
[20:22:36] 1 error generated.
[20:22:36] make[3]: *** [scripts/kconfig/zconf.tab.o] Error 1
[20:22:36] make[2]: *** [cyanogenmod_grouper_defconfig] Error 2
[20:22:36] make[1]: *** [sub-make] Error 2
[20:22:36] make: *** [/Volumes/cm/cm11/out/target/product/grouper/obj/KERNEL_OBJ/.config] Error 2
[20:22:36] make: *** Waiting for unfinished jobs....

在核心目錄不要自己手動用make或make uImage編譯核心,它會干擾到編譯整個程式碼樹導致報錯。如果之前有這麼做過,可以通過刪除out/target/product/grouper/obj/KERNEL_OBJ整個資料夾,並在核心目錄裡面make mrproper一下來重新clean掉核心原始碼目錄。同時建議在核心的原始碼目錄在brunch之前就make mrproper一下。

上面這個錯誤就是由於kernel目錄不乾淨導致的,刪除out裡面的KERNEL_OBJ和make mrproper之後不再報錯,並不需要像網上說的那樣make clobber清掉整個out目錄。

5.
[20:08:14] /bin/sh: /bin/false: No such file or directory

這個看起來像是找不到/bin/false這個程式導致的,在os x的終端裡which false一下,發現位置是/usr/bin/false,這就好辦,直接ln -s一個到/bin目錄即可。
ln -s /usr/bin/false /bin/false

6.
[23:08:58] 警告: [options] 未與 -source 1.5 一起設定引導類路徑
[23:09:06] external/doclava/src/com/google/doclava/ClassInfo.java:20: 錯誤: 程式包com.sun.javadoc不存在
[23:09:06] import com.sun.javadoc.ClassDoc;
[23:09:06]                       ^
[23:09:07] external/doclava/src/com/google/doclava/ClassInfo.java:61: 錯誤: 找不到符號
[23:09:07]   public ClassInfo(ClassDoc cl, String rawCommentText, SourcePositionInfo position,
[23:09:07]                    ^
[23:09:07]   符號:   類 ClassDoc
[23:09:07]   位置: 類 ClassInfo

在os x平臺編譯cm的話jdk必須要有1.6版的,可以只有1.6,也可以1.6、1.7共存,但不能只有1.7,上面的報錯就是因為只有jdk1.7導致的。
蘋果官方在jdk6下載地址: http://support.apple.com/kb/DL1572?viewlocale=zh_CN

7.
[00:33:30]   Kernel: arch/arm/boot/zImage is ready
[00:33:30]   UIMAGE  arch/arm/boot/uImage
[00:33:30] "mkimage" command not found - U-Boot images will not be built
[00:33:30] make[3]: *** [arch/arm/boot/uImage] Error 1
[00:33:30] make[2]: *** [uImage] Error 2
[00:33:30] make[1]: *** [sub-make] Error 2
[00:33:30] make: *** [TARGET_KERNEL_BINARIES] Error 2
[00:33:30] make: *** Waiting for unfinished jobs....

找不到mkimage這個程式,去下載一個uboot的原始碼:ftp://ftp.denx.de/pub/u-boot/u-boot-2012.10.tar.bz2。
解壓,並進入,make tools -j4編譯一下uboot tools,半分鐘就可以完成,在tools目錄下面把mkimage拷到系統任何一個PATH目錄裡面即可。

或者也可以用brew安裝:brew install u-boot-tools,不過我這邊沒速度,於是就手動下載原始碼自己編譯一個mkimage出來了。

8.
整個編譯過程大概需要2小時左右,配置是i5 2300,16G記憶體,硬碟是2.5的5400rpm,可以根據CPU效能自行判斷,看到下面的最後一句,Package Complete,就說明全部編譯完成了。

[22:26:16] using device-specific extensions in device/asus/grouper
[22:26:36] building image from target_files BOOT...
[22:26:36]   running:  mkbootfs -f /var/folders/8_/kgjn7sms2mz3vn_psjgt2mlc0000gn/T/targetfiles-0EEWjX/META/boot_filesystem_config.txt /var/folders/8_/kgjn7sms2mz3vn_psjgt2mlc0000gn/T/targetfiles-0EEWjX/BOOT/RAMDISK
[22:26:36]   running:  minigzip
[22:26:36]   running:  mkbootimg --kernel /var/folders/8_/kgjn7sms2mz3vn_psjgt2mlc0000gn/T/targetfiles-0EEWjX/BOOT/kernel --ramdisk /var/folders/8_/kgjn7sms2mz3vn_psjgt2mlc0000gn/T/tmpnm2TAe --output /var/folders/8_/kgjn7sms2mz3vn_psjgt2mlc0000gn/T/tmpNzgBUc
[22:26:37] no bootloader.raw in target_files; skipping install
[22:26:37]   running:  openssl pkcs8 -in build/target/product/security/testkey.pk8 -inform DER -nocrypt
[22:26:37]   running:  java -Xmx2048m -jar /Volumes/cm/cm11/out/host/darwin-x86/framework/signapk.jar -w build/target/product/security/testkey.x509.pem build/target/product/security/testkey.pk8 /var/folders/8_/kgjn7sms2mz3vn_psjgt2mlc0000gn/T/tmp_RfPg5 /Volumes/cm/cm11/out/target/product/grouper/cm_grouper-ota-f0d0985f7a.zip
[22:27:08] done.
[22:27:09] Package Complete: /Volumes/cm/cm11/out/target/product/grouper/cm-11-20140516-UNOFFICIAL-grouper.zip



--------------------------------------------------------------------------------------------
2014.5.14

有好長一段時間沒寫進度日誌了,期間主機板又因為記憶體識別的問題給返修了,好在最終還是弄好了。不過起碼到現在為止還是沒有放棄ki的cm11,如果哪天實在是做不下去了,肯定會說明的。

最近沒有什麼進展,倒是弄好了一個TWRP,這個recovery功能是比較強大的,不過現在還是有點小問題,還在完善中,等到時候完善的差不多了就發出來。

折騰這麼久之後發現原來在mac下面編譯android需要很多要注意的地方,比如說最重要的一個就是設定 export BUILD_MAC_SDK_EXPERIMENTAL=1 這個環境變數,之前我就是在設定這個環境變數之前就開始編譯,但是從來都沒有Make clobber過,所以導致了一堆錯誤,2號的第一個錯誤就是由於這個沒設定才會出現,而由於我亂改了HOST_darwin-x86.mk這個makefile,這又導致了後面非常多的找不到標頭檔案的問題。

XDA上面有一篇關於介紹在os x 10.9 mavericks配置andorid的編譯環境的帖子:
http://forum.xda-developers.com/showthread.php?t=2510898

按照上面的帖子配置之後,如果之前make/mka/lunch/brunch過,一定要make clobber一下,再重新breakfast/lunch/mka/brunch。由於之前的疏忽,導致花費了大量的時間在毫無意義的地方,然後2號的進度裡面的1、6、7都不會再出現錯誤。。。


繼續錯誤解決方法:

1.
[10:02:11] bootable/recovery/minui/../../../device/lenovo/stuttgart/recovery/griphics.c:208:5: error: conflicting types for 'gr_text'
[10:02:11] In file included from bootable/recovery/minui/../../../device/lenovo/stuttgart/recovery/griphics.c:39:0:
[10:02:11] bootable/recovery/minui/minui.h:36:5: note: previous declaration of 'gr_text' was here
[10:02:11] make: *** [/Volumes/cm/cm11/out/target/product/stuttgart/obj/STATIC_LIBRARIES/libminui_intermediates/../../../device/lenovo/stuttgart/recovery/griphics.o] Error 1
[10:02:11] make: *** Waiting for unfinished jobs....

按scue的說明檔案,device/lenovo/stuttgart/recovery/Readme.md,在這個recovery目錄裡面執行:

cp -v ../overlay/bootable/recovery/bootloader.c ../../../../bootable/recovery/bootloader.c

即用device裡面的overlay/bootable/recovery/bootloader.c 替換核心樹中的 bootable/recovery/bootloader.c,替換之後不再報錯。
不過在替換完檔案之後,在修完下一個錯誤之後,這個錯誤又出現了。。。。。

仔細看了下報錯資訊,發現是有個重定義,開啟bootable/recovery/minui/minui.h,第36行有一個函式的宣告,是這樣的:
int gr_text(int x, int y, const char *s, int bold);

再開啟device/lenovo/stuttgart/recovery/griphics.c這個檔案,第208行有這個函式:
int gr_text(int x, int y, const char *s)

宣告和函式定義不一樣,引數個數不一樣多,於是直接把minui.h這個檔案裡面的函式宣告註釋掉,即可繼續編譯。

另外吐槽一下,scue貌似把檔名都拼錯了,griphics.c,應該是graphics.c才對。。。。。


2.
[17:03:04] target thumb C: recovery <= bootable/recovery/install.c
[17:03:04] bootable/recovery/bootloader.c: In function 'get_bootloader_message_mtd':
[17:03:04] bootable/recovery/bootloader.c:77:60: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:79:43: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:85:49: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:92:60: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c: In function 'set_bootloader_message_mtd':
[17:03:04] bootable/recovery/bootloader.c:103:60: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:105:43: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:111:49: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:118:60: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:126:49: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:130:50: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:135:51: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c: In function 'get_bootloader_message_block':
[17:03:04] bootable/recovery/bootloader.c:167:22: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:168:22: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:170:49: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:176:43: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:181:53: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:185:53: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c: In function 'set_bootloader_message_block':
[17:03:04] bootable/recovery/bootloader.c:194:22: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:195:22: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:197:49: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:202:43: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:208:53: error: 'Volume' has no member named 'device'
[17:03:04] bootable/recovery/bootloader.c:212:53: error: 'Volume' has no member named 'device'
[17:03:04] make: *** [/Volumes/cm/cm11/out/target/product/stuttgart/obj/EXECUTABLES/recovery_intermediates/bootloader.o] Error 1
[17:03:04] make: *** Waiting for unfinished jobs....

出錯的檔案是剛剛(上一個錯誤)從scue的device裡面拷過去的bootloader.c,看了下檔案,發現是變數名寫錯了,把上面錯誤涉及到的所有的變數device都改成blk_device即可繼續編譯。


3.
[18:18:49] target thumb C++: libnbaio <= frameworks/av/media/libnbaio/NBAIO.cpp
[18:18:49] frameworks/av/media/libnbaio/AudioStreamOutSink.cpp: In member function 'virtual android::status_t android::AudioStreamOutSink::getTimestamp(AudioTimestamp&)':
[18:18:49] frameworks/av/media/libnbaio/AudioStreamOutSink.cpp:88:18: error: 'struct audio_stream_out' has no member named 'get_presentation_position'
[18:18:49] frameworks/av/media/libnbaio/AudioStreamOutSink.cpp:93:23: error: 'struct audio_stream_out' has no member named 'get_presentation_position'
[18:18:49] make: *** [/Volumes/cm/cm11/out/target/product/stuttgart/obj/SHARED_LIBRARIES/libnbaio_intermediates/AudioStreamOutSink.o] Error 1
[18:18:49] make: *** Waiting for unfinished jobs....

把88-90三行,和93-96行註釋掉,即可繼續編譯。
這個問題看起來是和音訊部分相關的,這個方法很有可能是治標不治本。


4.
[19:30:44] target thumb C++: libaudioflinger <= frameworks/av/services/audioflinger/Effects.cpp
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp: In member function 'void android::AudioFlinger::PlaybackThread::readOutputParameters()':
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp:1742:31: error: 'audio_stream_out_t' has no member named 'set_callback'
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp:1743:30: error: 'audio_stream_out_t' has no member named 'set_callback'
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp: In member function 'virtual void android::AudioFlinger::PlaybackThread::threadLoop_drain()':
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp:2037:26: error: 'audio_stream_out_t' has no member named 'drain'
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp:2046:26: error: 'audio_stream_out_t' has no member named 'drain'
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp: In member function 'android::status_t android::AudioFlinger::PlaybackThread::getTimestamp_l(AudioTimestamp&)':
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp:2582:46: error: 'audio_stream_out_t' has no member named 'get_presentation_position'
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp:2584:36: error: 'audio_stream_out_t' has no member named 'get_presentation_position'
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp: In member function 'virtual android::AudioFlinger::PlaybackThread::mixer_state android::AudioFlinger::OffloadThread::prepareTracks_l(android::Vector<android::sp<android::AudioFlinger::PlaybackThread::Track> >*)':
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp:4328:26: error: 'audio_stream_out_t' has no member named 'pause'
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp:4336:26: error: 'audio_stream_out_t' has no member named 'resume'
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp: In member function 'void android::AudioFlinger::OffloadThread::flushHw_l()':
[19:30:44] frameworks/av/services/audioflinger/Threads.cpp:4380:22: error: 'audio_stream_out_t' has no member named 'flush'
[19:30:44] make: *** [/Volumes/cm/cm11/out/target/product/stuttgart/obj/SHARED_LIBRARIES/libaudioflinger_intermediates/Threads.o] Error 1
[19:30:44] make: *** Waiting for unfinished jobs....

又是一個和音訊部分想著的錯誤,這個錯誤一直沒有解決,至今還卡著,所以暫且先放一放。




後面準備給k860i編譯一個TWRP的recovery,其實omni rom的原始碼樹就是自帶了TWRP,所以直接把omni rom的bootable/recovery git clone下來替換cm11的bootable/recovery就可以了。

不過編譯twrp之前需要配置好device,找了下教程,大概只需要配一下device/lenovo/stuttgart/BoardConfig.mk這個就可以,貌似最簡單的就只要在這檔案裡面加一行就可以了:
DEVICE_RESOLUTION := 720x1280

然後就是開始編譯的過程:
. build/envsetup.sh
breakfast stuttgart
make -j4 recoveryimage

這個過程看機器效能需要的時間也不相同,一般編譯recovery都不會出什麼錯。之前我在筆記本的虛擬機器ubuntu裡面花了1小時2分鐘,後面在臺機的os x上編譯,只花了26分鐘就完成了,這效能差距也太大了。

不過這個recovery還有些問題,先說在ubuntu下面編譯的recovery.img。這個recovery.img用fastboot flash recovery recovery.img刷進去之後,第一次進rec完全正常,功能也正常(當然螢幕滅了之後不能喚醒,是因為把電源鍵的鍵位定義錯了,當然還沒有測試過刷一個zip包)。但是奇怪的問題發生了,在rec狀態下接上電腦用adb shell進去,不能reboot,或者直接用adb reboot也不行,但是直接在twrp裡面點reboot按鈕是可以重啟的。最詭異的是,只要從這個rec重啟了,不管是再次進rec或者是直接進系統,都是直接卡第一屏死掉了,看了下串列埠的核心日誌,居然提示找不到核心,這也太奇怪了。後面刷了szb包的別的rec,就可以正常進系統了。暫還沒明白到底是什麼原因導致的,需要看一下如何解決。

而在os x上編譯的時候,雖然是通過了編譯,最終也生成了recovery.img,但是卻無法啟動進去TWRP,看了下串列埠核心日誌,一直提示這個找不到,無法執行當然就進不到Rec的圖形介面了。
[22:59:34] [   20.376399] init: cannot execve('/sbin/recovery'): Exec format error
[22:59:39] [   25.393742] init: cannot execve('/sbin/recovery'): Exec format error
[22:59:44] [   30.410832] init: cannot execve('/sbin/recovery'): Exec format error
[22:59:49] [   35.424186] init: cannot execve('/sbin/recovery'): Exec format error

再仔細看了下os x上編譯twrp的日誌,在快要編譯完成的時候出現了一些錯誤:
[22:49:39] sed: RE error: illegal byte sequence
[22:49:39] cp -fr bootable/recovery/gui/devices/720x1280/res/* /Volumes/cm/cm11/out/target/product/stuttgart/recovery/root/res/
[22:49:39] sed: RE error: illegal byte sequence
[22:49:39] sed: RE error: illegal byte sequence
[22:49:39] sed: RE error: illegal byte sequence
一直提示sed的RE錯誤,有可能是這個造成的,還需要找下原因。因為按理說在os x和linux上編譯android也好,編譯recovery也好,應該都是沒什麼區別的,所以還是更有可能是os x在一些檔案上出了點問題,版本不對?引數不對?都有可能。



--------------------------------------------------------------------------------------------
2014.5.2
臺機又出問題了,上次是CPU都報錯了,不知道是不是換回來的主機板有問題,不過當然我把主機板從機箱裡面拆出來的時候,它又自己好了,但是更蛋疼的問題出來了,16G記憶體在BIOS的SPD裡面能全部看到是4*4G,但是它死活只認8G,網上搜了下說這個華碩主機板的通病,只認一半記憶體,只能去售後重新用程式設計器刷BIOS,因為使用者自己刷的BIOS有些區域是刷不了的,也就是不徹底。看來下週又要去ASUS售後找他們好好理論理論了。

不過好在雖然臺機現在裸奔了,而且只能用8G記憶體,但起碼能正常使用了不是,所以趁著五一放假,好好來弄一下cm11的移植了。因為前面已經測試過核心能正常編譯,所以現在要正式開始cm11的移植過程了。之前看過cm的官方wiki的移植的文件,大概也都看了下,肯定是料到會有很多問題出現,所以我覺得整個移植的過程就是一個個fix error的過程,把這個error都fix完了,cm11也就編譯出來了,先暫且不說能不能用,能用的前提是要能編譯出來東西。之前有考慮轉到ubuntu裡面去做,不過個人認為os x實在是用著很舒服,而且在xda上也有很多人成功移植kitkat,所以就更堅定了我不轉到ubuntu的決心,雖然可能在os x下面編譯會有各種各樣蛋碎的error。以後的進度日誌的更新應該絕大多數都會是我在os x下面編譯cm11解決問題的過程和方法了。

OK, Let's Rock'n'Roll !

在OS X下面做編譯想著的東西是一定要安裝xcoda的,我這裡是安裝的Xcode 5.1,下載的dmg,掛載dmg後把xcode.app扔到/Application裡面去。

到scue的github把他做的device檔案拖下來,scue真是給k860i的機油做了很多貢獻啊,簡直就是造福廣大機油,在此特別感謝。把scue的device檔案放到device/lenovo/stuttgart裡面去,我這裡用的是楓大的vibe 1412的zip卡刷包作system檔案,所以把這個zip解壓出來,按照scue的README,把解出來的system資料夾ln -s符號連結到device/lenovo/stuttgart/tmp/system這個地方。

. build/envsetup.sh
breakfast stuttgart
./extract-files.sh

extract-files.sh會先列印proprietary-files.txt裡面的內容,再從符號連結的system目錄裡面拉這裡定義的檔案,因為scue在寫這個proprietary的時候ROM版本肯定是和現在的ROM的system資料夾裡面的內容不一樣的,所以難免有些檔案不存在,所以在編譯之前就要對照一下proprietary-files.txt裡面的內容和符號連結過來的system資料夾裡面的內容,把proprietary-files.txt裡面有而符號連結的system裡面沒有的那些行刪掉,不然到下面開始編譯之後肯定會報錯,提示找不到相應的rule to make。

修改完proprietary-files.txt之後,要重新./extract-files.sh,它會把一些檔案複製到 /Volumes/cm/cm11/vendor/lenovo/stuttgart/proprietary 這裡去。

當編譯過程中遇到有錯誤,想完全重新編譯的時候,可以把out/target/product/stuttgart這個目錄刪掉即可。


錯誤解決方法:

1.
[19:18:14] zhufengs-iMac:cm11 zhufeng$ breakfast stuttgart
[19:18:14] including vendor/cm/vendorsetup.sh
[19:18:19] build/core/combo/HOST_darwin-x86.mk:68: *****************************************************
[19:18:19] build/core/combo/HOST_darwin-x86.mk:69: * Can not find SDK  at /Developer/SDKs/MacOSX.sdk
[19:18:19] build/core/combo/HOST_darwin-x86.mk:70: *****************************************************
[19:18:19] build/core/combo/HOST_darwin-x86.mk:71: *** Stop..  Stop.

修改 /Volumnes/cm/cm11/build/core/combo/HOST_darwin-x86.mk ,把第62行註釋掉,即:
# mac_sdk_root := $(mac_sdk_path)/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(mac_sdk_version).sdk

改成:
mac_sdk_version := 10.9
mac_sdk_root := /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX$(mac_sdk_version).sdk

注意這兩個變數的定義順序一定不能弄反了,要先定義mac_sdk_version再定義mac_sdk_root,不然還是會報錯。

出這個錯的原因是makefile找不到Xcode自帶的MacOSX 10.9的SDK目錄,看了下檔案裡面定義也沒有問題,不知道怎麼就是找不到,於是乾脆給它定義死了,就不會再報這個錯了。


2.
[21:59:23] /Volumes/cm/cm11/out/target/product/stuttgart/obj/APPS/SignatureTest_intermediates
[21:59:51] find: src: No such file or directory
[21:59:57] osc_opensource/device/lenovo/stuttgart_row/multimedia/codecs/exynos_codecs/video/Android.mk:5: osc_opensource/device/lenovo/stuttgart_row/multimedia/codecs/exynos_codecs/video/exynos4/Android.mk: No such file or directory
[21:59:57] build/core/base_rules.mk:134: *** osc_opensource/device/lenovo/stuttgart_row/multimedia/codecs/sec_codecs/video/exynos4/mfc: MODULE.TARGET.STATIC_LIBRARIES.libsecmfcapi already defined by osc_opensource/device/lenovo/stuttgart/multimedia/codecs/sec_codecs/video/exynos4/mfc.  Stop.

出現這個錯誤是因為我把之前聯想放出來的原始碼解壓在了cm11的程式碼樹裡面,android build系統會掃描目錄下面所有的Android.mk檔案,這兩個暫時是不需要的,被它掃描到了,也編譯了,結果有些檔案放的位置不對,所以報錯。直接把osc_opensource這個目錄移出cm11程式碼樹即可。


3.
[22:01:54] No private recovery resources for TARGET_DEVICE stuttgart
[22:01:54] build/core/tasks/kernel.mk:44: *** "Please set BOARD_KERNEL_IMAGE_NAME to uImage".  Stop.

這個錯誤,看了下build/core/tasks/kernel.mk,它不再推薦使用預編譯好的核心,但核心已經編譯好了,所以就直接用了。直接在終端裡面 export BOARD_KERNEL_IMAGE_NAME=uImage 即可解決此問題。


4.
[22:33:31] Notice file: external/zlib/NOTICE -- /Volumes/cm/cm11/out/target/product/stuttgart/obj/NOTICE_FILES/src//system/lib/libz.so.txt
[22:33:31] make: *** No rule to make target `vendor/lenovo/stuttgart/proprietary/lib/libcamera_client.so', needed by `/Volumes/cm/cm11/out/target/product/stuttgart/system/lib/libcamera_client.so'.  Stop.
[22:33:31] make: *** Waiting for unfinished jobs....

這個問題就是由於上面說到的proprietary-files.txt裡面定義的的檔案和符號連結到的system裡面的檔案不匹配造成的,如果不把proprietary-files.txt裡面定義了而tmp/system裡面沒有的項全部刪掉,它還會報各種No rule to make target。所以只能檢查proprietary-files.txt,把它裡面有而tmp/system裡面沒有的專案全部刪掉,重新招待extract-files.sh。


5.
[01:31:59] Export includes file: external/libsepol/Android.mk -- /Volumes/cm/cm11/out/host/darwin-x86/obj/SHARED_LIBRARIES/libsepol_intermediates/export_includes
[01:31:59] make: *** No rule to make target `device/lenovo/stuttgart/preload/preload.img', needed by `/Volumes/cm/cm11/out/target/product/stuttgart/obj/NONE/preload_intermediates/preload.img'.  Stop.
[01:31:59] make: *** Waiting for unfinished jobs....

這個又是由於少了makefile,編譯不了device/lenovo/stuttgart/preload/preload.img,這個檔案是scue做的gms包和聯想超級相機用的,在做cm11初期暫時可以不用管這個。看了下明明有Android.mk檔案,不知道為什麼就是提示找不到,既然如此,直接把Android.mk重新命名成_Android.mk,讓它不編譯這個得了。


6.
[02:35:00] host C: mkbootimg <= system/core/mkbootimg/mkbootimg.c
[02:35:00] host C: libmincrypt <= system/core/libmincrypt/dsa_sig.c
[02:35:00] host C: libmincrypt <= system/core/libmincrypt/p256.c
[02:35:00] host C: libmincrypt <= system/core/libmincrypt/p256_ec.c
[02:35:00] cc1: error: unrecognized command line option "-arch"
[02:35:00] cc1: error: unrecognized command line option "-Wno-nested-anon-types"
[02:35:00] make: *** [/Volumes/cm/cm11/out/host/darwin-x86/obj/STATIC_LIBRARIES/libmincrypt_intermediates/p256.o] Error 1
[02:35:00] make: *** Waiting for unfinished jobs....
[02:35:01] cc1: error: unrecognized command line option "-arch"
[02:35:01] cc1: error: unrecognized command line option "-Wno-nested-anon-types"
[02:35:01] make: *** [/Volumes/cm/cm11/out/host/darwin-x86/obj/STATIC_LIBRARIES/libmincrypt_intermediates/p256_ec.o] Error 1
[02:35:01] make: *** [/Volumes/cm/cm11/out/host/darwin-x86/obj/STATIC_LIBRARIES/libmincrypt_intermediates/dsa_sig.o] Error 1
[02:35:01] make: *** [/Volumes/cm/cm11/out/host/darwin-x86/obj/EXECUTABLES/mkbootimg_intermediates/mkbootimg.o] Error 1

這個問題困擾了我很久,網上找了很多帖子都是說要安裝Apple提供的gcc,但是我都安裝了Xcode了肯定自帶了gcc啊,而且還有人說是隻支援Xcode 4.2。google 這個識別不了的命令列選項-Wno-nested-anon-types的時候只找到了幾個關於LLVM的錯誤修正,居然是給的補丁要重新編譯LLVM,這明顯不可行。

既然網上找不到方法,就只能自己解決了。分析一下,既然說這個選項不存在,那這個選項是在哪裡定義的呢?肯定是在makefile裡面嘛,能影響整個編譯過程的的makefile有哪幾個呢?第一個肯定是想到 /Volumnes/cm/cm11/build/core/combo/HOST_darwin-x86.mk 這個了,開啟一看,果然,第90行是這樣的:

HOST_GLOBAL_CFLAGS += -I$(mac_sdk_root)/usr/include/c++/4.2.1 -arch i386 -Wno-nested-anon-types -Wno-unused-parameter

果然是定義了-arch 和-Wno-nested-anon-types 這兩個引數,嘗試直接把它們幹掉。
把上面一行復製出來,再註釋掉(用作備份,如果出問題要能改回去),把那兩個引數刪掉,就變成了這樣:

HOST_GLOBAL_CFLAGS += -I$(mac_sdk_root)/usr/include/c++/4.2.1  -Wno-unused-parameter

修改過後重新編譯,問題解決。


7.
[03:02:20] host C: libhost <= build/libs/host/CopyFile.c
[03:02:20] host C: mkbootfs <= system/core/cpio/mkbootfs.c
[03:02:20] host C: checkpolicy <= external/checkpolicy/queue.c
[03:02:20] system/core/cpio/mkbootfs.c:12:20: error: stdarg.h: No such file or directory
[03:02:20] system/core/cpio/mkbootfs.c: In function 'die':
[03:02:20] system/core/cpio/mkbootfs.c:30: warning: implicit declaration of function 'va_start'

居然提示找不到標頭檔案stdarg.h,這個貌似是C標準庫的裡面的標頭檔案了,自己隨便寫了個hello world的c,include這個stdarg.h,沒報錯啊,這是為何呢?看來這個編譯系統在初始化環境變數的時候可能出了點問題。根據以往的經驗,但凡是找不到標頭檔案,一般都已經包含在了cm11的核心程式碼樹的某個資料夾裡面了,比如說上次的elf.h,其實也在cm11的程式碼樹裡面有。這次這個,在程式碼樹的根目錄,用du -a | grep stdarg.h,同樣可以找到,它位於:

zhufengs-iMac:cm11 zhufeng$ du -a | grep stdarg
8    ./external/clang/lib/Headers/stdarg.h
8    ./external/connectivity/stlport/stlport/cstdarg
8    ./external/connectivity/stlport/stlport/stdarg.h
8    ./external/connectivity/stlport/stlport/stl/_cstdarg.h

第一個就是,那麼找到了標頭檔案要把它放到哪裡去呢?又去 /Volumnes/cm/cm11/build/core/combo/HOST_darwin-x86.mk 這裡面找了找,有如下的定義:

ifeq ($(mac_sdk_version),10.9)
# HOST_GLOBAL_CFLAGS += -I$(mac_sdk_root)/usr/include/c++/4.2.1 -arch i386 -Wno-nested-anon-types -Wno-unused-parameter
HOST_GLOBAL_CFLAGS += -I$(mac_sdk_root)/usr/include/c++/4.2.1  -Wno-unused-parameter
HOST_GLOBAL_LDFLAGS += -Wl,-arch,i386,-lstdc++

不錯,就是剛才第6個錯誤的時候受影響的那一行,include目錄定義的很明顯了,去 /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include 裡面找一下,果然是沒有stdarg.h這個標頭檔案,既然這樣,那把上面找到的stdarg.h弄過來就好了。直接用符號連結 ln -s 鏈過來,重新編譯之後不再報錯。



--------------------------------------------------------------------------------------------
2014.4.27
這兩天開始在os x下面嘗試編譯核心,cm的原始碼包裡面提供了linux和darwin也就是os x的交叉編譯工具鏈,版本有4.6的4.7兩個。最終編譯出來的zImage再做成boot.img是可以用的,串列埠列印的日誌如下:
[23:51:39] Starting kernel ...
[23:51:39]
[23:51:39] Uncompressing Linux... done, booting the kernel.
[23:51:41] [ 0.000000] Initializing cgroup subsys cpu
[23:51:41] [ 0.000000] Linux version 3.0.15 (
[email protected]
) (gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #1 SMP PREEMPT Sat Apr 26 01:17:25 CST 2014

[23:51:41] [ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d
[23:51:41] [ 0.000000] Machine: STUTTGART
[23:51:41] [ 0.000000] CPU EXYNOS4412 (id 0xe4412220)
[23:51:41] [ 0.000000] S3C24XX Clocks, Copyright 2004 Simtec Electronics
[23:51:41] [ 0.000000] s3c_register_clksrc: clock audiocdclk has no registers set

但是在os x下面配置好環境變數之後,直接make -j4會出現一系列問題,現一一列舉出來。

1.
[01:10:24] CC scripts/mod/empty.o
[01:10:24] HOSTCC scripts/mod/mk_elfconfig
[01:10:24] scripts/mod/mk_elfconfig.c:4:10: fatal error: 'elf.h' file not found
[01:10:24] #include <elf.h>
[01:10:24] ^
[01:10:24] 1 error generated.
[01:10:24] make[2]: *** [scripts/mod/mk_elfconfig] Error 1
[01:10:24] make[1]: *** [scripts/mod] Error 2
[01:10:24] make: *** [scripts] Error 2

這個問題是由於os x的系統include路徑裡面少了一個elf.h這個檔案,到 http://www.rockbox.org/tracker/9006?getfile=16683 這個地方,把裡面的內容儲存成elf.h,放到核心原始碼的scripts/mod/下面即可。

2.
[01:11:49] HOSTCC scripts/mod/mk_elfconfig
[01:11:49] scripts/mod/mk_elfconfig.c:4:10: error: 'elf.h' file not found with <angled> include; use "quotes" instead
[01:11:49] #include <elf.h>
[01:11:49] ^~~~~~~
[01:11:49] "elf.h"
[01:11:49] 1 error generated.
[01:11:49] make[2]: *** [scripts/mod/mk_elfconfig] Error 1
[01:11:49] make[1]: *** [scripts/mod] Error 2
[01:11:49] make[1]: *** Waiting for unfinished jobs....

這個問題是elf.h之前是因為在系統include庫裡面,現在放到了scripts/mod下面,編譯.c檔案的時候定義elf.h的時候有問題,想必會c的人都知道#include <elf.h>和#include "elf.h" 的區別吧。把scripts/mod下面的mk_elfconfig.c,modpost.h這兩個檔案,開頭前幾行的#include <elf.h>改成#include "elf.h"。

3.
[03:05:36] CC drivers/media/video/samsung/ump_r3p2/common/ump_kernel_common.o
[03:05:36] arm-eabi-gcc: error: Revision:: No such file or directory
[03:05:36] arm-eabi-gcc: error: Unversioned: No such file or directory
[03:05:36] arm-eabi-gcc: error: directory: No such file or directory
[03:05:36] arm-eabi-gcc: error: Revision:: No such file or directory
[03:05:36] arm-eabi-gcc: error: Unversioned: No such file or directory
[03:05:36] arm-eabi-gcc: error: directory": No such file or directory
[03:05:36] make[5]: *** [drivers/media/video/samsung/ump_r3p2/common/ump_kernel_common.o] Error 1
[03:05:36] make[4]: *** [drivers/media/video/samsung/ump_r3p2] Error 2
[03:05:36] make[4]: *** Waiting for unfinished jobs....

這個就是昨天出現的問題,今天終於是把它解決了。google了一下,發現可能是由於 drivers/media/video/samsung/ump_r3p2/Makefine.common 這個檔案裡面定義的一個變數 SVN_REV 引起的,具體的兩行程式碼是:

 # Get subversion revision number, fall back to 0000 if no svn info is available
SVN_REV:=$(shell ((svnversion | grep -qv exported && echo -n 'Revision: ' && svnversion) || git svn info | sed -e 's/$$$$/M/' |   grep '^Revision: ' || echo ${MALI_RELEASE_NAME}) 2>/dev/null | sed -e 's/^Revision: //')

後面按照網上給的方法,把SVN_REV這一行直接給註釋掉,儲存之後再編譯還是報一樣的錯。來分析一下原因,把這個變數後面的這一行命令直接分別在os x和ubuntu的終端裡面執行,看輸出的結果有什麼不一樣。發現在linux裡面是沒有svnversion這個程式的,所以編譯過程就會直接跳過,而os x裡面自帶了這個svnversion這個程式,但是命令的輸出結果並不對,有可能是Linux的程式和os x的程式的命令列引數不太一樣,輸出的結果就不對,然後就引起了報錯。但是有可能由於其它的makefile也引用到了svnversion這個程式,所以即使註釋掉了那一個makefile,其它的還不知道有多少個Makefile引用到了這個SVN_REV的變數,所以想到乾脆直接把svnversion這個東西弄掉。果然,把它重新命名成svnverson-bak之後,後面的編譯就很順利,沒有再報什麼錯了。命令如下:

[01:08:23] zhufengs-iMac:kernel zhufeng$ sudo mv /usr/bin/svnversion /usr/bin/svnversion-bak

因為現在的黑蘋果是裝在臺機上的,i5 2300 + 16G的記憶體,所以編譯直接速度真的是很快啊,日誌如下:

[01:13:50] zhufengs-iMac:kernel zhufeng$ make -j4
[01:13:52] CHK include/linux/version.h
[01:13:52] CHK include/generated/utsrelease.h
......
[01:17:39] AS arch/arm/boot/compressed/piggy.gzip.o
[01:17:39] LD arch/arm/boot/compressed/vmlinux
[01:17:39] OBJCOPY arch/arm/boot/zImage
[01:17:39] Kernel: arch/arm/boot/zImage is ready

從開始編譯的時間和結束的時間看,編譯一個k860i的核心原始碼,竟然只要四分鐘不到!以前在i5 一代筆記本CPU的虛擬機器上,編譯這個核心至少用了十多分鐘,差距實在是太大了,多核真是編譯東西的利器啊!

另外,在測試核心的時候還發現了一個更為嚴重的問題,上次說到把自編譯的核心fastboot flash boot boot.img之後無法進入桌面,之前幾天是推測說/init.rc這個檔案有問題,但後面在啟動的時候偶然抓了一下adb logcat,發現一直在重複這幾行:

I/SurfaceFlinger( 1356): SurfaceFlinger is starting
I/SurfaceFlinger( 1356): SurfaceFlinger's main thread ready to run. Initializing graphics H/W...
D/libEGL ( 1356): loaded /system/lib/egl/libEGL_mali.so
D/libEGL ( 1356): loaded /system/lib/egl/libGLESv1_CM_mali.so
D/libEGL ( 1356): loaded /system/lib/egl/libGLESv2_mali.so
E/ ( 1356): ERROR in Mali driver:
E/ ( 1356): * Device driver API mismatch
E/ ( 1356): * Device driver API version: 20
E/ ( 1356): * User space API version: 17
E/ ( 1356): mali: REVISION=Linux-r3p1-01rel1 BUILD_DATE=Tue Jul 2 15:06:24 KST 2013

W/libEGL ( 1356): eglInitialize(0x1) failed (EGL_BAD_ALLOC)

Mali driver就是Mali驅動,只要有點主流嵌入式SOC的硬體常識都會知道,k860i用的soc是三星的Exynos 4412,它內建的顯示卡就是Mali 400。這正是核心顯示卡驅動和使用者空間的驅動版本不匹配引起的,當然驅動就不能正確載入了,很明顯顯示卡驅動都沒有載入的話,核心載入完之後是肯定進不到桌面的。之所以之前沒有想到是這個原因,是因為這種型別的日誌不是核心日誌,不可能列印在串列埠的核心日誌輸出裡面,而之前測試的時候正好又沒有抓adb logcat,所以就忽略了。我估計以後正式開始cm11的時候,這個問題肯定還會再出現,現在還沒有想到什麼好的解決辦法,網上搜了下也沒有什麼好的建議,到時候再看吧。



--------------------------------------------------------------------------------------------
2014.4.25
有幾天沒更新進度了,其實這幾天一直都在弄桌上型電腦的事情。華碩返修個主機板給我返了一個多星期,起因是上次我自己不小心把CPU插座弄斷了幾根針,然後就杯具了。因為過保了,所以說是換插座要100塊,也只能給了。不過我在去取的時候很是意外,本來是P8H67M-PRO,給我換了塊P8P67M-PRO,從價格上來說是比H67要貴的,外圍介面什麼的也多了不少,功能應該也是會更多,但是沒有了顯示卡輸出介面,而且再加上板子也看起來是全新的,所以我也就收了,最後售後還說給我帶來不便再給了三個月的保。這就得要買顯示卡了啊,P67不能用集顯,糾結了很久,終於決定買一塊索泰的GTX650,679塊,這麼一來整個電腦基本上全換掉了。換了主機板之後,用win7自帶的評分,顯示卡的兩部分升到了7.3,7.3,現在最低的就硬碟了,5.9分,這下整一塊SSD就基本上就都7.5了。好吧,這電腦又可以再戰三年。。

在換了新主機板之後,整了個黑蘋果,其實最主要的是換了顯示卡的功勞,之前的i5 2300的集顯hd2000在黑蘋果下面驅動不起來,開不了QE/CI。基本上現在弄的黑蘋果已經達到90%的完美程度了,網絡卡音效卡顯示卡都驅動起來了,USB3.0介面還有點問題,AHCI和RAID的問題也解決了。本著不折騰不舒服斯基的原則,不出意外的話k860i的CM11的接下來的部分工作會在os x上完成,就是不知道能不能進行下去。

把之前下載的CM11和核心的原始碼都放到os x下面了,環境變數也都弄好了,使用cm11原始碼裡面帶的arm-eabi-gcc 4.6 for darwin交叉編譯器嘗試編譯核心,除去前幾天出現過的smc 0的報錯之外,開始出現新的錯誤,報錯是這樣的:
[03:05:36] CC drivers/media/video/samsung/ump_r3p2/common/ump_kernel_common.o
[03:05:36] arm-eabi-gcc: error: Revision:: No such file or directory
[03:05:36] arm-eabi-gcc: error: Unversioned: No such file or directory
[03:05:36] arm-eabi-gcc: error: directory: No such file or directory
[03:05:36] arm-eabi-gcc: error: Revision:: No such file or directory
[03:05:36] arm-eabi-gcc: error: Unversioned: No such file or directory
[03:05:36] arm-eabi-gcc: error: directory": No such file or directory
[03:05:36] make[5]: *** [drivers/media/video/samsung/ump_r3p2/common/ump_kernel_common.o] Error 1
[03:05:36] make[4]: *** [drivers/media/video/samsung/ump_r3p2] Error 2
[03:05:36] make[4]: *** Waiting for unfinished jobs....

網上搜了下這個錯誤可能是由於makefile和makefile.common裡面的SVN_REV變數的設定問題,後面修改之後還是報一樣的錯,有可能是和mac裡面的svn版本和linux裡面版本不一樣造成的。接下來的時間會繼續嘗試把mac平臺的編譯錯誤盡力解決掉,如果實在不行,到時候那就只能重新在臺機上裝一個linux了。

好吧,放一張黑蘋果的截圖,小得瑟一下~~





--------------------------------------------------------------------------------------------
2014.4.21
主機板終於要返修回來了,真是操蛋,用了一個多星期,而且華碩官方的售後點、居然不代理廣州和深圳之外的其它區的貨,這尼瑪是在鬧哪樣,全國聯保就一句空話麼?下班之後去取回來,換了個CPU插座,100塊,晚上還得把臺機裝起來。用筆記本編譯實在是太慢了,臺機裝好之後應該會好很多,起碼編譯時間會減半。

在CM的wiki看了下Android的編譯方法,看起來比我想象中的要複雜的多,還需要消化一下,各種變數飛來飛去,要找到些規律才能繼續下去,所以這幾天估計都會在看這個了。把scue的github上的cm10.1的device的程式碼都拖下來了,應該會有很大的用處。



--------------------------------------------------------------------------------------------
2014.4.20
關於boot.img的核心檔案不能啟動的問題,google了一下,看到了這個帖子 http://blog.csdn.net/wh_19910525/article/details/8200372 。原來這個boot.img跟普通linux發行版本的核心檔案有點不一樣,它把zImage,ramdisk,啟動引數等等這些東西都打包到一起去了。按照上面的那篇部落格的方法,用mkbootimg和unpackbootimg可以實現打包和解包boot.img,於是準備嘗試一下把自己編譯的zImage打包成boot.img刷進去看看能不能用。

[00:59:35] [email protected]:/home/cm/cm11/osc_opensource/kernel/arch/arm/boot/bootimg/unpack$ ./unpackbootimg -i boot.img.tj.2.9 -o out
[00:59:36] BOARD_KERNEL_CMDLINE console=ttySAC3,115200 androidboot.hardware=stuttgart
[00:59:36] BOARD_KERNEL_BASE 10000000
[00:59:36] BOARD_PAGE_SIZE 2048
[01:02:06] [email protected]:/home/cm/cm11/osc_opensource/kernel/arch/arm/boot/bootimg/unpack/out$ cat *base *line *size
[01:02:06] 10000000
[01:02:06] console=ttySAC3,115200 androidboot.hardware=stuttgart
[01:02:06] 2048
[01:02:30] [email protected]:/home/cm/cm11/osc_opensource/kernel/arch/arm/boot/bootimg/unpack/out$ ../mkbootimg --cmdline 'console=ttySAC3,115200 androidboot.hardware=stuttgart' --kernel boot.img.tj.2.9-zImage --ramdisk boot.img.tj.2.9-ramdisk.gz -o boot.img

先把現在用的這個ROM的boot.img解壓出來,把解出來的核心檔案用我自己編譯的zImage替換,ramdisk和cmdline不變,再重新生成boot.img,刷到現有的ROM包裡面去,終於能啟動了,而不是昨天直接刷zImage直接到uboot命令列介面。不過雖然沒有再卡lenovo logo,不過卻進不到桌面,看了下串列埠列印的核心日誌,看到了下面這幾行。估計就是這個原因導致的了,/init.rc->/init.stuttgart.rc這個檔案是初始化圖形的配置檔案,這個檔案有錯,自然就會出問題,這個我想只要移植過ARM開發板linux核心的人都明白,是個非常典型的錯誤。

[01:20:52] [ 5.100215] lirx +++in tty_release, ttySAC3+++
[01:20:52] [ 5.110046] lirx +++out tty_release, ttySAC3+++
[01:20:52] [ 5.113912] init: parse config file: /init.rc
[01:20:52] [ 5.119235] init: /init.stuttgart.rc: 190: invalid command '//'
[01:20:52] [ 5.123717] init: /init.stuttgart.rc: 191: invalid command '//'
[01:20:52] [ 5.129590] init: /init.stuttgart.rc: 192: invalid command '//'
[01:20:52] [ 5.135787] init (1): /proc/1/oom_adj is deprecated, please use /proc/1/oom_score_adj instead.

後面找了群裡的朋友“凌亂人生”幫忙在vibe rom上面fastboot刷了核心做測試,終於可以進到桌面了,有圖有真相,這個核心就是我自己編譯的,看編譯者和編譯時間一眼就能看的出來。哈哈,核心暫時應該沒什麼問題了,不過最近一直都是在做核心測試,真正CM11的程式碼部分都還沒開始呢,可以想象以後肯定會有越來越多各種亂七八糟的問題出來,只能慢慢來了。好吧,下午出去逛逛太古匯,連續弄了好幾天了,稍微休息下,晚上回來正式開始CM11程式碼部分。



下午去電腦城經朋友介紹買了個二手硬碟,西數2.5寸 500G 5400轉藍盤,看通電時間1800小時,150塊,價格還算可以了,幾乎是新的半價,給筆記本裝上,安裝上了ubuntu 14.04 x64,現在就差把之前虛擬機器裡面程式碼移到硬碟上去。不過鬱悶的是,虛擬機器的vmdk檔案在ubuntu裡面無法掛載,真悲催,這樣就只能重新解壓原始碼了,但是操蛋的網路晚上又各種渣, repo sync之後各種連線被重置,哎,算了,等明天把程式碼拖下來再繼續吧。也已經連續好幾天晚上兩三點才睡了,今天要早點睡了,明天還要上班。



--------------------------------------------------------------------------------------------

2014.4.19
因為臺機主機板還沒返修回來 ,所以就只能在虛擬機器裡面繼續編譯。ubuntu 14.04 x64已經正式釋出,只是那塊硬碟實在已經裝不上系統了,各種IO讀取錯誤,無奈只能繼續等臺機主機板返修回來再說了。

不過今天還是有不少的進展。下午去買了兩副耳機,為了做耳機除錯線,花了我二十大洋,聽了之後發現這音質也就只值三四塊錢。好在之前在學校的時候拿了幾根杜邦線和一個USB轉TTL的小板子,還沒想到居然還真派上用場了。立馬剪掉耳機和杜邦線,打火機燒一下,接起來,耳機那邊有四根線,只需要GND和RXD,最後還是給試出來了,耳機除錯線就OK了。這下這手機就跟開發一樣了啊,直接列印輸出串列埠的核心日誌,看了下,核心日誌確實對核心的除錯是有極大的幫助的,開機直接就是啟動到uboot介面,不過因為沒有接TXD到TTL上面,所以在uboot介面無法 按任意鍵停止自動載入FLASH上面的核心 。

藉助於耳機除錯線,終於是發現為什麼上次用fastboot boot zImage刷進去的核心不能用了,這自己編譯的核心是能啟動的,下面放幾條列印的核心日誌:
[20:21:06] Starting kernel ...
[20:21:06]
[20:21:07] Uncompressing Linux... done, booting the kernel.
[20:21:08] [ 0.000000] Initializing cgroup subsys cpu
[20:21:08] [ 0.000000] Linux version 3.0.15 ([email protected]) (gcc version 4.6.x-google 20120106 (prerelease) (GCC) ) #3 SMP PREEMPT Fri Apr 18 12:00:44 CST 2014
[20:21:08] [ 0.000000] CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=10c5387d
[20:21:08] [ 0.000000] CPU: VIPT nonaliasing data cache, VIPT aliasing instruction cache
[20:21:08] [ 0.000000] Machine: STUTTGART
[20:21:08] [ 0.000000] ####get g_lcd_nova=1#####
[20:21:08] [ 0.000000] Memory policy: ECC disabled, Data cache writealloc
[20:21:08] [ 0.000000] CPU EXYNOS4412 (id 0xe4412220)
[20:21:08] [ 0.000000] S3C24XX Clocks, Copyright 2004 Simtec Electronics
[20:21:12] [ 4.985941] VFS: Cannot open root device "(null)" or unknown-block(0,0)
[20:21:12] [ 4.992053] Please append a correct "root=" boot option; here are the available partitions:
[20:21:12] [ 5.072773] b310 2048 mmcblk0boot1 (driver?)
[20:21:12] [ 5.078062] b308 2048 mmcblk0boot0 (driver?)
[20:21:12] [ 5.083352] b318 31166976 mmcblk1 driver: mmcblk
[20:21:12] [ 5.088643] b319 31162880 mmcblk1p1 00000000-0000-0000-0000-000000000000
[20:21:12] [ 5.096118] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

這也是個典型問題了,以前在玩2410、6410弄Linux核心移植的時候經常遇到這樣,特別是在掛NFS ROOT,找不到根目錄。後面試了用ROM原配的boot.img也是一樣,這樣可能就得猜想一下fastboot boot直接下載核心的機制到底是怎麼樣的了,這個就暫不深究了。

不過在測試中還發現了另外一個值得慶幸的事情,那就是k860i可以直接用fastboot來刷核心,其實好像很多手機都是可以支援的?不過確實說起來聯想把這個bootloader還算是做的很好的了,電源+音量加進入bootloader模式,裡面有很多個選項,可以切換耳機孔作為音訊輸出還是串列埠console,還可以選擇進入recovery,或者進入usb下載(也就是fastboot模式),SD下載(也就是聯想官方用的szb刷機方式)。進入usb下載模式,直接就可以用fastboot刷機了。嘗試把zImage刷到boot裡面去:fastboot flash boot zImage,再重啟手機,可以看到,會報錯不能引導,會直接進入到uboot的命令列,會報錯。後面再刷入之前用的boot.img,就又可以正常啟動了。
[20:41:55] downloading of 3749708 bytes finished
[20:41:55] Received 10 bytes: flash:boot
[20:41:55] flashing 'boot'
[20:41:55]
[20:41:57] MMC write: dev # 0, block # 6660159, count 40897 ... 40897 blocks written: OK
[20:41:57] partition 'boot' flashed
[20:42:11] Received 6 bytes: reboot
[20:42:11] resetting ...
[20:42:11] reset...
[20:42:13] s5p_dsim_set_main_disp_resol:vert_resol:1280, hori_resol:720
[20:42:13] Hit any key to stop autoboot: 0
[20:42:13] Wrong Image Format for bootm command
[20:42:13] ERROR: can't get kernel image!
[20:43:04] STUTTGART #

看來boot.img是把zImage加了一些檔案頭等資訊,不過也是可以理解的,畢竟boot.img是在系統的原始碼目錄用make bootimage生成的,而這個核心只是在核心目錄生成的zImage。明天準備嘗試一下把這個zImage核心檔案加檔案頭,看能不能直接引導現用的ROM。

好吧,今天的更新日誌就這些了,耳機除錯線確實是個非常給力的工具,估計也能增加那麼一點點移植成功的機率吧。



--------------------------------------------------------------------------------------------
2014.4.18
從昨天晚上開始編譯一下官方給的核心原始碼,僅僅只是做下測試看能不能編譯通過。不過由於虛擬機器裡面的ubuntu是10.04 32位的,不能編譯4.0以上的系統,所以必須重新在虛擬機器裡面搭一個64位的環境。本來是想直接用最新的14.04 x64,結果在vmware有各種問題,網上說是最新版的vmware不支援14.04的linux 3.13核心。後面換到12.04.4 x64,圖形又用不了。真是各種操蛋,最終只能用字元介面了,好在編譯這些東西不需要圖形操作,還用了SecureCRT的自動記錄功能,把終端所有輸出的命令的時間都加上了,這樣就很好了,記錄所有操作,為以後記這篇日誌有點根據。

好在最後還是把環境搭起來了,虛擬機器裡面遷移起來就比較方便了,之前拖cm的原始碼的時候,我是在/home下面另外新建了一塊vmware虛擬硬碟vmdk掛到/home/cm的,所以我重灌系統完全不會影響到原始碼,把幾個重要的系統配置檔案備份到cm的vmdk裡面,比如/etc/bash.bashrc, /etc/fstab/, /etc/profile, ~/.vim, ~/.vimrc等等,重新完成之後把這些檔案再覆蓋回去重啟系統即可,之前設定的環境變數,各種使用習慣全部都回來了。

然後是安裝編譯系統和核心所必備的一些包:
sudo apt-get install bison build-essential curl flex git-core gnupg gperf libesd0-dev libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 libxml2-utils lzop openjdk-6-jdk openjdk-6-jre pngcrush schedtool squashfs-tools xsltproc zip zlib1g-dev g++-multilib gcc-multilib lib32ncurses5-dev lib32readline-gplv2-dev lib32z1-dev p7zip-full vim-gtk openjdk-6-jdk openjdk-6-jre

最後兩個jdk和jre,最好不要安裝openjdk的,看編譯的時候會報一些錯,安裝sun jdk比較好。

說一下我的目錄環境情況,/home/cm/cm11這個是所有cm原始碼的根目錄,下面有osc_opensource這個目錄是聯想4月放出來的原始碼的目錄,現在還是一個獨立的目錄,還沒有放到cm原始碼的核心目錄裡面去。開始測試編譯核心之前要配置好交叉編譯器的toolchain的環境變數,當然所有的前提都是要把cm11.0的所有原始碼都拖下來,repo sync完全顯示done才可以進行,此時/home/cm/cm11應該有abi bionic cts development docs hardware Makefile out prebuilt system android bootable dalvik device 等等目錄,這裡面同時也已經包含了交叉編譯器的toolchain了。具體配置是編輯/etc/bash.bashrc,在檔案最後新增如下幾行儲存之後,source一下/etc/bash.bashrc就可以了。
# set jdk environment
export JAVA_HOME=/usr/local/src/jdk1.6.0_24/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# set PATH for adb and android sdk folder
export PATH=/home/cm/:/home/cm/android-sdk-linux/tools/:/home/cm/android-sdk-linux/platform-tools/:$PATH
# set PATH for arm-linux-gcc eabi 4.6
export CM11=/home/cm/cm11
export PATH=$CM11/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin:$PATH

export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-

環境都搭好之後就可以cd到osc_opensource的kernel目錄,開始:
make stuttgart_android_defconfig  //用來生成.config檔案
make -j4

好吧,報錯了。
  CC arch/arm/mach-exynos/cpu-exynos4.o
  CC arch/arm/mach-exynos/pm-exynos4.o
/tmp/cctXCN1T.s: Assembler messages:
/tmp/cctXCN1T.s:69: Error: selected processor does not support ARM mode `smc 0'
/tmp/cctXCN1T.s:97: Error: selected processor does not support ARM mode `smc 0'
/tmp/cctXCN1T.s:119: Error: selected processor does not support ARM mode `smc 0'
/tmp/cctXCN1T.s:141: Error: selected processor does not support ARM mode `smc 0'
/tmp/cctXCN1T.s:188: Error: selected processor does not support ARM mode `smc 0'
make[1]: *** [arch/arm/mach-exynos/cpu-exynos4.o] 錯誤 1
make[1]: *** 正在等待未完成的任務....
/tmp/ccMpIkta.s: Assembler messages:
/tmp/ccMpIkta.s:112: Error: selected processor does not support ARM mode `smc 0'
/tmp/ccMpIkta.s:303: Error: selected processor does not support ARM mode `smc 0'
/tmp/ccMpIkta.s:394: Error: selected processor does not support ARM mode `smc 0'
/tmp/ccMpIkta.s:422: Error: selected processor does not support ARM mode `smc 0'
/tmp/ccMpIkta.s:444: Error: selected processor does not support ARM mode `smc 0'
/tmp/ccMpIkta.s:466: Error: selected processor does not support ARM mode `smc 0'
/tmp/ccMpIkta.s:789: Error: selected processor does not support ARM mode `smc 0'
make[1]: *** [arch/arm/mach-exynos/pm-exynos4.o] 錯誤 1
make: *** [arch/arm/mach-exynos] 錯誤 2
make: *** 正在等待未完成的任務....
make: *** wait: 沒有子程序。 停止。

反反覆覆都是報的同一個錯,網上搜了下,說是三星Exynos的CPU的一個smc的支援問題,幸運的是,在 https://gist.github.com/anonymous/4395518 這個github裡面,有個大神已經提交了一個修復這個錯誤的補丁,原始碼都在,不過這個是patch.txt,好吧不會用patch功能的我只能純手工自己添加了(請不要吐槽我不會用patch。。。。)。雖然不會用patch,不過好在這是純檔案,咱看下也能明白這個patch到底是怎麼打的,怎麼分析patch檔案怎麼用我就不說了,自己可以看原始碼,想想便知,現在說的是怎麼手動修改。

arch/arm/mach-exynos/include/mach/smc.h 這個檔案,
在第53行下面和第69行下面都加入這行程式碼:
".arch_extension sec\n"

arch/arm/mach-exynos/sleep-exynos4.S 這個檔案,
在第41行下面加入下面這三行程式碼:
#ifdef CONFIG_ARM_TRUSTZONE
 .arch_extension sec
#endif

arch/arm/mach-exynos/idle-exynos4.S
這個檔案 ,
在第47行下面加入下面這三行程式碼:
#ifdef CONFIG_ARM_TRUSTZONE
 .arch_extension sec
#endif

大概就是改這三個原始檔,改好之後繼續 make -j4,大概十幾分鐘左右,應該沒有其它錯誤了,顯示如下的資訊就表示核心 zImage已經編譯完成了。
  MODPOST 4 modules
  GZIP arch/arm/boot/compressed/piggy
  SHIPPED arch/arm/boot/compressed/lib1f
  AS arch/arm/boot/compressed/lib1f
  LD [M] crypto/ansi_cprng.ko
  LD [M] drivers/media/video/gspca/gspc
  AS arch/arm/boot/compressed/piggy
  LD arch/arm/boot/compressed/vmlin
  OBJCOPY arch/arm/boot/zImage
  Kernel: arch/arm/boot/zImage is ready

編譯好之後當然就想試一下能不能用。因為暫時還不準備刷機,要備份的東西太多,所以我就想著看能不能直接用fastboot boot zImage這種方式來測試下核心,發現然後就直接卡死在開機lenovo logo了。之前以為可能是核心的問題,後面直接用現在用的這個刷機包的boot.img,用同樣的fastboot boot boot.img來啟動,發現也不行,同樣是卡死在lenovo logo。

調核心沒有串列埠幾乎無法進行啊,看到之前有個帖子 http://bbs.lephone.cc/forum.php?mod=viewthread&action=printable&tid=547161 ,準備去弄個這個線,USB轉TTL的板子我自己有一個,要想辦法做一個這個線,就可以跟開發板一樣直接看串列埠輸出的資訊了,弄好了的話調核心就真是方便太多了。

另外,發到上海去修的主機板,還沒回來,估計這周都回不來了,真是操蛋。每次在筆記本的虛擬機器ubuntu上編譯東西,這筆記本風扇都是在嚎叫。。。。好慘的樣子。。。。。

好吧,昨晚弄這個東西搞到三點鐘才睡覺。。。。。

http://www.xuebuyuan.com/1011648.html

http://iwillbemyself.blog.163.com/blog/static/170223228201222831425225/



相關推薦

Lenovo k860i 移植Android 4.4 cm11進度記錄完結

2014.5.16 為了驗證一下下載的CM11的原始碼有沒有問題,決定編譯一下cm官方支援的機器,手上正好有臺nexus7 2012,就拿它為例測試一下在mac os x平臺的整個編譯過程。 1. 最開始,是在os x下面搭編譯環境,以前有說過的,詳見xda這個帖子。 http://forum.xda-dev

Android開發自定義控制元件實現一個圓形進度帶數值和動畫

實現一個如下圖所示的自定義控制元件,可以直觀地展示某個球隊在某個賽季的積分數和勝場、負場、平局數 首先對畫布進行區域劃分,整個控制元件分上下兩部分 上邊是個大的圓環,圓環中間兩行文字,沒什麼難度,選好圓心座標和半徑後直接繪製即可,繪製文字也是如此。 下部分是三個小的圓弧進

Spring MVC內建支援的4種內容協商方式享學Spring MVC

每篇一句 十個光頭九個富,最後一個會砍樹 前言 不知你在使用Spring Boot時是否對這樣一個現象"詫異"過:同一個介面(同一個URL)在介面報錯情況下,若你用rest訪問,它返回給你的是一個json串;但若你用瀏覽器訪問,它返回給你的是一段html。恰如下面例子(Spring Boot環境~): @

Android肝帝戰紀之基於單Activity+多Fragment框架,開發電商式導航欄,多Fragment切換

電商式導航欄,多Fragment切換 介面構思示意圖 設計思路 在底部的LinearLayout中新增相應的圖示,然後設定tag繫結相應的 Fragment陣列對應的下標值,再點選切換的時候,根據獲取到的tag值,取出陣列中對應下標的Fragment,在

Android Intent傳遞物件和ArrayList大明進化十八

         以前做專案的時候,需要Intent 傳遞複雜型別,例如:陣列,ArrayList型別,傳遞類物件,今天抽空寫了個例子,方便以後用的時候查詢!有問題可以留言; 轉載請標明出處:               程式主介面:                  

android的常用控制元件總結安卓入門五

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。                                             RadioButton單選

Linux 4.4核心移植以及Android系統編譯

Android預移植到tiny4412 kernel for tiny4412  前面的文章已經把uboot給弄好了,下面就可以用自己移植的uboot來啟動核心了。對於核心的移植,一開始選擇的是linux4.4的核心,為什麼選4.4,因為開始的時候是想

[Android]異常4-javax.mail.AuthenticationFailedException

llb src pop set com ava smtp exceptio .net javax.mail.AuthenticationFailedException 背景:JavaMail發送電子郵件 異常原因: 可能一>發件人帳號、密碼有誤 可能二>需要使用

[Android 4.4.2] 泛泰A850 Mokee4.4.2 20140509 RC2.0 by syhost

無線 tails 新的 ble safe 機會 color 替代 them 感謝: tenfar(R大師),zhaochengw(z大)。windxixi(雪狐),xuefy(大星星)。suky, cofface 感謝參考代碼: Cyanogenmod , mar

GetPathFromUri4kitkatAndroid 4.4 kitkat以上及以下根據uri獲取路徑的方法

under als providers textview href 數據權限 res activit nload 版權聲明:本文為博主原創文章,未經博主允許不得轉載。 前言 在Android4.4之前和之後,通過Intent調用文件管理器選擇文件,獲取的文件uri地址形

Android 4.4.2引入的超炫動畫庫

4.5 1.4.1 name api level image orm 基本 aca 概述 概述 Scene Transition TransitionManager 常用API 1.4.1. AutoTransition 1.4.2. Chan

移植Linux-3.4.2內核到S3C2440

解析 Coding 復制 ace otf fail port segment abs 一、BootLoader引導內核過程 1、Bootloader的工作 1.1、將內核讀入內存 2.2、保存內核啟動參數到指定位置,內核啟動時去這個位置解析

使用VS2017開發APP中使用VUE.js開發遇到打包出來的android文件 在低版本的android4.3)中無法正常使用

vue.js 文件 默認 項目 let ons dir file 開發app 使用VS2017開發VUE的APP應用遇到的問題集合 1, 打包出來的apk文件在Android 6.0版本以上手機可以正常打開,在Android 4.3版本手機上無法打開 原因:一開

[Android 4.4.2] 泛泰A870 Mokee4.4.2 20140531 RC1.0 by syhost

statistic 狀態欄 and 自己 最新版 xixi 方法 新版 網絡 歡迎關註泛泰非盈利專業第三方開發團隊 VegaDevTeam??(本team 由 syhost suky zhaochengw(z大) x

Android EditText輸入框按銀行賬號格式輸入(4 4 4 4 3)

我們在做輸入框輸入的時候總會遇到各種各樣的格式輸入要求,下面來給大家介紹一個按銀行賬號3 4 4 4 4格式的輸入(5222 2222 2222 2222 222)。就是輸入完前三個數加一個空格,之後每輸入完四個數加一個空格,並控制只能輸入銀行賬號的字元數。下面來看程式碼: xml佈局

Android藍芽開發之低功耗藍芽(藍芽4.0)開發全記錄

主要內容概況 前面我記錄了開發藍芽2.0的過程,今天準備介紹現在的主流藍芽技術,藍芽4.0的開發,該藍芽技術是在Android4.3(API級別18)版本引入的API。 官方文件 具體的區別主要以下幾點: 1.新的藍芽技術提供了連線服務的方法,以前是沒有提供連線藍芽的方法

Android 4.4 及以下 TextView 使用向量圖報錯!

專案在 Android 5.0 以上的機子執行正常,在 Android 4.4 及以下的機子上直接崩潰。異常顯示找不到資原始檔,具體到就是 TextView 中的 background 屬性使用的向量圖,改為一般圖片後項目又正常運行了。 向量圖只能在 AppCompatImag

Android Studio(4)---開發人員工作流程基礎

開發人員工作流程基礎 開發Android應用程式的工作流程在概念上與其他應用程式平臺相同。但是,要有效地為Android構建精心設計的應用程式,您需要一些專門的工具。以下列表概述了構建Android應用程式的過程,幷包含您在開發的每個階段應使用的一些Android Stud

Android Studio 3.1.4,gradle 4.4解決Error:Unable to resolve dependency for ':@debug/compileClasspath'問題

    最近把Android studio升級到3.1.4,可是新建一個空專案在build的時候都出現問題,本來不是很重視,把不需要的直接注掉即可,但是因為匯入公司的一個專案來編譯,結果還是報了同樣的錯(引入的依賴庫出現了問題),最終在網上找了很多方法,最終解決了,記錄下過程

Failed to resolve: cn.leancloud.android:hmsagent:4.7.8

整合LeanCloud 時完全按照官方文件來的 結果報錯 Failed to resolve: cn.leancloud.android:hmsagent:4.7.8 原因分析: 我沒有匯入這個包也沒有使用,編譯器為什麼要去引用呢 ? 肯定是我匯入的包引用了,於是我逐一刪除匯入的包,刪除