android編譯系統(tǒng)源碼

這里我們的手機是nesus5。用的是windows系統(tǒng)。打算編譯4.4.4

https://hub.docker.com/

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

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

image.png

桌面出現(xiàn)這三個圖標即為安裝完成

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

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

安裝vmware

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

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

安裝完之后 在虛擬機中將ubuntu設(shè)置成橋接模式
系統(tǒng)設(shè)置 –> 網(wǎng)絡(luò) –> 網(wǎng)絡(luò)代理 –> 在HTTP代理填寫主機的IP地址。這里主機是宿主機的ip。即我們的電腦的ip。

安裝jdk6

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

下載那個linux 64位的bin

  • 賦予777權(quán)限 然后安裝 桌面上會出來一個文件夾

  • 復(fù)制到別處

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 "you@example.com"

初始化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

image.png

下載并輸出

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

但是這里可能會掉線 不會重連??梢杂孟旅娴膕hell代碼

#!/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

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

下載驅(qū)動

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

image.png

找到相同的,然后下載

image.png

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

然后放到AOSP4.4的文件夾中 給與執(zhí)行權(quán)限 然后逐個執(zhí)行

image.png

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

image.png

三個都解壓完成


image.png

關(guān)聯(lián)代碼

source build/envsetup.sh 
image.png

其實就是include一些東西

選擇編譯目標

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

image.png

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
image.png

編譯

清理

make clobber
make -j8

出現(xiàn)下面是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

image.png

編譯成功就如上

image.png

編譯產(chǎn)生的文件 以及路徑如上

Build 結(jié)果的目錄結(jié)構(gòu) 所有的編譯產(chǎn)物都將位于 /out 目錄下,該目錄下主要有以下幾個子目錄: 

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

/out/target/common/:該目錄下包含了針對設(shè)備的共同的編譯產(chǎn)物,主要是 Java 應(yīng)用代碼和 Java 庫。 

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

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

Build 生成的鏡像文件 

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

system.img:包含了 Android OS 的系統(tǒng)文件庫,可執(zhí)行文件以及預(yù)置的應(yīng)用程序,將被掛載為根分區(qū)。 ? 

ramdisk.img:在啟動時將被 Linux 內(nèi)核掛載為只讀分區(qū),它包含了 /init 文件和一些配置文件。它用來掛載其他系統(tǒng)鏡像并啟動 init 進程。 

userdata.img:將被掛載為 /data,包含了應(yīng)用程序相關(guān)的數(shù)據(jù)以及和用戶相關(guān)的數(shù)據(jù)。

刷機

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

進入bootloader模式

image.png

或者使用命令進入

adb reboot bootloader

解鎖bootloader

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

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

對于老款設(shè)備(2014 年及之前發(fā)布的設(shè)備):
fastboot oem unlock

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

對于新款設(shè)備(2015 年及之后發(fā)布的設(shè)備):
fastboot flashing lock

對于老款設(shè)備(2014 年及之前發(fā)布的設(shè)備):
fastboot oem lock

刷機

set ANDROID_PRODUCT_OUT=G:\nexus5-4.4.4_r1\origin
fastboot flashall -w
刷機成功

如何刷原版系統(tǒng)

adb reboot bootloader

  fastboot flash bootloader bootloader-hammerhead-HHZ11d.img (請注意: 這行中的“bootloader-hammerhead-HHZ11d.img”是bootloader的名字,各位刷bootloader的時候改成文件夾中相應(yīng)的名字。下同?。?
  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

  這樣就刷完了,等待手機重啟就回到最初手機的狀態(tài)了。

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

  -- 如果你想恢復(fù)原廠bootloader的鎖定狀態(tài),請使用這個命令: fastboot oem lock

  -- 如果你想保持bootloader解鎖狀態(tài),那么選擇重啟手機好了。
  • 如果出現(xiàn)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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容