Android 4.1.1源碼編譯

適用環境:java

系統:ubuntu-12.04.2-desktop-amd64linux

JDKsun-java6-jdkandroid

Android源碼:android_4.1.1_r1ios

 

虛擬機安裝:git

VMware Workstation版本:vmware-workstation-full-9.0.2-1031769ubuntu

 

安裝前請你們切記BIOSVT功能,不開的話安裝Ubuntu 64bit 是不容許的。bash

個人電腦是HP pro 3380(實習生進來分配的機型)eclipse

開啓方式:Bios -> Security -> System Security -> enable VTcurl

 

開啓後就能夠安裝VM並自行破解。ide

注意:要先開啓VT開安裝VM,先安裝VM再開啓VT的話是不行的。

 

Unbuntu安裝

版本:ubuntu-12.04.2-desktop-amd64.iso

下載地址:下載

 

注意:建議下載上面的版本,由於不一樣版之間的差別可能會引發一些不一樣問題。

選擇64位是由於Google Android 的源碼編環境譯默認是要在64bit系統上跑的,雖然能夠修改mk文件讓它能夠在32bit系統上跑,可是比較麻煩且網上的修改方法都比較老,找不到適合Android 4.X 的修改方法。

 

建議:

內存設置到1.5G以上吧,否則很容易出現OOM

硬盤大小設置爲40G以上。

 

 

詳細安裝過程省略....

 

JDK安裝:

 

添加安裝JDK6

$sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"

$sudo apt-get update

$sudo apt-get install sun-java6-jdk

 

採用在線安裝,能夠不用手動設置環境變量。

控制檯輸入  java -version

以下顯示,則表示JDK安裝成功:

 

 

安裝軟件環境

apt-get install git-core gnupg flex bison gperf libsdl1.2-dev libesd0-dev  build-essential zip curl libncurses5-dev  libwxgtk2.8-dev   zlib1g-dev  xsltproc  libc6-dev-i386  libglu1-mesa:i386 lib32z1  libxml2-utils

 

注意:其中紅色的是解決本身在安裝過程當中遇到各類問題所用到的軟件,在這裏跟google推薦的軟件(黑色的)一塊兒裝,能夠避免遇到我一樣的問題,能夠少不少折騰。

 

 

 

檢查環境

檢查gccjdk的版本號是否正確:

$gcc v

$g++ -v

$cc v

$java version

$javac version

 

Ubuntu 12 默認自帶g++和gcc,若您的系統不自帶請先安裝:

$sudo apt-get install gcc-4.3 g++-4.3 gcc-4.3-multilib g++-4.3-multilib

 

 

環境設置

在控制檯執行:

gedit ~/.bashrc

增長如下代碼(要根據本身的實際狀況修改):

 

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

# set android environment

ANDROID_DIR=/home/ccf/src

ANDROID_CODE_ID=android_4.1.1_r1

ANDROID_BUILD_TOP=${ANDROID_DIR}/${ANDROID_CODE_ID}

ANDROID_PRODUCT_OUT=${ANDROID_BUILD_TOP}/out/target/product/generic

ANDROID_SWT=${ANDROID_BUILD_TOP}/out/host/linux-x86/framework

export PATH=${PATH}:${ANDROID_DIR}:${ANDROID_BUILD_TOP}:${ANDROID_PRODUCT_OUT}:${ANDROID_SWT}

 

# set android sdk environment 

export ANDROID_SDK_HOME=/home/ccf/eclipse/adt-bundle-linux-x86_64-20130717/sdk

export PATH=${PATH}:${ANDROID_SDK_HOME}:${ANDROID_SDK_HOME/tools}

 

# set android emulator environment

ANDROID_EMULATOR=${ANDROID_BUILD_TOP}/out/host/linux-x86/bin

export PATH=${PATH}:${ANDROID_EMULATOR}

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

其中ccf是個人用戶名。

src是放源碼文件夾的位置。

android_4.1.1_r1是在src下源碼問文件夾

 

 

開始編譯前的一些準備:

1.設置swap大小:

 

由於在編譯源碼的時候,佔用內存是很是大的,Ubuntu默認的swap交換區是比較少了。

這裏咱們把它設置大。

 

sudo dd if=/dev/zero of=/boot/swapfile bs=1024 count=4194304

    sudo mkswap -v1 /boot/swapfile

    sudo swapon /boot/swapfile

    free

    sudo gedit /etc/fstab

    /boot/swapfile swap swap defaults 1 1

 

在控制檯執行  free命令,能夠看到如下結果則說明設置成功

 

2.避免由於Java虛擬內存問題致使編譯失敗

在源碼目錄中找到:

frameworks/base/tools/layoutlib/Android.mk
將文件中的 
$(hide) java -jar $(built_layoutlib_create_jar) \ 這行修改成以下:
$(hide) java  -Xmx512M  -jar $(built_layoutlib_create_jar) \

 

 

編譯Android源碼

下載源碼(具體下載參考網上教程)

 

解壓源碼:
tar xvf  android_4.1.1_r1.tgz

 

獲得如下文件夾

 

用命令行進入android_4.1.1_r1  文件夾

 

source build/envsetup.sh

lunch sdk-eng

make  -j4  (j表明線程數)

 

最後出現Installed file list: out/target/product/generic/installed-files.txt表示編譯成功。

 

期間可能出現一些問題,我遇到的問題我會連同解決方法寫在最後面,若是裏面沒有你遇到的問題,請自行谷歌吧。

 

編譯出來的東西會放在:

/home/ccf/src/android_4.1.1_r1/out

 

 

編譯SDK

source build/envsetup.sh

