android編譯系統源碼

這裏我們的手機是nesus5。用的是windows系統。打算編譯4.4.4

https://hub.docker.com/

首先先去docker註冊個賬號,下載個docker。

因爲我是win8.1
要用toolbox
https://github.com/docker/toolbox/releases
從這裏下載最新版。
如果是win10 直接下載官網800m的那個就行。

桌面出現這三個圖標即爲安裝完成

建議先用代理軟件代理商,然後
用管理員模式打開docker quick start。不過我這裏跑不成功。virtualbox有問題。一直不喜歡這個。

那麼沒辦法。不能用docker。就只能上虛擬機編譯了。

安裝vmware

首先安裝vmware。
然後下載一個ubuntu14.04 64位的鏡像。

然後進入漫長的安裝過程(我的機器太慢)

安裝完之後 在虛擬機中將ubuntu設置成橋接模式
系統設置 –> 網絡 –> 網絡代理 –> 在HTTP代理填寫主機的IP地址。這裏主機是宿主機的ip。即我們的電腦的ip。

安裝jdk6

https://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase6-419409.html

下載那個linux 64位的bin

  • 賦予777權限 然後安裝 桌面上會出來一個文件夾

  • 複製到別處

mkdir -p /usr/lib/jvm/

cp -r jdk1.6.0_45 /usr/lib/jvm/
  • 安裝jdk6
update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.0_45/bin/javac 1

update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_45/bin/java 1

update-alternatives --install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.6.0_45/bin/javaws 1

update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/jdk1.6.0_45/bin/jar 1

update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/jdk1.6.0_45/bin/javap 1

update-alternatives --install /usr/bin/javadoc javadoc /usr/lib/jvm/jdk1.6.0_45/bin/javadoc 1

update-alternatives --config javac

update-alternatives --config java

update-alternatives --config javaws

update-alternatives --config jar

update-alternatives --config javap

update-alternatives --config javadoc
  • 然後java javac java -version測試通過即可

安裝必要工具

sudo apt-get update

sudo apt install git

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 libgl1-mesa-dev libxml2-utils xsltproc unzip

sudo apt-get install python-dev

下載代碼

下載repo

清華鏡像步驟
mkdir ~/bin 
PATH=~/bin:$PATH 
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

谷歌步驟
mkdir ~/bin 
PATH=~/bin:$PATH 
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo

初始化git郵箱等

mkdir AOSP-android-4.4.4_r1
cd AOSP-android-4.4.4_r1
git config --global user.name "123" 
git config --global user.email "[email protected]"

初始化repo

鏡像的(默認下載master分支,後期也可以切換再下載)  
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
或者
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-4.4.4_r1


谷歌的(默認下載master分支,後期也可以切換再下載)  
repo init -u https://android.googlesource.com/platform/manifest
或者
repo init -u https://android.googlesource.com/platform/manifest -b android-4.4.4_r1

分支可以在這裏查看
https://source.android.google.cn/setup/build-numbers.html#source-code-tags-and-builds

下載並輸出

repo sync -j4 2>&1 | tee sync_log.txt

但是這裏可能會掉線 不會重連。可以用下面的shell代碼

#!/bin/bash
#LASTDAY=`date +%Y%m%d -d -1days`
#modify date format as 160202

fn_repo_sync()
{
    
    repo sync -j8 2>&1 | tee sync.log.txt
}

fn_get_source_code()
{
    echo "fn_get_source_code:$(pwd)"
    fn_repo_sync
    FETCH_ERROR=`grep -i "error: Exited sync " -A 1  sync.log.txt`
    echo  "${FETCH_ERROR}"
    while [ -n "${FETCH_ERROR}" ]
    do
        echo "需要重新拉取代碼"
        fn_repo_sync
        FETCH_ERROR=`grep -i "error:" -A 1  sync.log.txt`
    done
    echo "leave begin download source"
    #repo start ${DATE_TIME} --all
}



####================================================

fn_get_source_code

  • 出現 curl: (22) The requested URL returned error: 404 Not Found Server does not provide clone.bundle; ignoring. 怎麼辦?
    無視即可。

下載驅動

https://developers.google.cn/android/drivers#hammerhead

找到相同的,然後下載


我這個版本有三個 這三個解壓出來都是sh文件

然後放到AOSP4.4的文件夾中 給與執行權限 然後逐個執行

執行的時候會跟你說 你要先看lisence,然後會出來一個說明書 到了最後要輸入accept的字樣才能解壓。所以只能慢慢按(小提示,這裏我們可以按空格快速跳過說明)

三個都解壓完成


關聯代碼

source build/envsetup.sh 

其實就是include一些東西

選擇編譯目標

https://source.android.google.cn/setup/running.html#selecting-device-build

Buildtype Use
user limited access; suited for production
userdebug like "user" but with root access and debuggability; preferred for debugging
eng development configuration with additional debugging tools

lunch aosp_hammerhead-userdebug

編譯

清理

make clobber
make -j8

出現下面是javap沒配置

Gyp action: Generating resources from ui_resources.grd (out/target/product/hammerhead/obj/GYP/shared_intermediates/ui/ui_resources/grit/ui_resources.h)
Traceback (most recent call last):
  File "../../base/android/jni_generator/jni_generator.py", line 1103, in <module>
    sys.exit(main(sys.argv))
  File "../../base/android/jni_generator/jni_generator.py", line 1099, in main
    GenerateJNIHeader(input_file, output_file, options)
  File "../../base/android/jni_generator/jni_generator.py", line 1012, in GenerateJNIHeader
    jni_from_javap = JNIFromJavaP.CreateFromClass(input_file, options)
  File "../../base/android/jni_generator/jni_generator.py", line 520, in CreateFromClass
    stderr=subprocess.PIPE)
  File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory
