參考師弟的貼子修改的, 基本我一次就弄好了, 沒有遇到啥問題, 下面我主要是補充下他的帖子php
http://bbs.pediy.com/showthread.php?t=213481 html
一. 環境搭建java
(1). 環境介紹:
python
手機:nexus 5linux
ubuntu版本:15.10android
android版本:4.4.4git
android源碼官網(這裏有不少相關的資料,基本上按照官網的來就能夠編譯想編譯的任何版本了)github
http://source.android.com/source/web
(2). 環境配置ubuntu
配置環境得好好看看這篇,不一樣的android版本選擇不一樣的環境
http://source.android.com/source/requirements.html
JDK環境配置
(支持多版本,這個姿式正確點, 之後若是要編譯其餘版本的能夠隨時切換JDK版本)
ps:題外話,python也有相似的版本管理方案
http://www.cnblogs.com/butterfly-clover/p/5764587.html
①. 添加軟件源
sudo add-apt-repository ppa:webupd8team/java
②.更新軟件源
sudo apt-get update
③.安裝 jdk 6
sudo apt-get install oracle-java6-installer
④.查看全部 jdk 安裝版本
sudo update-java-alternatives -l
java-6-oracle 3 /usr/lib/jvm/java-6-oracle
java-7-oracle 4 /usr/lib/jvm/java-7-oracle
java-8-oracle 2 /usr/lib/jvm/java-8-oracle
⑤.經過-s參數能夠方便的切換到其它的java版本
$ sudo update-java-alternatives -s java-6-oracle
須要注意的是:
不一樣版本的android源碼須要不一樣的jdk來編譯,否則可能會在源碼編譯的時候報錯jdk版本不對
Cupcake到Froyo (android1.5~android2.2.x) 使用JDK5
Gingerbread到kitkat (android2.3.x~android4.4.x)使用JDK6
Lollipop到Marshmallow (android5.x~android6.0) Open-JDK7
其餘版本使用OpenJDK8
對應手機型號的支持版本在這裏查詢
http://source.android.com/source/build-numbers.html
個人版本屬於kitkat,因此用jdk6編譯
python環境
python環境Ubuntu 15.10已經安裝了因此略過,若是沒有須要安裝python2.6~2.7
安裝編譯庫環境
編譯依賴的環境按照這裏進行配置
http://source.android.com/source/initializing.html官網上看起來Ubuntu15.10是不用再另外配置環境了,這點我沒有進行嘗試,我當時沒有看到這個頁面,因此我仍是按照Ubuntu14.04的方式配置了環境
sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
libgl1-mesa-dev libxml2-utils xsltproc unzip
okay環境都配置好了,下面開始下載源碼
二. 下載源碼
(1). 官網教程
谷歌官網的教程在這裏,我這邊下載的比較慢(谷歌源)
http://source.android.com/source/downloading.html
(2). 配置清華大學的下載源
咱們使用清華大學的源,速度飛快,在公司的網絡,一個晚上就下載好了
1. 配置git
設置 github郵箱姓名使用 git 工具,配置github能夠百度github配置本篇幅不在多餘介紹
git config --global user.email "<你的 github 的 email 地址>"
git config --global user.name "<你的 github 的 name 名稱>"
2.下載repo
咱們後面會使用repo來進行源碼下載,repo是什麼?(請自行百度)
我這邊是這樣管理的,新建了一個android目錄,而後在android目錄下新建了一個aosp目錄
咱們的源碼之後就下載到aosp目錄了
cd到android目錄執行下面第2條代碼
①. git clone git://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/
②. git clone https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git
我這邊試了下,好像只能用https的方式下載了, 因此咱們選擇方案2
3. 配置repo可執行
下載完畢後會獲得一個 git-repo 項目,找到裏面的 repo 文件,
在咱們的android目錄下新建一個bin目錄,同時複製repo到bin目錄
最後在加上可執行的權限
chmod a+x repo
4. 修改repo,設置repo下載源爲清華源
修改下載 URL
雙擊打開 repo,修改 REPO_URL 爲
①. REPO_URL = 'git://aosp.tuna.tsinghua.edu.cn/android/git-repo'
②. REPO_URL = 'https://aosp.tuna.tsinghua.edu.cn/android/git-repo'
同理修改爲方案2,https的url, 方案一如今不能用了
而後使用
export PATH=......./android/bin:$PATH (給出全路徑)
導出 bin 執行目錄
5.下載源碼
新建一個目標文件夾用於存放源碼文件,命令行中用 cd 指令進入。執行下面指令
repo init -u https://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-4.4.4_r1
上面的版本號在這裏查詢
http://source.android.com/source/build-numbers.html#source-code-tags-and-builds
最後執行下面的指令就能夠開始下載源碼了
repo sync
^_^ 漫長的等待, 我晚上下班回家以前開始下載的,早上來就下載好了
記得設置不要睡眠(電源選項&亮度和鎖屏)
(3). 下載驅動文件
接下來在官網下載手機對應的驅動(以下):
https://developers.google.com/android/nexus/drivers#hammerhead
找到 Nexus 5 (GSM/LTE) binaries for Android 4.4.4 (KTU84P)
下面三個文件都要下載,解壓後是三個.sh文件,放到安卓源碼根目錄下,
分別對三個文件chmod a+x 文件名 賦權限,而後分別執行三個文件,此時會生成 vendor文件夾。
三. 編譯系統源碼
android官網的編譯介紹
http://source.android.com/source/building.html
aosp_arm-eng爲模擬器
nexus5爲aosp_hammerhead-userdebug
編譯完後操做系統路徑爲 out/target/product/hammerhead下
編譯時依次執行下面這些命令便可
source build/envsetup.sh # 設置編譯環境
lunch aosp_hammerhead-userdebug # 設置編譯選項
export USE_CCACHE=1 # 使用緩存,能夠加快之後的編譯速度
prebuilts/misc/linux-x86/ccache/ccache -M 100G #使用 100GB 來做爲緩存的空間
#設置緩存地址,能夠不要這個命令而使用默認緩存路徑
export CCACHE_DIR=/<path_of_yourt_choice>/.ccache
make -j4
編譯完後:
輸出目錄: out/target/product/hammerhead
五. 下載編譯內核源碼
此時編譯的操做系統自帶默認的內核,要修改內核的話,得從新下載內核源碼並修改編譯。
在Android源碼文件夾下建立kernel文件夾,並下載內核源碼:
相關說明在這裏:
http://source.android.com/source/building-kernels.html
(1). git clone https://android.googlesource.com/kernel/msm.git
(因爲實驗手機設備爲Nexus 5,所以咱們選擇內核代碼爲msm.git)
(2). checkout所選內核版本
cd ~/source/kernel/msn
git branch –a
git checkout remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1
(3). 修改內核調試標誌,繞過反調試(Kernel proc)
要修改的文件:
kernel/msm/fs/proc/base.c
kernel/msm/fs/proc/array.c
要修改對如下文件的寫入
Status,stat
修改點:
1. base.c 第285行改爲以下:
else {
if (strstr(symname, "trace")) {
return sprintf(buffer, "%s", "sys_epoll_wait");
}
return sprintf(buffer, "%s", symname);
}
2. array.c第134行改爲以下:
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"S (sleeping)", /* 4 */
"S (sleeping)", /* 8 */
"Z (zombie)", /* 16 */
"X (dead)", /* 32 */
"x (dead)", /* 64 */
"K (wakekill)", /* 128 */
"W (waking)", /* 256 */
};
array.c第187行改爲以下:
"Gid:\t%d\t%d\t%d\t%d\n",
get_task_state(p),
task_tgid_nr_ns(p, ns),
pid_nr_ns(pid, ns),
ppid, /*tpid*/0,
cred->uid, cred->euid, cred->suid, cred->fsuid,
cred->gid, cred->egid, cred->sgid, cred->fsgid);
修改完成後,按下面步驟編譯內核,刷入系統
四、修改Makefile文件支持交叉編譯器,編譯內核。可用內核初始化腳本以下:
到kernel源碼目錄新建build.sh
export PATH='/media/bingghost/data/android/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin':$PATH
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
make hammerhead_defconfig
make -j4
--------執行build.sh-------------
chmod 777 build.sh
./build.sh
編譯成功後能夠看到下面的輸出:
編譯完內核後,內核生成的路徑爲:kernel/msm/arch/arm/boot目錄下的zImage-dtb文件(nexus 5是這個文件,nexus 4是zImage文件,請注意別弄錯了),把該文件複製到源碼下的device/lge/hammerhead-kernel夾下(注意:nexus 4則爲mako-kernel文件夾),覆蓋掉同名文件,而後從新按上面步驟編譯一次安卓源碼(這時候編譯很快完成)便可
六. 刷機
刷機過程能夠參考我以前的一篇文章
http://blog.csdn.net/bingghost/article/details/53308694
(1). 檢測 USB 端口
1. 配置好adb和fastboot的環境變量,在android sdk裏面均有
2. 檢測adb和fastboot可否正常識別手機
adb devices
fastboot devices
有型號的輸出則能識別,不能則須要按照下面進配置
(2). 配置USB端口
若是上面的檢測usb不經過,則按照下面的方法來配置
stackoverflow上的介紹
http://stackoverflow.com/questions/7641939/android-fastboot-waiting-for-devices
①. 將下面的內容保存爲51-android.rules,OWNER="xxx", xxx修改爲你的用戶名
# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"
# adb protocol on hammerhead (Nexus 5)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee1", MODE="0600", OWNER="<username>"
②. 修改51-android.rules,添加以下2行,注意OWNER修改爲本身的用戶名
# fastboot protocol on manta (Nexus 5)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0666", OWNER="<bingghost>"
# fastboot protocol on manta (Nexus 5)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", OWNER="<bingghost>"
③. 放到 Ubuntu 的/etc/udev/rules.d/51-android.rules
修改完後用命令
sudo service udev restart
重啓服務進程,從新撥插數據線再
fastboot devices
查看是否識別出來
(3). 刷機
1. 進入bootload模式
手機關機以後, 按住下音量鍵和電源鍵(同時按住不放)
2. 解鎖bootload
fastboot oem unlock
3. 刷機
插上手機鏈接上電腦,確認正常鏈接上電腦後,進行刷機
轉到源碼img生成路徑
cd source/out/target/product/hammerhead/
adb reboot bootloader
fastboot -w flashall
大概兩分鐘後,系統刷成功