1. 程式人生 > >ubuntu編譯android4.0.3原始碼

ubuntu編譯android4.0.3原始碼

1.ubuntu安裝
a.下載64位桌面版映象檔案ubuntu-12.10-desktop-amd64
b.下載EasyBCD
    新增新條目——>NeoGrub——>安裝——>配置
    新增
    root (hd0,0)
    kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/ubuntu-xx.xx-desktop-amd64.iso ro quiet splash locale=zh_CN.UTF-8
    initrd (hd0,0)/initrd.lz
    把ubuntu-xx.xx-desktop-amd64.is 換成自己的版本就可以了!
    儲存設定

    把ubuntu-xx.xx-desktop-amd64.iso檔案也拷貝到C盤裡解壓Ubuntu-xx.xx-desktop-amd64.iso中casper資料夾下面的vmlinuz和initrd.lz到C盤
c.重啟安裝
    Ctrl+Alt+T 輸入 sudo umount -l /isodevice
    安裝注意選擇分割槽,選Ext4檔案系統,掛載點為/,安裝啟動引導器的裝置選/dev/sda ATA
    安裝完成後重啟
2.ubuntu環境搭建
a.安裝jdk
下載jdk1.6.0_43.bin檔案置於/usr/lib/jvm/java中
然後,在shell中執行:
程式碼:
sudo chmod u+x /usr/lib/jvm/java/jdk1.6.0_43.bin

修改bin檔案許可權,使其可執行
然後,執行
程式碼:
sudo /usr/lib/jvm/java/jdk1.6.0_12.bin
安裝完畢

b.jdk環境配置
sudo gedit /etc/environment
新增
JAVA_HOME=/usr/lib/jvm/java/jdk1.6.0_43
CLASSPATH=.:/usr/lib/jvm/java/jdk1.6.0_43/lib:/usr/lib/jvm/java/jdk1.6.0_43/jre/lib
PATH新增
:/usr/lib/jvm/java/jdk1.6.0_43/bin
執行
. /etc/environment

java -version 測試是否配置成功
c.android sdk
sudo gedit /etc/environment
PATH新增
:~/sdk/tools:~/sdk/platform-tools
執行
. /etc/environment
3.原始碼下載
編譯環境
參考http://source.android.com/source/initializing.html
$ sudo apt-get install git gnupg flex bison gperf build-essential \
  zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
  libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
  libgl1-mesa-dev g++-multilib mingw32 tofrodos \
  python-markdown libxml2-utils xsltproc zlib1g-dev:i386
$ sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so
原始碼下載
參考http://source.android.com/source/downloading.html
$ mkdir ~/bin
$ PATH=~/bin:$PATH

$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY

主線上最新版本
$ repo init -u https://android.googlesource.com/platform/manifest
分支,用-b引數制定branch名字
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.3_r1
填寫使用者名稱和email
$ repo sync

4.原始碼編譯
參考:http://source.android.com/source/building.html
http://wenku.baidu.com/view/626d4a2258fb770bf78a552f.html

a. 修改原始碼許可權
    執行 cd WORKING_DIRECTORY
    sudo chmod -R 777 *

b. 開始編譯
    cd WORKING_DIRECTORY
     make clean
    make update-api
    make -j4
    注意:make update-api 只是首次編譯時需要執行,後面重新編譯時只需先make clean  再make -j4 。
    編譯時間大概為40分鐘左右,編譯時間跟機器配置有關。
    make -jx x代表開啟多少個執行緒來下載原始碼,有效利用CPU資源,但有可能會出現記憶體問題
    如:
    make: *** [out/host/linux-x86/obj/EXECUTABLES/clang_intermediates/clang] Error 1
    這時候還是直接使用make方法
    如編譯過程出錯,將會編譯中斷,並給出錯誤提示,可根據提示去百度搜索相關解決辦法
c. 編譯完成
    編譯完成時,會在原始碼目錄生成out資料夾如:
    out/target/product/generic/obj/PACKAGING/systemimage_unopt_intermediates/system.img
    out/target/product/generic/system.img
    out/target/product/generic/ramdisk.img
    out/target/product/generic/userdata.img
