Google官方已經發布了Android 4.1 Jelly Bean的源碼,本人第一時間將源碼托了下來(托了一個通宵),今天又花了一早上時間編譯ROM並刷到自己的Galaxy Nexus中,雖說Android 4.1已經用了一個多星期了,但是作為Android開發者和愛好者,體驗源碼下載、編譯、刷機的整個過程還是很有意義的,然而在編譯和刷機過程中也遇到了一些問題,晚上抽了點時間將整個過程總結一下,同時也希望能幫助到想通過自己編譯刷機的朋友,廢話不多說了~~切入正題。
1、編譯環境搭建,本人使用的是Ubuntu 12.04,下面所有過程都基於該平台。
具體可參考:Ubuntu 12.04搭建Android開發環境 http://www.linuxidc.com/Linux/2012-09/69961.htm
2、下載Android 4.1源碼,參考:http://source.android.com/source/downloading.html,源碼下載過程中經常會遇到下載失敗的情況,非常浪費時間,所以編寫一個失敗重傳的腳本可以減少很多不必要的麻煩。將下面的shell腳本保存為download.sh文件放到源代碼目錄中,執行./download.sh開始下載(替代文檔中最後一步repo sync,其余步驟必須按照文檔中介紹的一步一步來)
#!/bin/bash
echo "======start repo sync======"
repo sync
while [ $? == 1 ]; do
echo "======sync failed, re-sync again======"
sleep 3
repo sync
done
3、接下來准備開始編譯rom,可參考http://source.android.com/source/building.html,首先輸入source ./build/envsetup.sh,然後輸入lunch full_maguro-user(不同平台參數不一樣,具體參考文檔說明),接下來執行make -j4編譯rom(根據機器CPU的核心數量來設定參數),下來就是漫長的等待過程了(筆者機器性能不給力,整個編譯過程大概花費了3個半小時)。如果make -j4的執行過程中一開始提示jdk版本不對,那麼按照下面步驟來解決:
從Oracle官方下載jdk1.6.0_33.bin http://www.oracle.com/technetwork/java/javase/downloads/jdk6-downloads-1637591.html
執行sudo chmod a+x /home/jamie/jdk/jdk1.6.0_33.bin(注意這裡的目錄和你機器上的目錄是不一樣的)
sudo ./home/jamie/jdk/jdk1.6.0_33.bin
sudo gedit /etc/profile,尾部添加
#set java environment
export JAVA_HOME=/home/jamie/jdk1.6.0_33
export JRE_HOME=/home/jamie/jdk1.6.0_31/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
執行source /etc/profile
sudo update-alternatives --install /usr/bin/java java /home/jamie/jdk1.6.0_33/bin/java 300
sudo update-alternatives --install /usr/bin/javac javac /home/jamie/jdk1.6.0_33/bin/javac 300
sudo update-alternatives --config java選擇所需要的jdk版本
4、編譯完成後會在android_souce/out/target/product/maguro/中生成一大堆img文件,這就是編譯生成的刷機rom了
5、按照google官方文檔的步驟接下來就是刷機了,然而結果很悲劇,由於官方文檔針對的是模擬器,而筆者編譯的是Galaxy Nexus,出現刷完直接黑屏無法啟動的情況,突然想到昨天網上看到google發布了Android 4.1的二進制文件,而這些文件正好是藍牙、wifi、顯卡等驅動,google將這些驅動單獨提供下載,並未集成到源碼中,所以我們需要將其編譯進rom中,步驟如下:
打開https://developers.google.com/android/nexus/drivers,下載Galaxy Nexus對應的4個文件並解壓到源代碼的目錄,解壓出來的4個文件是4個shell腳本,分別為extract-broadcom-maguro.sh,extract-imgtec-maguro.sh,extract-invensense-maguro.sh,extract-samsung-maguro.sh
分別執行這4個腳本,執行期間會要求輸入“I ACCEPT”
重新執行make -j4進行編譯,這次編譯過程時間很短
6、完成上面的驅動集成後,輸入 cd /home/jamie/android_source/out/host/linux-x86/bin(該目錄下有fastboot文件), 然後輸入sudo ./fastboot flashall -w開始刷機,一般情況下這一步會出現以下錯誤提示:neither -p product specified nor ANDROID_PRODUCT_OUT set,原因是沒有設置rom的位置,解決方法要麼使用-p參數,後面跟著rom的位置,或者配置環境變量ANDROID_PRODUCT_OUT,過程如下:
輸入sudo gedit /etc/profile,在尾部添加export ANDROID_PRODUCT_OUT=/home/jamie/android_source/out/target/product/maguro,保存並退出
然後輸入source /etc/profile使剛設置的環境變量立即生效。
7、最後等待刷機完成,完成後手機會自動重啟,大功告成!!最後附上成果圖
更多Android相關信息見Android 專題頁面 http://www.linuxidc.com/topicnews.aspx?tid=11