Android系統原始碼與核心下載編譯及刷機講解

Android系統原始碼與核心下載編譯及刷機講解

Android系統原始碼與核心下載編譯及刷機講解

  • 0.前言說明
  • 1.準備工作
  • 2.Android原始碼下載
  • 3.Android編譯環境搭建
  • 4.Android系統編譯
  • 5.Android核心下載
  • 6.Android核心編譯
  • 7.核心模組編譯

0.前言說明

  • 這是第一節課我選的題目,第二節課就要彙報PPT的,沒辦法自己課題組老師開的課,沒接觸過Android,也得硬著頭皮上。以為挺簡單的,就選了這個題目,後來週三開始做,週日上午才發給助教,最坑的就是學校限流量,下什麼都不捨得~期間多次打算換題,還好,堅持就會柳暗花明又一村。

1.準備工作

  • Android 由四個層組成:
    • Linux 核心(c/c )
    • 本地使用者空間native (c/c )
    • 應用程式框架層
    • 應用程式層(java)
      老師說她一般在kernel、native、framework層進行程式碼安全加固。
  • 選擇Android4.4,4.4系統優化較4.0,2.3明顯,且不算太大;20G,6.0的大約60G
  • 環境:
    • ①安裝虛擬機器Ubuntu16.04編譯快
      4G運存,CPU 4核心,80G硬碟(最後佔50G)
    • ②安裝samba檔案伺服器,進行檔案傳輸

2.Android原始碼下載

兩種方式:

  1. repo工具(批處理工具,一次下載多個git倉庫)
    • ①.安裝repo:
      mkdir ~/bin
      PATH=~/bin:$PATH
      下載repo指令碼:
      curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
      設定repo可執行許可權:
      chmod a x ~/bin/repo
    • ②.初始化repo客戶端
      建立AndroidCode目錄用來存放原始碼:
      mkdir AndroidCode
      cd AndroidCode
      執行repo下載原始碼:
      repo init -u https://android.googlesource.com/platform/manifest -b android-4.4_r1
      repo sync
      據說20個G,提供更新.repo檔案佔10個g,我們暫時用不到,所以採用第二種,並讓同學幫我分擔了一部分流量~
  2. 直接下載:百度雲下Android2.3到6.0的原始碼連結:
    http://blog.csdn.net/ilittleone/article/details/6823441
    是經過壓縮split分割過的,需要合併:
    cat droidSplit*>droid.tar.gz
    檔案校驗碼md5sum校驗檔案是否被改過:

    這裡寫圖片描述
    合併 解壓 耗時2h,期間CPU持續滿負荷執行

3.搭建Android編譯環境:

  1. 安裝一系列工具、依賴:
    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
    sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g -multilib
    sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
    sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
    sudo apt-get install git-core gnupg flex bison gperf build-essential
    sudo apt-get install zip curl zlib1g-dev gcc-multilib g -multilib
    sudo apt-get install libc6-dev-i386
    sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
    sudo apt-get install lib32z-dev ccache
    sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4

  2. 安裝jdk:
    Android4.4的原始碼編譯所使用的jdk為oracle jdk1.6。jdk一定要安裝1.6的最高版本,即jdk1.6.0_45,否則編譯中會報錯

    • 具體過程:
      在/usr/loacl目錄下建立jvm資料夾用來存放jdk:mkdir /usr/local/jvm
      複製到/usr/local/jvm中:cp jdk-6u45-linux-x64.bin /usr/local/jvm
      進入到/usr/local/jvm下,給.bin檔案一個可執行許可權
      chmod x jdk-6u45-linux-x64.bin
      執行.bin檔案進行安裝:./jdk-6u45-linux-x64.bin
      安裝成功後設定環境變數,開啟/etc/profile,新增如下幾行後儲存
      export JAVA_HOME=/usr/local/java/jdk1.6.0_45
      export JRE_HOME=/usr/local/java/jdk1.6.0_45/jre
      export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
      export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME:$PATH

      source /etc/profile後,輸入java -version,顯示java version “1.6.0_45”則成功
  3. 安裝make:
    由於ubuntu16.04自帶make版本過高,無法編譯。因此需要將make降至3.82版本,下載地址ftp://ftp.gnu.org/gnu/make/
    解壓:tar -zxvf make3.8.2.tar.gz
    然後進入make3.8.2目錄下:
    ./configure
    make
    make install
    執行完後在/usr/local/bin中可得到新的make,複製到/usr/bin中即可