make: *** [out/target/product/hammerhead/obj/GYP/shared_intermediates/ui/gl/jni/Surface_jni.h] Error 1


編譯成功就如上

編譯產生的文件 以及路徑如上

Build 結果的目錄結構 所有的編譯產物都將位於 /out 目錄下,該目錄下主要有以下幾個子目錄: 

/out/host/:該目錄下包含了針對主機的 Android 開發工具的產物。即 SDK 中的各種工具,例如:emulator,adb,aapt 等。 

/out/target/common/:該目錄下包含了針對設備的共同的編譯產物,主要是 Java 應用代碼和 Java 庫。 

/out/target/product/<product_name>/:包含了針對特定設備的編譯結果以及平臺相關的 C/C++ 庫和二進制文件。其中,<product_name>是具體目標設備的名稱。

/out/dist/:包含了爲多種分發而準備的包,通過“make disttarget”將文件拷貝到該目錄,默認的編譯目標不會產生該目錄。

Build 生成的鏡像文件 

Build 的產物中最重要的是三個鏡像文件,它們都位於 /out/target/product/<product_name>/ 目錄下。  這三個文件是:  

system.img:包含了 Android OS 的系統文件庫,可執行文件以及預置的應用程序,將被掛載爲根分區。 ? 

ramdisk.img:在啓動時將被 Linux 內核掛載爲只讀分區,它包含了 /init 文件和一些配置文件。它用來掛載其他系統鏡像並啓動 init 進程。 

userdata.img:將被掛載爲 /data,包含了應用程序相關的數據以及和用戶相關的數據。

刷機

我這裏將刷機文件拷貝到windows上刷機

進入bootloader模式

或者使用命令進入

adb reboot bootloader

解鎖bootloader

解鎖新款設備
自 2014 年以來發布的所有 Nexus 和 Pixel 設備(從 Nexus 6 和 Nexus 9 開始)都內置有恢復出廠設置保護功能,需要通過多個步驟才能解鎖引導加載程序。

要在設備上啓用 OEM 解鎖功能,請執行以下操作:
在“設置”中,點按關於手機,然後點按版本號七 (7) 次。
當看到“您已處於開發者模式”這條消息後,點按返回按鈕。
點按開發者選項,然後啓用 OEM 解鎖和 USB 調試(如果 OEM 解鎖處於停用狀態,請連接到互聯網,以便設備可以至少簽到一次。如果 OEM 解鎖仍處於停用狀態,則說明您的設備可能已被運營商鎖定 SIM 卡,系統無法解鎖引導加載程序)。
重新啓動進入引導加載程序,然後使用 fastboot 解鎖。
對於新款設備(2015 年及之後發佈的設備):
fastboot flashing unlock

對於老款設備(2014 年及之前發佈的設備):
fastboot oem unlock

在屏幕上確認解鎖。
注意:在 Nexus 10 上,解鎖引導加載程序後,內部存儲空間仍將保持未格式化狀態。您可以依次使用 fastboot format cache 和 fastboot format userdata 來格式化設備。
重新鎖定引導加載程序
要重新鎖定引導加載程序,請執行以下命令:

對於新款設備(2015 年及之後發佈的設備):
fastboot flashing lock

對於老款設備(2014 年及之前發佈的設備):
fastboot oem lock

刷機

set ANDROID_PRODUCT_OUT=G:\nexus5-4.4.4_r1\origin
fastboot flashall -w

如何刷原版系統

adb reboot bootloader

  fastboot flash bootloader bootloader-hammerhead-HHZ11d.img (請注意: 這行中的“bootloader-hammerhead-HHZ11d.img”是bootloader的名字,各位刷bootloader的時候改成文件夾中相應的名字。下同!)

  fastboot reboot-bootloader

  fastboot flash radio radio-hammerhead-M8974A-1.0.25.0.17.img (請注意: 把“radio-hammerhead-M8974A-1.0.25.0.17.img”改成你的文件名。)

  fastboot reboot-bootloader

  fastboot -w update image-hammerhead-krt16m.zip (請注意: 把“image-hammerhead-krt16m.zip”改成你的文件名。)

  fastboot reboot-bootloader

  這樣就刷完了,等待手機重啓就回到最初手機的狀態了。

  -- 如果你是Mac電腦,請確保在每行命令前添加“./” (比如:./fastboot reboot-bootloader)

  -- 如果你想恢復原廠bootloader的鎖定狀態,請使用這個命令: fastboot oem lock

  -- 如果你想保持bootloader解鎖狀態,那麼選擇重啓手機好了。
  • 如果出現Writing 'userdata' FAILED (remote: 'Bogus size sparse and chunk header')
1) extract image-hammerhead-m4b30z.zip

2) cd to the extracted folder

3) run the following commands (one by one)
fastboot erase userdata
fastboot flash userdata userdata.img
fastboot erase cache
fastboot flash cache cache.img
fastboot reboot

則手動刷那幾個部分

刷入過大可以用-S

fastboot -S 50M flash system system.img
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章