5.原始碼編譯FQA
a.編譯出的apk缺少資原始檔
    修改 build\target\product\generic.mk
    新增 CUSTOM_LOCALES:= hdpi mdpi ldpi xhdpi xlarge
b.編譯出的檔案未被混淆
    android在編譯時預設關閉了混淆選項,在build/core目錄有個proguard.flags檔案,其實在proguard的過程中,編譯器會呼叫包括本地目錄下和系統定義了的多個proguard.flags檔案,而在這個檔案中混淆的選項被禁止了, 故而編譯出來的apk仍未混淆。因此將如下句子註釋掉便可實現真正的混淆編譯:
# Don't obfuscate. We only need dead code striping.
-dontobfuscate(將該句加個#號註釋掉)

編譯Android4.0.3的常見錯誤:
參考:http://blog.csdn.net/yiyaaixuexi/article/details/8330645
    make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1  
    gcc和g++版本太高了,把預設的4.6版本換為了4.4
    sudo apt-get install gcc-4.4
    sudo apt-get install g++-4.4
    sudo rm -rf /usr/bin/gcc /usr/bin/g++
    sudo ln -s /usr/bin/gcc-4.4 /usr/bin/gcc
    sudo ln -s /usr/bin/g++-4.4 /usr/bin/g++
    如是64bit系統,則還需裝如下包
    sudo apt-get install g++-4.4-multilib

6.環境相關FQA
a.adb的no permissions問題
    可參考:http://developer.android.com/tools/device.html
    sudo gedit /etc/udev/rules.d/51-android.rules
    新增SUBSYSTEM=="usb", ENV{DEVTYPE}=="usb_device", MODE="0666"
    更改許可權chmod a+r /etc/udev/rules.d/51-android.rules
    重啟udev sudo /etc/init.d/udev restart
    重新插撥usb
b.eclispe no java virtual machine was found錯誤
    編輯eclipse.ini
    在-vmargs 引數的前面新增
    -vm
    /usr/lib/jvm/java/jdk1.6.0_43/bin
c.安裝eclipse svn
    安裝javaHL
    sudo apt-get install libsvn-java
    編輯eclipse.ini
    在-vmargs下增加:
    -Djava.library.path=/usr/lib/jni
    Subclipse報Failed to load JavaHL Library錯誤:
    將原來配置的
    -Djava.library.path=/usr/lib/jni
    改為
    -Djava.library.path=/usr/lib/x86_64-linux-gnu/jni


7. 編譯原始碼模組
a.source build/envsetup.sh
b.使用mmm命令來編譯指定的模組,例如QuickSearchBox應用程式:
    mmm packages/apps/QuickSearchBox/
c.apk檔案生成到 out/target/product/generic/system/app

8.其它ubuntu相關
a.新增Eclipse快捷方式
    sudo gedit /usr/share/applications/eclipse.desktop
    鍵入以下內容:將Exec和Icon中的路徑換為你的Eclipse的路徑,注意Ubuntu中是區分大小寫的。
    [Desktop Entry]
    Name=eclipse
    Name[zh_CN]=eclipse
    Comment=eclipse Client
    Exec=/home/datao/eclipse/eclipse
    Icon=/home/datao/eclipse/icon.xpm
    Terminal=false
    Type=Application
    Categories=Application;
    Encoding=UTF-8
    StartupNotify=true
b.安裝svn軟體rabbitvcs
    sudo add-apt-repository ppa:rabbitvcs/ppa   新增源
    sudo apt-get update   更新倉庫
    sudo apt-get install rabbitvcs-core rabbitvcs-nautilus3 rabbitvcs-cli   安裝相關軟體
    安裝 RabbitVCS Gedit 擴充套件
    sudo apt-get install rabbitvcs-gedit
    最後輸入以下命令重啟 Nautilus 就可以使用 RabbitVCS 了。
    nautilus -q
c.安裝samba訪問區域網伺服器
    sudo apt-get install samba