lunch sdk-eng

make sdk -j2  (j表明線程數)

 

編譯後的sdk

/home/ccf/src/android_4.1.1_r1/out/host/linux-x86/sdk

將本身編譯出來的SDK放在/home/ccf/src/android_4.1.1_r1目錄下。

【注】copy出來是防止SDK被意外修改或後面編譯ADT時被自動刪掉。

 

 

 

運行模擬器

自進入源碼目錄下/home/ccf/src/android_4.1.1_r1

運行下面命令:

source build/envsetup.sh

lunch sdk-eng

emulator

 

問題總結

如下問題是我在編譯過程當中遇到比較典型的問題,並附有解決方法

 

問題1. 

Libz.so問題

1.安裝sudo apt-get install libglu1-mesa:i386

 

2.安裝sudo apt-get install lib32z1

(要裝這個,可能會提示缺乏上面那個,因此要先裝上面那個。)

說明:GNU C Library: 32-bit shared libraries for AMD64

 

 

問題2. 

[out/target/product/generic/system/etc/apns-conf.xml] Error 127

sudo apt-get install  libxml2-utils  

 xml相關的包。

 

 

 

問題3.

make:*** [out/target/common/obj/APPS/android.core.tests.libcore.package.com.no-core-tests-res_intermediates    /  noproguard.classes-with-local.dex] Killed

 

 默認的1GB的,因此,增長swap空間便可,執行命令以下:

 

    sudo dd if=/dev/zero of=/boot/swapfile bs=1024 count=4194304

 

    sudo mkswap -v1 /boot/swapfile

 

    sudo swapon /boot/swapfile

 

    free

 

    sudo vi /etc/fstab

 

    /boot/swapfile swap swap defaults 1 1

 

 

 

問題4.

出現make: *** [out/target/common/docs/offline-sdk-timestamp] 錯誤 45
(又多是你的linux下少安裝了一些東西若是不是在看下面
sudo apt-get install bison libc6-dev-amd64 g++-multilib 
sudo apt-get install flex

把這個目錄刪除:out/target/common/obj/JAVA_LIBRARIES/framework_intermediates
make sdk

 

 

 

問題5

 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 at java.util.Vector.<init>(Vector.java:111)
 at java.util.Vector.<init>(Vector.java:124)
 at org.antlr.analysis.DFA.createTransitionTableEntryForState(DFA.java:551)
 at org.antlr.analysis.DFA.createStateTables(DFA.java:440)
 at org.antlr.codegen.CodeGenerator.genLookaheadDecision(CodeGenerator.java:645)
 at org.antlr.grammar.v3.CodeGenTreeWalker.block(CodeGenTreeWalker.java:2876)
 at org.antlr.grammar.v3.CodeGenTreeWalker.rule(CodeGenTreeWalker.java:2382)
 at org.antlr.grammar.v3.CodeGenTreeWalker.rules(CodeGenTreeWalker.java:1537)
 at org.antlr.grammar.v3.CodeGenTreeWalker.grammarSpec(CodeGenTreeWalker.java:1441)
 at org.antlr.grammar.v3.CodeGenTreeWalker.grammar_(CodeGenTreeWalker.java:461)
 at org.antlr.codegen.CodeGenerator.genRecognizer(CodeGenerator.java:421)
 at org.antlr.Tool.generateRecognizer(Tool.java:655)
 at org.antlr.Tool.process(Tool.java:468)
 at org.antlr.Tool.main(Tool.java:93)
make: *** [out/host/common/obj/JAVA_LIBRARIES/smali_intermediates/smaliLexer.java] 錯誤 
解決:

這個問題一樣是提示java虛擬機內存的問題,解決的思路是同樣的,但解決這個問題須要修改的是external/smali/smali/Android.mk

這個mk文件,將Android.mk文件中的

$(GEN): PRIVATE_CUSTOM_TOOL = java -jar $(ANTLR_JAR) -fo $(dir $@) $<.這行,修改成

$(GEN): PRIVATE_CUSTOM_TOOL = java -Xmx512m  -jar $(ANTLR_JAR) -fo $(dir $@) $<.

 

 

問題6.

 

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
 at java.util.zip.ZipOutputStream.getUTF8Bytes(ZipOutputStream.java:498)
 at java.util.zip.ZipOutputStream.writeLOC(ZipOutputStream.java:348)
 at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:179)
 at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:92)
 at com.android.tools.layoutlib.create.AsmGenerator.createJar(AsmGenerator.java:241)
 at com.android.tools.layoutlib.create.AsmGenerator.generate(AsmGenerator.java:225)
 at com.android.tools.layoutlib.create.Main.main(Main.java:98)
make: *** [out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar] 錯誤 1
make: *** 正在刪除文件「out/host/common/obj/JAVA_LIBRARIES/temp_layoutlib_intermediates/javalib.jar」
解決:這個問題也是java虛擬機內存的問題,解決的方法是修改frameworks/base/tools/layoutlib/Android.mk
將文件中的 
$(hide) java -jar $(built_layoutlib_create_jar) \ 這行修改成以下:
$(hide) java  -Xmx512M  -jar $(built_layoutlib_create_jar) \

 

 

問題7.

make: *** [out/target/common/obj/APPS/android.core.tests.libcore.package.dalvik.no-core-tests-res_intermediates/noproguard.classes-with-local.dex] Error 130

上次make或或者mmm的時候生成一些錯誤的東西

可使用:make clean 再從新make

解決:rm out/target/common/obj/APPS/ -r (若是仍是有這樣的錯誤,就只能clean了)

相關文章
相關標籤/搜索