4.編譯Android原始碼

  1. 環境初始化:
    ~.bashrc檔案末尾追加export USE_CCACHE = 1(加速編譯 )
    echo export USE_CCACHE=1 >> ~/.bashrc
    source ~/.bashrc
    匯入編譯Android原始碼所需的環境變數和其他引數:
    source build/envsetup.sh
    最後: make –j4(開啟四執行緒編譯)
    CPU滿負荷執行,3個多小時後,系統映象檔案 system.img、ramdisk.img和userdata.img
  2. 啟動模擬器://也可fastboot 刷Nexus真機
    source build/envsetup.sh
    lunch sdk-eng //載入sdk-eng,預設是full-eng
    (eng: 工程機,user:終端使用者機 userdebug:除錯測試機,tests:測試機)
    emulator
    啟動安卓自帶模擬器,也可以用Genymotion 安卓模擬器,啟動速度、執行速度都更快;
    我當時是以root身份編譯的,圖片中的編譯時間是23號,而我是23號晚上11點開始編譯,24號2點結束,所以是開始編譯的時間
    我當時是以root身份編譯的,圖片中的編譯時間是23號,而我是23號晚上11點開始編譯,24號2點結束,所以是開始編譯的時間。

5. Android核心下載

  1. 說明:Android原始碼包自帶一個編譯好的核心映象,看不到核心原始碼的。

  2. 下載kernel倉庫:還有支援HTC、三星、高通MSM等的核心,goldfish專門針對模擬器的。
    mkdir kernel
    cd kernel
    git clone https:// android.googlesource.com/kernel/goldfish.git
    宿舍網連Google不穩定,git clone不支援斷點續傳,so我用的是清華的源;
    可以看出清華的源是很給力的,另外同學告訴說可以開啟多執行緒下載,速度會更快!
    可以看出清華的源是很給力的,另外同學告訴說可以開啟多執行緒下載,平均速度可達5m/s!

  3. 確定核心版本:
    檢視所有分支:git branch –a
    遷出特定3.4核心程式碼:
    git checkout –b remotes/origin/android-goldfish-3.4

6. Android核心編譯

  1. 環境初始化:
    cd /usr/local/android/kernel/goldfish
    export ARCH=arm
    export SUBARCH=arm
    export CROSS_COMPILE=arm-eabi-
    export PATH=/usr/local/android/prebuilts/gcc/linux- x86/arm/arm-eabi-4.6/bin:$PATH
    make goldfish_armv7_defconfig //Android4.1以上平臺

    在核心原始碼根目錄下生成.config
  2. 核心裁剪:
    make menuconfig 來配置原始碼根目錄下的.config
    (這個命令在編譯Linux核心時也會用到)
    這是個錯誤,原因是我視窗化螢幕太小了,f11全屏即可
    這是個錯誤,原因是我視窗化螢幕太小了,f11全屏即可
    這是執行命令後出來的UI選擇功能介面
    這是執行命令後出來的UI選擇功能介面。

  3. 核心編譯:
    make -j4
    編譯結果~

    編譯後核心zImage存放在:./arch/arm/boot/zImage

  4. 檢視系統資訊:
    先設定模擬器的目錄到環境變數PATH中去:
    export PATH=$PATH:/usr/local/android/mydroid/out/host/linux-x86/bin
    選擇zImage核心啟動:emulator –kernel zImage &
    用adb工具連線模擬器:
    輸入adb shell進入
    cd proc
    cat version
    這是命令檢視
    這是用命令檢視。
    當然也可以開啟模擬器的設定介面,看到核心是3.4.67和之前的3.4.0不同,so編譯核心刷機成功
    當然也可以開啟模擬器的設定介面,看到核心是3.4.67和之前的3.4.0不同,so編譯核心刷機成功。

7. Android核心模組編譯

  1. 在/usr/local/android/kernel/goldfish/drivers/char/my_test/下,gedit hello.c
    hello.c程式
  2. 在my_test下,gedit makefile//編譯hello.c
    內容:obj-y := hello.o //內建編譯,還有個obj-m表示模組編譯,沒時間實現了~
  3. 在../char下,gedit Makefile //包含hello驅動
    加入:obj-y = my_test/hello.o
  4. 重新編譯,將hello驅動裝置編譯到核心中;
    make –j4
  5. 啟動後檢視核心狀態:
    emulator –kernel zImage –show-kernel &
    成功列印出hello,它是以drivers下的char字元驅動的形式實現的
    成功列印出hello,而且它是以drivers下的char字元驅動的形式實現的。

PS:期間查了很多Android安全的資料,發現好多遊戲的修改都是利用注入、hook技術實現,打算實現一個簡單的遊戲修改展示的。但由於時間和能力有限,以及編譯速度感人,只能退而求其次次,選擇Android核心的helloworld來展示。
PS:發部落格圖片上傳不方便~而且老卡。