U-BOOT | UDOO | Banana Pi | Raspberry Pi 2 | Build Android image from Source (AOSP)

沒記錯的話,這是我第一次玩這種所謂的開發版 ... 好聽點是玩硬體 ... 難聽點就是在惡搞吧
或許說一直以來軟體都很弱的我,硬體則還停留在組組電腦的等級更洽當吧 ! 囧

我的最愛-我的電腦 和 硬碟  |  惡意程式分析 / 惡意程式行為分析


但如果這篇還是在記錄上面這些東西的話,就真的有點對不起自己了 !

所以這次的主角 Banana Pi | Raspberry Pi 2 | UDOO  !!! 
(為免浪費大家時間,可以跳過前兩個 (因為都做不到把我想要的功能給自動化),所以直接看我在 UDOO 上的做法吧 )

話說從 2015/04 時我就買了傳說中的 Banana Pi,但是始終都莫法度 把我天外飛來一筆想要的功能給搞成自動化後來還特地的從公司飆 UBIKE 去了 天大地大 跟傑出美少女借了板子做測試卻仍舊失敗;甚至也跟同事借了 Raspberry Pi 2 一樣還是搞不定 ... 原本已打算放棄, 神隊友 一直很關心我到底能不能做出來 ! 囧 (頓時想起當初自己摸索了三個多月擠出來的 抬丸郎 )

最後多虧 玉樹臨風 瀟灑倜儻 的 力趣哥 再次義不容辭的展開廣闊的胸襟贊助借了我 UDOO 還用強健的臂彎開啟 指導教授模式 陪我 Debug ... 終於在我也開啟 菸酒生模式 外掛利用 蘇迪勒颱風假 努力奮鬥陸續的破了關 ... ^O^

為了怕忘記這整個心酸的血淚史,加上這些板子都開源 ... 我想就還是來個簡單的開箱 (是說好久沒寫點技術文唬唬人都在寫 台北拉麵台北咖啡廳 ~ 囧),免得也有人異想天開想跟我玩一樣的事然後一直卡關 ! 囧 ....

======== 我是分隔線,正文開始 (不是搞黑箱的政經) 所以先學郵筒歪一下 ========


首先這個是 u-boot 的官網 ftp://ftp.denx.de/pub/u-boot/ 我在這不知抓了幾個版本 ! 囧


然後 compile 過程可能會因沒裝這個 apt-get install ia32-libs 或者是 apt-get install lib32z1 lib32ncurses5 lib32bz2-1.0 而有錯誤 (這在後面編譯 Android 時也會因為是 x64 的 ubuntu 而需要)

碰到 please upgrade to dtc 1.4 or newer 的話記得 apt-get install device-tree-compiler


想要自行編譯系統映像檔的話,上面兩個黃底紅字再加下面這三行是一定要注意的
# export ARCH=arm
# export CROSS_COMPILE=arm-linux-gnueabi- (sudo apt-get install gcc-arm-linux-gnueabi)
sudo apt-get install lib32stdc++6

看不懂上面幾行在做啥可以參考這: http://leoncproblems.blogspot.tw/2014/12/linux-kernel-arm.html


首先是 Rasberry Pi 2 做法不太同: http://elinux.org/RPi_U-Boot 但做不到我想要的功能,同時也找不到 Serial port 連線的功能,所以它雖然很夯,但我卻整個略過它 ~ XD ~ 明明就是自己先認輸 ! 囧




900MHz quad-core ARM Cortex-A7 CPU & 1GB RAM

# git clone git://github.com/raspberrypi/tools rpi-tools
# export CROSS_COMPILE=/tmp/rpi-tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin/arm-bcm2708-linux-gnueabi-
make rpi_2_defconfig  (自己編 U-BOOT 最需要注意的就是這個了)
# make -j8 -s
# mkfs.ext4 /dev/mmcblk0p1 (這也是特別的地方,要先切割磁區)
# mount /dev/mmcblk0p1 /mnt/
# cp u-boot.bin /mnt/kernel.img



接著再來針對 BananaPi 開個箱跟附上幾個說明文件 

(沒錯,最後敗在 USB keyboard 是 USB 1.0 的 U-boot 的 bug 還有網路不能連線而失敗了)



嗯 ! 我是在這邊訂購的 ... http://goods.ruten.com.tw/item/show?21406105988363



FB 上有社團,不過我要的功能實在有點冷門 ... 所以只好自己摸索 ! 囧
https://www.facebook.com/groups/274014402781734/



