源碼編譯繞過反調試

參考師弟的貼子修改的, 基本我一次就弄好了, 沒有遇到啥問題, 下面我主要是補充下他的帖子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

大概兩分鐘後,系統刷成功


 





相關文章
相關標籤/搜索