适用環境:
系統:ubuntu-12.04.2-desktop-amd64
JDK:sun-java6-jdk
Android源碼:android_4.1.1_r1
虛拟機安裝:
VMware Workstation版本:vmware-workstation-full-9.0.2-1031769
安裝前請大家切記BIOS的VT功能,不開的話安裝Ubuntu 64bit 是不允許的。
我的電腦是HP pro 3380(實習生進來配置設定的機型)
開啟方式:Bios -> Security -> System Security -> enable VT
開啟後就可以安裝VM并自行破解。
注意:要先開啟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安裝成功:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yNxMmZlFmY4MmZlNWYwATYhZ2Y0UDM0IWNmJjNmVDMy0CN1ADN4ETOy8CX3AzMxAjMvwFOxgTM5QzLcd2bsJ2Lc12bj5ycn9Gbi52YuAzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
安裝軟體環境
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推薦的軟體(黑色的)一起裝,可以避免遇到我同樣的問題,可以少很多折騰。
檢查環境
檢查gcc和jdk的版本号是否正确:
$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
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
運作下面指令:
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 vi /etc/fstab
問題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
問題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了)