AllWinner A20 SoC (ARM® Cortex™-A7 Dual-Core (2 x 1.0GHz)) 1GB of DDR3 SDRAM

會這麼衝動的買這個實在是因為它有 SATA port,不過後來我也用不到就是 ! 囧


要注意的是這同一個板子似乎有兩個產品線 ... 有點搞不太懂,但也不需要搞太懂就是 ! Orz



http://www.lemaker.org | http://www.bananapi.org.tw

  

拿到板子,當然馬上來玩玩用 Linux 來開機啦;很順利的一次就上手 ... But



人蔘中最重要的就是這個 But ... 因為我壓根不是要拿來跑 Linux !!! 


或許之後可以來搞個 Ontology 跟 Interval Type-2 Fuzzy Logic System 玩玩異質 Hadoop 倒是啦 !



所以馬上就來試試能不能跑 Android ... (據說樹莓跑 Android 很慢 !)



不錯,這跑起來還挺快的 ... 只是打包了一些我用不到的東西 ... 所以 ... 只好自己編了 !


這個就是自己編 Android 囉: 可以參考最下方,我有附上我的過程
http://wiki.lemaker.org/BananaPro/Pi:Building_your_own_Android_firmware
http://www.lemaker.org/forum.php?mod=viewthread&tid=9867&highlight=android


這篇是 IBM 的 Android 說明: http://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/

這篇則是 ARM 自己的說明: http://community.arm.com/groups/android-community/blog/2013/09/18/from-zero-to-boot-porting-android-to-your-arm-platform 



Android 編譯錯誤時可以看這篇: http://blog.csdn.net/muyu114/article/details/6260375
當然啦,我可是真的有編譯成功且可以跑的 Android 哦 !!! 而且 adb device 是抓得到的哦 !



這篇我忘了是在啥狀況下找到的: http://www.armadeus.com/wiki/index.php?title=Talk:USB_Gadget




雖然可以在這上面運作,但是我想要的並不是直接運行已編好或自己另外編 Android ... 有沒有開始覺得我想要的真的是很冷門的功能 ?



根據自己摸索了好久 ... 總算搞懂原來這種板子是沒有 BIOS 的 ... 得自己把 Boot Loader 也就是 U-BOOT 寫入,所以馬上附上這篇簡要說明了要怎樣自己編譯 U-BOOT: http://www.lemaker.org/thread-10606-1-1.html 


這篇是怎樣自己編譯的說明: http://linux-sunxi.org/U-Boot#Build
這篇則是怎樣弄到 SD 卡的說明: http://linux-sunxi.org/Bootable_SD_card#Bootloader
這個則是 Banana Pi 的說明: http://wiki.lemaker.org/BananaPro/Pi:Building_u-boot,_script.bin_and_linux-kernel#Building_u-boot



# cd u-boot (進入到你解壓後的資料夾)
make Bananapi_defconfig (自己編 U-BOOT 最需要注意的就是這個了)
# make 
# sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/mmcblk0 bs=1024 seek=8 (記得不能有分割區)


基本上我試了好多種 u-boot 版本,而且都失敗了,如果你有注意看上面的截圖的話 ~ XD

http://www.lemaker.org/cn/forum.php?mod=viewthread&tid=8784&page=1&extra=#pid14284

http://www.bananapi.com/index.php/forum/news/1068-u-boot-usb-keyboard-boot-from-nfs#2905
http://www.lemaker.org/forum.php?mod=viewthread&tid=17131&pid=83290&page=1&extra=#pid83290

這幾個是用過 github 的 u-boot 源碼:

https://github.com/LeMaker/u-boot-sunxi | https://github.com/swarren/u-boot



最妙的是偶爾還可以順利逃過這個神奇的 USB keyboard 是 USB 1.0 的 U-boot 的 bug 




可是卻又被網路不能連線給卡關,這個則是未來可以考慮把 OS 用到 SATA 的 SSD 上再來跑 Hadoop ?
http://www.lemaker.org/forum.php?mod=viewthread&tid=14577&highlight=android



最後這邊則是 UDOO;





首先,我找到了這篇 U-BOOT 支援 UDOO: http://udoo.org/forum/threads/uboot-now-has-udoo-support.449/ 
然後看到怎樣自己編譯 U-BOOT: http://udoo.org/forum/threads/building-uboot-for-udoo.1220/




似乎很符合我的需求,所以馬上就先用官方編譯好的 Ubuntu 跟 Android 開機試試 !!! 
一整個就是超快的啊 !!!! However ~ XD


因為已經有人蔘中最重要的 But 所以改用 However ... 經過了前面的香蕉經驗後,試過人家編好的,也很開心的看到開機了 ... 當然馬上換試 U-BOOT 但卻啥都沒反應 ~ 囧


# wget ftp://ftp.denx.de/pub/u-boot/u-boot-2015.07.tar.bz2
# tar -jxf u-boot-2015.07.tar.bz2
# cd u-boot-2015.07
make udoo_quad_defconfig
# make
# dd if=u-boot.imx of=/dev/mmcblk0 seek=2 bs=512 (沒有 u-boot.imx 只有 u-boot.bin 跟 u-boot.img )


後來再度開啟 菸酒生模式 跟它拼了,直接自己編譯 U-BOOT ... 可是不管怎樣弄接上 HDMI 後總是沒半點反應 ~ 一整個被潑了桶冷水 ~

# git clone git://git.denx.de/u-boot-imx.git

# cd u-boot-imx/
make udoo_defconfig (這邊很妙,因為我的是 quard core,但我卻找不到 quard 的 config)
# make
# dd if=u-boot.imx of=/dev/mmcblk0 seek=2 bs=512 (所以編完後一樣找不到所謂的 u-boot-q.imx)


多虧了官網論壇上有人熱心的回覆 !!! 以及 再度開啟了 指導教授模式 的力趣哥



意外的找到了這兩篇文章,才弄懂了原來得要用 Serial Port 的方法才可以連線看到訊息;只是不知為啥明明就正確連線也可以驅動但卻一樣沒東西

 "Connecting via Serial from Windows "

7.2. Establish serial debug connection with UDOO
http://www.soselectronic.com/a_info/resource/c/S975-G000-2100-C2.pdf

http://www.udoo.org/tutorial/connecting-via-serial-cable/




http://udoo.org/download/files/Documents/UDOO_Starting_Manual_beta0.4_11_28_2013.pdf

3.2.1. i.MX6 Debug Serial Freescale i.MX6 has a dedicated serial port for debugging, which is accessible through an USB-to-RS-232 bridge on micro-USB connector CN6. 





The J18 jumper switches USB connection coming from CN6 to the iMX6 debug serial port, instead of SAM3X8E programming port. It gives accessto Linux console while



就這樣在開啟 指導教授模式 的力趣哥 指點下 ~ 居然意外馬上的解開這個大問題 !




另外,其實可以嘗試自己編看看 U-BOOT 啦,各種板子的 U-BOOT 編譯方法都不太一樣,不過 UDOO 的可以參考下面的連結 ... 因為各種板子的晶片不一,我比較建議你從該板子那邊下載 U-BOOT 或者 Android 的原始碼,這樣問題會比較少一點

http://elinux.org/UDOO_compile_Android_4.2.2_from_sources

當然還有最重要的就是你需要自己編譯 Android 還有 Kernel,這個之前曾在上面所講到的 Banana Pi 上做過 ... 一樣參考上面那個連結就可以,而我確實在編譯 U-BOOT 以及 下載 Android 還有 編譯的過程真的碰上了各種像下面幾個例子的神奇錯誤 !
  • /bin/bash: bison: command not found
  • /bin/bash: xsltproc: command not found
  • gcc: error trying to exec 'cc1plus': execvp: No such file or directory
  • gccgcc: error trying to exec 'cc1plus': execvp: gcc: error trying to exec 'No such file or directory
  • /bin/bash: xmllint: command not found
  • make[1]: lzma: Command not found
  • out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes.jar] Error 41
  • Note: Some input files use or override a deprecated API.
  • Note: Recompile with -Xlint:deprecation for details.
所以就放幾篇我找到的錯誤解法 ... 最囧的我想就這了 .. 因為隨時都會發生跑很久結果錯誤 !

Ubuntu搭建android编译环境总结
Android编译错误:You have tried to change the API from what has been previously approved
android源码编译出现No private recovery resources for TARGET_DEVICE解决方法
javac: target release 1.5 conflicts with default source release 1.7
cc1plus: all warnings being treated as errors
http://blog.csdn.net/muyu114/article/details/6260375
Ubuntu11.10(32位)編譯android常見錯誤(30種常見的)
[Ubuntu] 安裝/反安裝 Sun Java
[Linux] 如何在 Ubuntu 14.04 中安裝 Oracle/Open JDK


接著首先一定要看得是 Google 的 Android 的官網
另外 IBM 有一篇 " 理解 Android Build 系统 " 寫得好詳細:

另外這邊還有 2 篇 Building Android on ARM Platforms:


然後這邊 有 java 可以下載 / 要注意的是 java 的安裝方法:




然後這裡有2篇算寫的很詳細的教學

以及repo下载android出现fatal: Unable to find remote helper for 'https'问题的方法

如果是裝新的 OS 更是要注意 jdk 和 gcc 跟 g++ 了,目前測過在 Ubuntu 14.04jdk 要 1.7gcc version 4.4.7 (Ubuntu/Linaro 4.4.7-8ubuntu1);下面兩行是切換 java 版本的指令


# sudo update-alternatives --config javac
# sudo update-alternatives --config java



=== 我是分隔線 === 想玩板子不建議自己抓 Google 的 Android 原始碼自己編譯哦 ! ===


然後 curl 的下載在這裡:
http://curl.haxx.se/download.html


#wget http://curl.haxx.se/download/curl-7.42.1.tar.gz
#tar -zxf
#cd
#./configure
#make
#make install


#yum install zlib-devel openssl-devel perl cpio expat-devel gettext-devel autoconf git xmlto-y (ubuntu 的我忘了筆記啊 !!!)


#wget http://downloads.sourceforge.net/project/asciidoc/asciidoc/8.6.9/asciidoc-8.6.9.tar.gz?
#tar -zxf asciidoc-8.6.9.tar.gz
#cd asciidoc-8.6.9
# ./configure
#make
#make install
# git clone git://github.com/git/git
#cd git
# make configure
# ./configure --prefix=/usr/local
# make all doc
# make install install-doc install-html

下載 Android 源碼最重要的幾行指令就是下面這幾行而已啦


#mkdir ~/bin
#PATH=~/bin:$PATH
#curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
#chmod a+x ~/bin/repo
# repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.2_r2

中間應該會跟你要一下你的 Google 帳密,這邊要注意跑一次(一天內,因為Google有限流量)絕對跑不完的,特別是你如果一次下載全部的話;一度還傻傻的誤認為為啥跑完怪怪的 ! 囧




Your Name  [root]:
Your Email [root@DEMO.TWMAN.ORG]:

至少要跑個兩次哦 ! 然後就可以準備下這樣的指令了


========== 我是分隔線 ========
UDOO 編譯 Android: Compile Android From Sources

export ARCH=arm
export CROSS_COMPILE=$PWD/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin/arm-eabi-
export PATH=$PWD/bootable/bootloader/u-boot-imx/tools:$PATH
cd /udoo-android-dev/
source build/envsetup.sh
lunch udoo-eng
. setup udoo-eng
make update-api
make -j8


UDOO 編譯 Kernel

make -C kernel_imx imx6_udoo_android_defconfig

========== 我是分隔線 ========

UDOO 做到這邊後就先找台機器裝上 Ubuntu 14.04 吧 ~ 然後把下面這兩個服務設定好 !

在 Ubuntu 14.04 上安裝 NFS Server


# apt-get install nfs-common nfs-kernel-server
# mkdir /nfs
# vim /etc/exports (修改這個檔案)
/nfs 192.168.0.0/24(rw,sync,no_subtree_check)

# /etc/init.d/nfs-kernel-server start 
* Exporting directories for NFS kernel daemon... [ OK ] 
* Starting NFS kernel daemon [ OK ] 

# showmount -e localhost (最後檢查一下是否正常分享共用)
Export list for localhost: /nfs *

Ubuntu 12.04 安裝 DHCP server
# sudo apt-get install isc-dhcp-server
# vi /etc/default/isc-dhcp-server
編輯這行 INTERFACES="eth0" 改成你要的網卡編號

# vi /etc/dhcp/dhcpd.conf (我的範例如下)
default-lease-time 600;
max-lease-time 7200;
option domain-name-servers 168.95.1.1;
subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.101  192.168.0.110;
    option routers 192.168.0.100;
}

#sudo service isc-dhcp-server start

然後裡面有講到怎樣開機不啟動這個服務記得看這篇
http://askubuntu.com/questions/19320/how-to-enable-or-disable-services
echo manual | sudo tee /etc/init/SERVICE.override

嗯 ! 本文未完 ... 後面估計還有幾個重要的動作 ... 請待續 !!!


總而言之,最後就是要可以這樣順利的開起 Android 啦 !


到這邊 ~ 嗚呼 ~ 慢慢的接近破關的樣子嘞 !!! 寫到這邊有沒有很想知道我到底想要做什麼功能呢 ? 嗯 !!! 因為現在這東西比較屬於腦海裡的記憶,真的要完整自動化還有點東西要解決,如果有興趣就請撥空注意 台灣駭客年會 HITCON 2015 Community;來得及的話啦 !




=== 我是分隔線 === 最後放上是用 Banana Pi 的 Android 編譯過程 ! ===


source build/envsetup.sh (這行很重要,就算你是抓板子釋出的源碼也要做)
including device/generic/armv7-a-neon/vendorsetup.sh
including device/generic/mips/vendorsetup.sh
including device/generic/x86/vendorsetup.sh
including device/lge/mako/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including device/samsung/manta/vendorsetup.sh
including device/asus/tilapia/vendorsetup.sh
including device/asus/deb/vendorsetup.sh
including device/asus/grouper/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including sdk/bash_completion/adb.bash


root@XecProbe:/android# lunch ## 最後就是下 make 了 !


但是我猜應該不太可能一次就能編成功,所以可以參考前面寫的幾個連結的錯誤解法:

另外因為硬碟空間太小,所以我用 nfs 掛另一個大硬碟來解壓編譯,所以碰上這樣的問題


tar命令解壓時,出現 cannot change ownership to uid ***, gid ***
解决辦法:使用tar命令的 --no-same-permissions 参數選項或者 嘗試 --no-same-owner options 参數選項 tar --no-same-owner -xzf XX.tar.gz

如果最後成功的話會看到像這樣的畫面哩 !




需要再注意的還有中間會因為 ubuntu 是 64 所以一開始要安裝 x86 的東西會有些問題

EX: 我想使用 pack 時發生了要我安裝 liballegro4-dev 然後這個又相依於  lib64c-dev:i386


# pack
The program 'pack' is currently not installed. You can install it by typing:
apt-get install liballegro4-dev
root@XecProbe:~# apt-get install liballegro4-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
 lib64z1-dev:i386 : Depends: lib64c-dev:i386
 liballegro4-dev : Depends: liballegro4.4 (= 2:4.4.2-5) but it is not going to be installed
                   Depends: libjpgalleg4.4 but it is not going to be installed
                   Depends: libxpm-dev but it is not going to be installed
                   Depends: libxcursor-dev but it is not going to be installed
E: Unmet dependencies. Try 'apt-get -f install' with no packages (or specify a solution).

當我想再靠 apt-get -f install 解決時又發生了下面這鬼打牆的問題 ... 

root@XecProbe:~# apt-get -f install

Preparing to unpack .../libc6-dev-amd64_2.19-10ubuntu2.3_i386.deb ...
Unpacking libc6-dev-amd64 (2.19-10ubuntu2.3) ...
dpkg: error processing archive /var/cache/apt/archives/libc6-dev-amd64_2.19-10ubuntu2.3_i386.deb (--unpack):
 trying to overwrite '/usr/include/gnu', which is also in package libc6-dev-i386 2.19-10ubuntu2.3
Errors were encountered while processing:
 /var/cache/apt/archives/libc6-dev-amd64_2.19-10ubuntu2.3_i386.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

研究了好久以後終於發現這似乎是 ubuntu 的一個 bug 照著做之後就莫名的好了 ! 囧



sudo dpkg --purge --force-depends "gcc-multilib"
sudo dpkg --purge --force-depends "libc6-dev-x32"sudo dpkg --purge --force-depends "lib32z1-dev"
sudo dpkg --purge --force-depends "lib64z1-dev"


# apt-get install liballegro4-dev
# apt-get -f install
...................
Preparing to unpack .../libxcursor-dev_1%3a1.1.14-1_amd64.deb ...
Unpacking libxcursor-dev:amd64 (1:1.1.14-1) ...
Selecting previously unselected package libxpm-dev:amd64.
Preparing to unpack .../libxpm-dev_1%3a3.5.11-1_amd64.deb ...
Unpacking libxpm-dev:amd64 (1:3.5.11-1) ...
Selecting previously unselected package liballegro4-dev.
Preparing to unpack .../liballegro4-dev_2%3a4.4.2-5_amd64.deb ...
Unpacking liballegro4-dev (2:4.4.2-5) ...
Processing triggers for man-db (2.7.0.2-2) ...
# pack

File compression utility for Allegro 4.4.2, Unix
By Shawn Hargreaves, 2011

Usage: 'pack <in> <out>' to pack a file
       'pack u <in> <out>' to unpack a file