下載AOSP源碼編譯、調(diào)試新思、刷機(jī)

一.準(zhǔn)備工作

  • 系統(tǒng)最好是Linux或者mac OS(本文基于Ubuntu)窖梁。
  • Ubuntu設(shè)置永不休眠,在setting中搜索power.blank-screen選擇never夹囚。
  • 一塊大一點(diǎn)兒的硬盤窄绒,至少得有200G剩余空間。

二.下載Aosp源碼

1.安裝GIT

首先需要安裝Git崔兴,因?yàn)樵创a是用Git管理的彰导。
sudo apt-get install git
接下來(lái)創(chuàng)建一個(gè)bin文件夾,并加入到PATH中敲茄,有點(diǎn)像Windows的環(huán)境變量位谋。
mkdir ~/bin
PATH=~/bin:$PATH
然后初始化Git,郵箱和姓名堰燎。
git config --global user.email "xxx@gmail.com"
git config --global user.name "xxx"

2.安裝Python環(huán)境

sudo apt-get install python

3.安裝repo及配置

repo 是一個(gè)python 腳本(所以我們上面要配置Python環(huán)境)掏父,因?yàn)锳ndroid源碼包含數(shù)百個(gè)git庫(kù),簡(jiǎn)化幫助管理git Android版本庫(kù)的工具秆剪。

(1.)安裝curl下載的庫(kù):
sudo apt-get install curl
(2.)下載repo并設(shè)置可以運(yùn)行權(quán)限赊淑。
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
(3.)添加下載源。

google 的AOSP 的話仅讽,因?yàn)镕Q和數(shù)據(jù)量太大陶缺,且需要需要翻墻影響速度,因此優(yōu)先考慮國(guó)內(nèi)的鏡像(本文使用的是清華的源)洁灵。

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

4.初始化及同步源碼

(1.)創(chuàng)建文件夾

創(chuàng)建一個(gè)AOSP文件夾饱岸,cdd到文件夾里面去待會(huì)兒需要把源碼下載到這里:

mkdir aosp
cd aosp
(2.)初始化Aosp倉(cāng)庫(kù)
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
(3.)初始化并指定版本
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.0_r36

AOSP對(duì)應(yīng)關(guān)系查看地址: 對(duì)應(yīng)關(guān)系

(4.)開始同步源碼
repo sync -j4

-j表示并發(fā)數(shù).

因?yàn)锳ndroid的源碼越來(lái)越大,repo sync失敗的概率也越來(lái)越高徽千。所以我們可以避開使用repo sync的方式苫费,而采用下載預(yù)下載包的方式來(lái)實(shí)現(xiàn)下載源碼。

5.預(yù)下載包的方式

1. 下載預(yù)下載包

在windows或者Linux上面通過迅雷下載https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar双抽。

wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar #下載初始化包
2. 解壓預(yù)下載包
tar xf aosp-latest.tar

cd AOSP->解壓得到的 AOSP 工程目錄百框,這時(shí) ls 的話什么也看不到,因?yàn)橹挥幸粋€(gè)隱藏的 .repo 目錄

3. 查看分支
cd .repo/manifests 
git branch -a
4. 在aosp目錄選擇需要同步的版本
repo init -b android-9.0.0_r55
repo sync # 正常同步一遍即可得到完整目錄

或者直接在aosp目錄設(shè)置好你要同步的分支:

repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.0_r36
repo sync  # 正常同步一遍即可得到完整目錄

如果僅加載具體模塊:

repo sync platform/prebuilts/clang/host/darwin-x86

6.防止下載源碼執(zhí)行腳本卡死

通過自定義Shell腳本啟動(dòng)源碼下載可以有效防止牍汹,同步源碼時(shí)腳本被卡死的問題铐维。

(1.)在AOSP文件夾中新建down.sh文件
#!/bin/bash
echo “======= start repo sync =======”
cd ~/Desktop/AOSP
repo sync -j4
while [ $? == 1 ]; do
echo “====== sync failed! re-sync again =====”
sleep 3
repo sync -j4
(2.)執(zhí)行down.sh文件
sh down.sh

三.AOSP源碼目錄結(jié)構(gòu)

  • abi Application Binary Interface 應(yīng)用程序二進(jìn)制接口柬泽,abi相信同學(xué)們?cè)赟O庫(kù)調(diào)用上遇到過,如果不支持該平臺(tái)的話就說不ABI不支持方椎。
  • art Android Runtime 安卓運(yùn)行時(shí)。這個(gè)會(huì)提前把字節(jié)碼編譯成二進(jìn)制機(jī)器碼保存起來(lái)钧嘶,執(zhí)行的時(shí)候加載速度比較快棠众。Dalvik虛擬機(jī)則是在加載以后再去編譯的,所以速度上ART會(huì)比Dalvik快一點(diǎn)有决。犧牲空間來(lái)贏取時(shí)間闸拿。
  • bionic 基礎(chǔ)庫(kù),Android系統(tǒng)與Linux內(nèi)核的橋梁书幕。Bionic 音標(biāo)為 bī??nik新荤,翻譯為"仿生"。
  • bootable 系統(tǒng)啟動(dòng)引導(dǎo)相關(guān)程序
  • build 用于構(gòu)建Android系統(tǒng)的工具台汇,也就是用于編譯Android系統(tǒng)的
  • cts Compatibility Test Suite 兼容性測(cè)試
  • dalvik dalvik虛擬機(jī)苛骨,用于解析執(zhí)行dex文件的虛擬機(jī)
  • developers 開發(fā)者目錄
  • developerment 開發(fā)目錄,比如說應(yīng)用苟呐,application就在里面了痒芝,apps
  • devices 設(shè)備相關(guān)的配置信息,什么索尼牵素、HTC严衬、自己的產(chǎn)品,就可以定義在這個(gè)目錄下了
  • docs 文檔
  • external 開源模組相關(guān)文件
  • frameworks 系統(tǒng)架構(gòu)笆呆,Android的核心了
  • hardware hal層代碼请琳,硬件抽象層
  • libcore 核心庫(kù)
  • libnativehelper native幫助庫(kù),實(shí)現(xiàn)JNI的相關(guān)文件
  • ndk native development kit
  • out 輸出目錄赠幕,編譯以后生成的目錄俄精,相關(guān)的產(chǎn)出就在這里了
  • packages 應(yīng)用程序包。一些系統(tǒng)的應(yīng)用就在這里了榕堰,比如說藍(lán)牙嘀倒,Launcher,相機(jī)局冰,撥號(hào)之類的测蘑。
  • pdk Plug-in Development Kit (PDK) is designed to help you build your own pattern projects
  • platform_testing 平臺(tái)測(cè)試
  • prebuilts x86/arm架構(gòu)下預(yù)編譯的文件
  • sdk software development kit
  • system 底層系統(tǒng)文件
  • toolchain 工具鏈
  • tools 工具文件
  • Makefile mk文件,用于控制編譯

四.AOSP源碼整編

編譯AOSP源碼需要配置好JAVA環(huán)境.

1.安裝Java編譯環(huán)境

sudo apt-get update
sudo apt-get install openjdk-8-jdk

2.進(jìn)入AOSP文件夾康二,進(jìn)行編譯

(1.)初始化編譯環(huán)境
source build/envsetup.sh
(2.)刪除上一次編譯的結(jié)果碳胳,初次編譯可以不需要這一步

make clobber

(3.)選擇與設(shè)備對(duì)應(yīng)的編譯版本

lunch XX

選擇與設(shè)備對(duì)應(yīng)的編譯版本.如:編譯開發(fā)工程師的版本lunch aosp_x86-eng,可以方便debug
編譯版本選擇

如果lunch命令沒有加對(duì)應(yīng)的編譯版本則會(huì)有以下信息輸出:

You're building on Linux

Lunch menu... pick a combo:
 1. aosp_arm-eng
 2. aosp_arm64-eng
 3. aosp_mips-eng
 4. aosp_mips64-eng
 5. aosp_x86-eng
 6. aosp_x86_64-eng
 7. full_fugu-userdebug
 8. aosp_fugu-userdebug
 9. mini_emulator_arm64-userdebug
 10. m_e_arm-userdebug
 11. m_e_mips64-eng
 12. m_e_mips-userdebug
 13. mini_emulator_x86_64-userdebug
 14. mini_emulator_x86-userdebug
 15. aosp_dragon-userdebug
 16. aosp_dragon-eng
 17. aosp_marlin-userdebug
 18. aosp_sailfish-userdebug
 19. aosp_flounder-userdebug
 20. aosp_angler-userdebug
 21. aosp_bullhead-userdebug
 22. hikey-userdebug
 23. aosp_shamu-userdebug

Which would you like? [aosp_arm-eng] 

這里需要選擇編譯目標(biāo)的格式(選擇前面的序號(hào)沫勿,按回車即可)挨约,編譯目標(biāo)的格式組成為BUILD-BUILDTYPE味混,比如aosp_arm-eng的BUILD為aosp_arm,BUILDTYPE為eng诫惭。 其中BUILD表示編譯出的鏡像可以運(yùn)行在什么環(huán)境翁锡,aosp代表Android開源項(xiàng)目,arm表示系統(tǒng)是運(yùn)行在arm架構(gòu)的處理器上夕土。 更多參考官方文檔文檔馆衔。
BUILDTYPE 指的是編譯類型,有以下三種:

  • user:用來(lái)正式發(fā)布到市場(chǎng)的版本怨绣,權(quán)限受限角溃,如沒有 root 權(quán)限,不能 dedug篮撑,adb默認(rèn)處于停用狀態(tài)减细。
  • userdebug:在user版本的基礎(chǔ)上開放了 root 權(quán)限和 debug 權(quán)限,adb默認(rèn)處于啟用狀態(tài)赢笨。一般用于調(diào)試真機(jī)未蝌。
  • eng:開發(fā)工程師的版本,擁有最大的權(quán)限(root等)茧妒,具有額外調(diào)試工具的開發(fā)配置树埠。一般用于模擬器。
    如果你沒有Nexus設(shè)備嘶伟,只想編譯完后運(yùn)行在模擬器查看怎憋,那么BUILD可以選擇aosp_x86,BUILDTYPE選擇eng九昧。
(4.)開始編譯
make -j8

j后面數(shù)字幾就是多少線程绊袋,最多不超過你的cpu總線程,
編譯成功會(huì)顯示如下:

Creating filesystem with parameters:
    Size: 2147483648
    Block size: 4096
    Blocks per group: 32768
    Inodes per group: 8192
    Inode size: 256
    Journal blocks: 8192
    Label: system
    Blocks: 524288
    Block groups: 16
    Reserved block group size: 127
Created filesystem with 2216/131072 inodes and 199826/524288 blocks
[100% 7669/7669] Install system fs ima.../target/product/generic_x86/system.img
out/target/product/generic_x86/system.img+ maxsize=2192446080 blocksize=2112 total=2147483648 reserve=22146432

#### make completed successfully (01:24:41 (hh:mm:ss)) ####

會(huì)在源碼跟目錄out/target/product/angler目錄下生成鏡像文件:

  • system.img:系統(tǒng)鏡像
  • ramdisk.img:根文件系統(tǒng)鏡像
  • userdata.img:用戶數(shù)據(jù)鏡像
  • recovery.img:recovery鏡像
  • boot.img:啟動(dòng)鏡像
  • vendor.img:驅(qū)動(dòng)鏡像

最終會(huì)在 out/target/product/generic_x86/目錄生成了三個(gè)重要的鏡像文件: system.img铸鹰、userdata.img癌别、ramdisk.img。大概介紹著三個(gè)鏡像文件:

  • system.img:系統(tǒng)鏡像蹋笼,里面包含了Android系統(tǒng)主要的目錄和文件展姐,通過init.c進(jìn)行解析并mount掛載到/system目錄下。
  • userdata.img:用戶鏡像剖毯,是Android系統(tǒng)中存放用戶數(shù)據(jù)的圾笨,通過init.c進(jìn)行解析并mount掛載到/data目錄下。
  • ramdisk.img:根文件系統(tǒng)鏡像逊谋,包含一些啟動(dòng)Android系統(tǒng)的重要文件擂达,比如init.rc。

3.編譯錯(cuò)誤解決

(1.)缺少libncurses.so.5

報(bào)錯(cuò)信息:
error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
解決方式:

sudo apt-get update

for 32-bit binaries :

sudo apt-get install libncurses5:i386

for 64-bit binaries :

sudo apt-get install libncurses5
(2.)缺少M(fèi)4

報(bào)錯(cuò)信息:
/bin/bash: m4: command not found
解決方式:

sudo apt-get install m4
(3.)去除所有本地化設(shè)置

報(bào)錯(cuò)信息:
FAILED: out/host/linux-x86/obj/EXECUTABLES/checkpolicy_intermediates/policy_scan.c
解決方法:

export LC_ALL=C

LC_ALL=C 是為了去除所有本地化的設(shè)置胶滋,讓命令能正確執(zhí)行板鬓, 但是不可以修改~/.bashrc悲敷,會(huì)導(dǎo)致終端內(nèi)中文顯示為數(shù)字(應(yīng)該是對(duì)應(yīng)的編碼)

(4.)jack-server的問題

jack server交互命令:

 jack-admin start-server
 jack-admin kill-server
 jack-admin list-server
 jack-admin uninstall-server
 mm -j32 showcommands &> mm.out
 jack-admin install-server jack-launcher.jar  jack-server-4.8.ALPHA.jar
 jack-admin dump-report
 jack-admin dump-re
 jack-admin server-log  查找log所在目錄

問題一:多用戶同時(shí)編譯時(shí)報(bào)錯(cuò)
錯(cuò)誤信息:

FAILED: setup-jack-server
/bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar  2>&1 || (exit 0) ) && (JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8 -XX:+TieredCompilation\" prebuilts/sdk/tools/jack-admin start-server 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update server prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar 4.11.ALPHA 2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.31.CANDIDATE.jar 4.31.CANDIDATE || exit 47 )"
Jack server already installed in "/home/disk/lixialong/.jack-server"
Communication error with Jack server (35), try 'jack-diagnose' or see Jack server log
SSL error when connecting to the Jack server. Try 'jack-diagnose'
SSL error when connecting to the Jack server. Try 'jack-diagnose'

解決方案:同時(shí)修改HOME/.jack-settings和HOME/.jack-server/config.properties中的端口號(hào)(比如都改為8386/8387,端口號(hào)值為0~65535俭令,1024下的值不要用)后德,方可支持多用戶同時(shí)編譯。
查看端口是否一致:cat ~/.jack-server/config.properties|grep -i port && cat ~/.jack|grep -i port|grep -v LOG &&cat ~/.jack-settings|grep -i port

  1. $HOME/.jack-settings
SERVER_PORT_SERVICE=8386
SERVER_PORT_ADMIN=8387
  1. $HOME/.jack-server/config.properties
jack.server.service.port=8386
jack.server.admin.port=8387
  1. $HOME/.jack
SERVER_PORT_SERVICE=8288
SERVER_PORT_ADMIN=8289

問題二: No Jack server running. Try 'jack-admin start-server'
錯(cuò)誤信息

com.android.jack.server.api.v01.ServerException: './config.properties' musthave permission rw------- but have rwx------
Caused by: java.io.IOException: './config.properties' must have permissionrw------- but have rwx------
... 

解決方案:通過查看文件 HOME/.jack-server/logs/jack-server-0-0.log: 發(fā)現(xiàn)是配置文件的權(quán)限不對(duì)造成的抄腔,把文件HOME/.jack-server/config.properties的權(quán)限由rwx改為rw即可解決問題瓢湃。
問題三:未配置變量信息導(dǎo)致問題
錯(cuò)誤信息:

ERROR: Communication error with Jack server (52) make: *** [out/target/common/obj/JAVA_LIBRARIES/libutil_intermediates/classes.jack] Error

這種情況多半屬于jack-admin缺少變量JACK_JAR而導(dǎo)致的。

解決方案:
工程根目錄內(nèi)執(zhí)行以下三句妓柜,再進(jìn)行編譯箱季。

export JACK_JAR=./out/host/linux-x86/framework/jack.jar

./out/host/linux-x86/bin/jack-admin stop-server

./out/host/linux-x86/bin/jack-admin start-server

問題四:TLSv1涯穷, TLSv1.1 禁用
報(bào)錯(cuò)信息:

Ensuring Jack server is installed and started

解決方式:

sudo vim /etc/java-8-openjdk/security/java.security

vim里面輸入/搜索jdk.tls.disabledAlgorithms= 將TLSv1棍掐, TLSv1.1 光標(biāo)選中輸入x刪除掉取消禁用.然后wq保存.
修改后:

jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
    DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
    include jdk.disabled.namedCurves

aosp/prebuilts/sdk/tools/ 目錄下執(zhí)行./jack-admin kill-server && ./jack-admin start-server 成功。

(4.)xmllint的問題

報(bào)錯(cuò)信息:
/bin/bash: xmllint: command not found
解決方案:

sudo apt-get  install libxml2-utils
(5.)編譯內(nèi)存不足

報(bào)錯(cuò)信息

Try increasing heap size with java option '-Xmx<size>'錯(cuò)誤

解決方案:

export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g"
jack-admin kill-server
jack-admin start-server

五.運(yùn)行模擬器

1.啟動(dòng)模擬器

在編譯完成之后拷况,就可以通過以下命令運(yùn)行Android虛擬機(jī)了作煌,由于之前已經(jīng)執(zhí)行過source和lunch命令了,可以直接運(yùn)行:

source build/envsetup.sh
lunch aosp_x86-eng
emulator

就會(huì)啟動(dòng)模擬器了.

2.啟動(dòng)模擬器失敗

嘗試使用-verbose選項(xiàng)(即“emulator -verbose”)赚瘦,這將打印模擬器正在做什么/正在探測(cè)哪些文件粟誓,并給出有關(guān)錯(cuò)誤的更多詳細(xì)信息。
emulator -use-system-libs
啟動(dòng)模模擬器報(bào)錯(cuò):

emulator: ERROR: x86_64 emulation currently requires hardware acceleration!
Please ensure KVM is properly installed and usable.
CPU acceleration status: This user doesn't have permissions to use KVM (/dev/kvm)
  1. 安裝 Qemu-KVM 和 cpu-checker
sudo apt-get install qemu-kvm cpu-checker
sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
  1. 查看系統(tǒng) KVM 是否可用
$ kvm-ok
  INFO: /dev/kvm exists
  KVM acceleration can be used
  1. 創(chuàng)建 kvm 用戶組并把當(dāng)前登錄用戶(如 peng )添加到 kvm 用戶組
sudo addgroup kvm
sudo usermod -a -G kvm peng
  1. 改變 /dev/kvm 用戶組為 kvm
sudo chgrp kvm /dev/kvm
  1. 創(chuàng)建 udev rule起意,并寫入 KERNEL=="kvm", GROUP="kvm", MODE="0660"
sudo gedit /etc/udev/rules.d/60-qemu-kvm.rules
KERNEL=="kvm", GROUP="kvm", MODE="0660"
  1. 重啟ubuntu系統(tǒng)然后運(yùn)行emulator

六.AOSP源碼編譯某個(gè)單獨(dú)的模塊

上面的編譯我們都是對(duì)整個(gè)Android系統(tǒng)進(jìn)行編譯的.如果我們要編譯系統(tǒng)的Settings應(yīng)用模塊鹰服,這就屬于源碼單編某一個(gè)模塊.
在AOSP根目錄執(zhí)行:

source build/envsetup.sh
lunch aosp_x86-eng

進(jìn)入Settings的目錄:

cd packages/apps/Settings

通過mm編譯當(dāng)前目錄下的模塊,不編譯依賴模塊揽咕。

mm

編譯成功后會(huì)有提示生成文件的存放路徑悲酷。除了Settings.odex文件,還會(huì)在out/target/product/generic_x86/system/priv-app/Settings目錄下生成Settings.apk亲善。
此外還有以下命令可以進(jìn)行單編:

  • mmm:編譯指定目錄下的模塊设易,不編譯它所依賴的其它模塊。
  • mma:編譯當(dāng)前目錄下的模塊及其依賴項(xiàng)蛹头。
  • mmma:編譯指定路徑下所有模塊顿肺,并且包含依賴。

如果對(duì)系統(tǒng)模塊的源碼進(jìn)行修改渣蜗,查看生成的APK文件屠尊,有兩種方式:

  • 通過adb push或者adb install 來(lái)安裝APK。
  • 使用make snod命令耕拷,重新生成 system.img知染,運(yùn)行模擬器查看。

七.導(dǎo)入源碼到AS

1.編譯idegen模塊斑胜,生成IDE項(xiàng)目文件

在源碼中控淡,存在idegen模塊嫌吠,該模塊專門用來(lái)為idea工具生成系統(tǒng)源碼的project.默認(rèn)情況下aosp編譯并不會(huì)生成該文件。
在開始編譯該模塊之前掺炭,首先確保你已經(jīng)編譯過Android源碼了辫诅,如果沒有,先要進(jìn)行AOSP編譯.和編譯普通的模塊一樣涧狮,我們用mmm命令編譯idegen.
在開始編譯之前炕矮,檢查out/host/linux-x86/framework/目錄下是否存在idegen.jar文件,存在則說明你已經(jīng)編譯過該模塊者冤,否者肤视,則需要編譯.執(zhí)行如下命令即可:

source build/envsetup.sh 將腳本添加到系統(tǒng)內(nèi)
lunch 并選擇要編譯的項(xiàng)目
mmm development/tools/idegen/ 
sudo ./development/tools/idegen/idegen.sh

其中mmm development/tools/idegen/執(zhí)行完成后會(huì)生成idegen.jar,而sodo ./development/tools/idegen/idegen.sh則會(huì)在源碼目錄下生成IEDA工程配置文件:android.ipr涉枫,android.iml及android.iws.

簡(jiǎn)單的說明一下這三個(gè)文件的作用:

  • android.ipr:通常是保存工程相關(guān)的設(shè)置邢滑,比如編譯器配置,入口愿汰,相關(guān)的libraries等
  • android.iml:則是主要是描述了modules困后,比如modules的路徑,依賴關(guān)系等.
  • android.iws:則主要是包含了一些個(gè)人工作區(qū)的設(shè)置.

"android.iml"和"android.ipr"一般是"只讀"的屬性衬廷,我們這里建議大家摇予,把這兩個(gè)文件改成可讀可寫,否則吗跋,在更改一些項(xiàng)目配置的時(shí)候可能會(huì)出現(xiàn)無(wú)法保存的情況侧戴,執(zhí)行如下兩條命令即可。

sudo chmod 777 android.iml
sudo chmod 777 android.ipr

2 導(dǎo)入源碼到AndroidStudio

(1.)配置AS

IDE內(nèi)存優(yōu)化
因?yàn)樵创a數(shù)量非常多跌宛,所以導(dǎo)入時(shí)IDEA/AS會(huì)需要大量?jī)?nèi)存酗宋。所以我們需要編輯IDE的VM選項(xiàng)。配置文件為

IDEA的是IDEA_HOME/bin/idea.vmoptions
AS的是AS_HOME/bin/studio.vmoptions
注意秩冈,AS有一個(gè)64位版本的配置文件studio64.vmoptions最好一并修改了本缠。

找到上面的配置文件,將對(duì)應(yīng)的內(nèi)容修改為

-Xms748m -Xmx748m

即將VM的堆內(nèi)存最小和最大都設(shè)置為748m入问。官方要求至少在748m以上丹锹,根據(jù)實(shí)際情況進(jìn)行配置即可

(2.)導(dǎo)入源碼

接下來(lái),我們導(dǎo)入源碼:打開Android Studio芬失,點(diǎn)擊File->Open楣黍,選擇剛才生成的android.ipr文件即可,然后就是漫長(zhǎng)的等待棱烂,注意此時(shí)是將源碼完全導(dǎo)入到AS中了租漂。
如果AS運(yùn)行比較慢我們就需要排除一些不需要導(dǎo)入的模塊。

(3.) 排除模塊

很多情況下,我們希望不導(dǎo)入某些模塊哩治,那么就可以在導(dǎo)入前修改android.iml文件秃踩,通過添加配置的方式告訴AS不導(dǎo)入某些模塊,比如現(xiàn)在我不想導(dǎo)入art模塊业筏,那么就在android.iml文件中添加:

<excludeFloder url="file://$MODULE_DIR$"/abi>

不難發(fā)現(xiàn)憔杨,其格式為:<excludeFloder url="file://$MODULE_DIR$"/模塊名>

注:編譯生成的android.iml文件中已經(jīng)默認(rèn)排除了一些模塊,通過搜索excludeFolder關(guān)鍵字可找到.

如果比較關(guān)心framworks和packages模塊蒜胖,則保留framworks和packages模塊消别,將其他模塊全部排除,在android.iml中添加了以下配置:

      <excludeFolder url="file://$MODULE_DIR$/.repo" />
      <excludeFolder url="file://$MODULE_DIR$/abi" />
      <excludeFolder url="file://$MODULE_DIR$/art" />
      <excludeFolder url="file://$MODULE_DIR$/bionic" />
      <excludeFolder url="file://$MODULE_DIR$/bootable" />
      <excludeFolder url="file://$MODULE_DIR$/build" />
      <excludeFolder url="file://$MODULE_DIR$/cts" />
      <excludeFolder url="file://$MODULE_DIR$/dalvik" />
      <excludeFolder url="file://$MODULE_DIR$/developers" />
      <excludeFolder url="file://$MODULE_DIR$/development" />
      <excludeFolder url="file://$MODULE_DIR$/device" />
      <excludeFolder url="file://$MODULE_DIR$/docs" />
      <excludeFolder url="file://$MODULE_DIR$/external" />
      <excludeFolder url="file://$MODULE_DIR$/external/bluetooth" />
      <excludeFolder url="file://$MODULE_DIR$/external/chromium" />
      <excludeFolder url="file://$MODULE_DIR$/external/emma" />
      <excludeFolder url="file://$MODULE_DIR$/external/icu4c" />
      <excludeFolder url="file://$MODULE_DIR$/external/jdiff" />
      <excludeFolder url="file://$MODULE_DIR$/external/webkit" />
      <excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
      <excludeFolder url="file://$MODULE_DIR$/frameworks/base/extension" />
      <excludeFolder url="file://$MODULE_DIR$/hardware" />
      <excludeFolder url="file://$MODULE_DIR$/kernel" />
      <excludeFolder url="file://$MODULE_DIR$/kernel-3.18" />
      <excludeFolder url="file://$MODULE_DIR$/libcore" />
      <excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
      <excludeFolder url="file://$MODULE_DIR$/ndk" />
      <excludeFolder url="file://$MODULE_DIR$/oem-release" />
      <excludeFolder url="file://$MODULE_DIR$/out" />
      <excludeFolder url="file://$MODULE_DIR$/out/eclipse" />
      <excludeFolder url="file://$MODULE_DIR$/out/host" />
      <excludeFolder url="file://$MODULE_DIR$/out/target/common/docs" />
      <excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates" />
      <excludeFolder url="file://$MODULE_DIR$/out/target/product" />
      <excludeFolder url="file://$MODULE_DIR$/pdk" />
      <excludeFolder url="file://$MODULE_DIR$/platform_testing" />
      <excludeFolder url="file://$MODULE_DIR$/prebuilt" />
      <excludeFolder url="file://$MODULE_DIR$/prebuilts" />
      <excludeFolder url="file://$MODULE_DIR$/rc_projects" />
      <excludeFolder url="file://$MODULE_DIR$/sdk" />
      <excludeFolder url="file://$MODULE_DIR$/system" />
      <excludeFolder url="file://$MODULE_DIR$/tools" />
      <excludeFolder url="file://$MODULE_DIR$/trusty" />
      <excludeFolder url="file://$MODULE_DIR$/vendor" />

完成之后台谢,按照上面說的步驟寻狂,使用Android Studio選中"android.ipr"打開項(xiàng)目即可。

等項(xiàng)目加載完成后朋沮,我們還可以通過Android Studio對(duì)Exclude的Module進(jìn)行調(diào)整蛇券,所以也不用害怕這里Exclude掉了有用的代碼,或少Exclude了一部分代碼朽们,在項(xiàng)目加載完以后再進(jìn)行調(diào)整就行了怀读。此處和在android.iml文件中添加excludeFolder 的功能是一樣的诉位;

打開"Project Structure"骑脱,中間的窗口選擇"android",在彈出的窗口中左邊欄中選擇"Modules"苍糠,而后在右邊的窗口中選擇"Sources"叁丧。
在這里我們可以看到項(xiàng)目的所有代碼目錄,我們可以選中不需要的module岳瞭,并點(diǎn)擊上面的"Excluded"按鈕拥娄,當(dāng)被選中的目錄變?yōu)槌壬幢硎就瓿蒃xclude操作瞳筏;
如果想要取消對(duì)某代碼目錄的Exclude操作稚瘾,選中該目錄,再次點(diǎn)擊"Excluded"按鈕姚炕,等待目錄變?yōu)樗{(lán)色即可摊欠。


(3.) 配置源碼正確跳轉(zhuǎn)

當(dāng)我們導(dǎo)入完源碼后,就可以查看整個(gè)系統(tǒng)的源碼柱宦,但是有個(gè)問題些椒,打開的Java代碼,查看集成關(guān)系或者調(diào)用關(guān)系的時(shí)候掸刊,還是會(huì)跳轉(zhuǎn)到.class文件中免糕,而不是相應(yīng)的Java類,
比如PhoneWindow.java繼承了Window.java,但是我們跳轉(zhuǎn)的時(shí)候卻跳到了Window.class石窑,并沒有跳轉(zhuǎn)到frameworks目錄下對(duì)應(yīng)的源碼類牌芋,而是jar包中的類。
我們需要讓其跳轉(zhuǎn)到相應(yīng)的類中松逊。我們就需要新建一個(gè)沒有任何jar庫(kù)的SDK給到系統(tǒng)源碼項(xiàng)目的依賴姜贡, 這里的配置JDK/SDK,是用于解決在分析和調(diào)試源碼的過程棺棵,能正確地跳轉(zhuǎn)到目標(biāo)源碼楼咳,
而非SDK中的代碼。

  • 新建JDK
    Project Structure -> SDKs烛恤, 新建 JDK母怜, 其中JDK目錄可選擇跟原本JDK一致即可,任意取一個(gè)名字缚柏,這里取empty_jdk 然后刪除這里取empty_jdk其classpath和SourcePath的內(nèi)容苹熏,確保使用Android系統(tǒng)源碼文件



    jdk_none

  • 配置SDK
    Project Structure -> SDKs, 選中與自己編譯的AOSP對(duì)應(yīng)的SDk版本(如果沒有對(duì)應(yīng)的就到SDKmanager里面取下載一個(gè)對(duì)應(yīng)的版本) Android API 28 Platform币喧, 然后選擇其Java SDK為前面新建的empty_jdk



    sdk_none

  • 選擇SDK
    Project Structure -> Project -> 選中Project SDK轨域, 選擇前面的Android API 28 Platform



    project_sdk

  • 建立依賴
    Project Structure -> Modules -> android -> Dependencies: Module選擇我們上面編輯過的SDK。然后點(diǎn)擊下圖綠色的+號(hào)來(lái)選擇Jars or directories杀餐,將 aosp/frameworks 目錄添加進(jìn)來(lái)干发,再按照同樣的步驟將aosp/external 目錄, 也可添加其他所關(guān)注的源碼史翘;
    然后選中其他所有的依賴枉长,點(diǎn)擊右邊的下移箭頭將其他依賴移動(dòng)到我們添加的目錄下面。(或者將其他的所有依賴刪除)


注意琼讽,一般我們大部分人不在ubuntu下開發(fā)app 必峰,為了能在Windows或Mac系統(tǒng)下也能使用Android Studio查看源碼,
可以按照上面的步驟钻蹬,那樣直接拷貝ubuntu下的android.iml和android.ipr文件到Windows或Mac系統(tǒng)下的android源碼根目錄下吼蚁,
然后導(dǎo)入Adnroid Studio中,這樣就可以在這兩個(gè)平臺(tái)上進(jìn)行查看源碼了问欠。

八.通過AS調(diào)試源碼

1. 打開模擬器

要調(diào)試代碼肝匆,首先要打開模擬器,注意不是Android Studio自帶的模擬器溅潜,而是通過編譯后的代碼啟動(dòng)的模擬器术唬,否則可能出現(xiàn)代碼不對(duì)應(yīng)的問題。
直接運(yùn)行emulator命令是無(wú)法啟動(dòng)的滚澜,執(zhí)行方法如下:

source build/envsteup.sh

lunch 6 //和編譯時(shí)對(duì)應(yīng)

emulator

接下來(lái)通過Run->Attache debugger to Android process粗仓,在彈出的Choose Process框內(nèi)必須選擇Show all processes,否則看不到相關(guān)的進(jìn)程:然后選擇system_process,就可以進(jìn)行調(diào)試了借浊。

九.Android刷機(jī)知識(shí)

1.BootLoader

機(jī)器首先要啟動(dòng)塘淑,CPU 最先執(zhí)行的一段程序就是 BootLoader,是在操作系統(tǒng)內(nèi)核運(yùn)行之前運(yùn)行的一段小程序蚂斤。其實(shí)Bootloader就相當(dāng)于電腦的bios存捺。 通過這段小程序,進(jìn)行硬件初始化曙蒸,獲取內(nèi)存大小信息等捌治,調(diào)整手機(jī)到適配狀態(tài),從而將系統(tǒng)的軟硬件環(huán)境帶到一個(gè)合適狀態(tài)纽窟,以便為最終調(diào)用操作系統(tǒng)內(nèi)核準(zhǔn)備好正確的環(huán)境肖油。
。很多的手機(jī)廠商都會(huì)鎖住BootLoader臂港,這樣你就只能使用官方的系統(tǒng)森枪,想要第三方的ROM能夠運(yùn)行,或者破解官方系統(tǒng)這時(shí)候就需要進(jìn)行bootloader解鎖!這是刷機(jī)的第一步审孽, 當(dāng)然也有很多手機(jī)沒有bootloader鎖!我們只需要知道要想刷機(jī)就得先bootloader解鎖县袱。

2.FastBoot

fastboot,它是bootloader后期進(jìn)入的一個(gè)特殊階段佑力。例如小米手機(jī)開機(jī)同時(shí)按音量下建就會(huì)進(jìn)入這個(gè)模式.也是一種模式式散≌抛悖可以通過數(shù)據(jù)線與電腦連接,然后在電腦上執(zhí)行一些命令粱坤,如刷系統(tǒng)鏡像到手機(jī)上趋观。fastboot可以理解為實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的通信協(xié)議,接收命令并更新鏡像文件守伸,其他什么的干不了。
需使用USB數(shù)據(jù)線連接電腦和手機(jī)的一種線刷刷機(jī)模式,大部分第三方的Recovery刷入反肋,或者救磚均是在Fastboot模式下進(jìn)行,所以這種方式稱為線刷踏施。 fastboot需要bootloader的支持石蔗,所以不是每家手機(jī)都會(huì)支持這種模式。Fastboot 可以說是一個(gè)通信協(xié)議畅形,電腦可以通過這個(gè)通信協(xié)議养距,直接向手機(jī)系統(tǒng)不同分區(qū)中寫入文件(.img 文件)。

fastboot(bootloader)模式怎么進(jìn)入日熬?

大多數(shù)安卓手機(jī)棍厌,都可以在關(guān)機(jī)狀態(tài)下,然后同時(shí)按住【電源鍵】+【音量+】鍵,大約2-3s后耘纱,就可以進(jìn)入Fastboot模式敬肚。 作為開發(fā)者在開機(jī)狀態(tài)下可以用下面的方式進(jìn)入:

adb reboot bootloader
fastboot命令

然后就可以執(zhí)行下面的fastboot命令了:

fastboot flashing unlock    #6.0以上設(shè)備 設(shè)備必須解鎖,開始刷機(jī)(這個(gè)不同的手機(jī)廠商不同)
fastboot erase {partition}  # 擦除分區(qū)
fastboot  erase  frp    # 擦除 frp 分區(qū)束析,frp 即 Factory Reset Protection艳馒,用于防止用戶信息在手機(jī)丟失后外泄
fastboot  flash  boot  boot.img    # 刷入 boot 分區(qū)
fastboot  flash  system  system.img    # 刷入 system 分區(qū)
fastboot  flash  recovery  recovery.img    # 刷入 recovery 分區(qū)
fastboot flashall    #燒寫所有分區(qū),注意:此命令會(huì)在當(dāng)前目錄中查找所有img文件员寇,將這些img文件燒寫到所有對(duì)應(yīng)的分區(qū)中弄慰,并重新啟動(dòng)手機(jī)。
fastboot  format  data    # 格式化 data 分區(qū)
fastboot  flashing lock    # 設(shè)備上鎖蝶锋,刷機(jī)完畢
fastboot  continue    # 自動(dòng)重啟設(shè)備
fastboot reboot# 重啟手機(jī)
fastboot reboot-bootloader# 重啟到bootloader 刷機(jī)用
fastboot devices  ## 發(fā)現(xiàn)手機(jī)曹动,顯示當(dāng)前哪些手機(jī)通過fastboot連接了

3.Recovery

如果沒有進(jìn)入fastboot,bootloader繼續(xù)執(zhí)行牲览,如果又發(fā)現(xiàn)有特殊的按鍵組合墓陈,比如小米上是音量上鍵和開機(jī)鍵,則會(huì)進(jìn)入recovery模式第献。它里面包含了一個(gè)kernel以及一個(gè)可執(zhí)行程序recovery贡必,以
及一些初始化文件。Recovery模式指的是一種可以對(duì)安卓機(jī)內(nèi)部的數(shù)據(jù)或系統(tǒng)進(jìn)行修改的模式庸毫,也叫工程模式仔拟,像是電腦上的小型winPE系統(tǒng),winPE可以在電腦上安裝操作系統(tǒng)飒赃,或者做些刪除備份利花、管理的工作。
官方Recovery用處不大载佳,所以通常會(huì)刷入一個(gè)第三方的Recovery 炒事,Recovery 更類似于一個(gè)小型的管理系統(tǒng)。只不過功能簡(jiǎn)單蔫慧,所做的管理有限挠乳。在recovery模式下,會(huì)加載了部分文件系統(tǒng)姑躲,所以才可以讀sdcard中的update.zip進(jìn)行刷機(jī)睡扬,當(dāng)然,也可以清除cache和用戶數(shù)據(jù)黍析。
該模式可根據(jù)用戶的需要進(jìn)行修改卖怜,因此有官方recovery模式以及第三方recovery模式。第三方recovery模式可以識(shí)別第三方rom包阐枣,因此可以用來(lái)刷機(jī)马靠。而官方recovery一般不能識(shí)別第三方zip文件牍戚。好用的第三方RE:TWRP 和 CWM Recovery刷機(jī)包是稱為Google Update 格式。在用Recovery恢復(fù)時(shí)虑粥,刷機(jī)包通常放在SD卡里如孝,所以這里刷機(jī)一般稱為卡刷。

4.線刷和卡刷

  • 線刷: 直接想手機(jī)硬盤寫入*.img 文件娩贷,我個(gè)人覺得這種方法比較快捷第晰,而且省事。但是必須借助電腦和數(shù)據(jù)線彬祖。
  • 卡刷:就是利用recovery的從SD卡中更新系統(tǒng)的這個(gè)功能茁瘦,如果你想刷第三方Rom,必須刷入個(gè)第三方recovery储笑,只有fastboot模式才能刷recovery.img甜熔。卡刷有個(gè)限制突倍,必須要把想要更新的ROM(Android系統(tǒng))拷貝到SD卡上腔稀。如果手機(jī)已經(jīng)是磚了。那只能用線刷了羽历。

十.手機(jī)硬件驅(qū)動(dòng)知識(shí)

1. 硬件驅(qū)動(dòng)的作用

AOSP是一個(gè)由谷歌維護(hù)的開源操作系統(tǒng)開發(fā)項(xiàng)目焊虏,既然是開源項(xiàng)目,也就意味著任何人都可以自由地審查和貢獻(xiàn)代碼以及修復(fù)項(xiàng)目倉(cāng)庫(kù)秕磷,而谷歌引領(lǐng)著大方向和大部分的開發(fā)工作诵闭。AOSP會(huì)定期為Android加入最新的安全補(bǔ)丁,谷歌每年也會(huì)在其I/O開發(fā)者大會(huì)上公布操作系統(tǒng)的新功能澎嚣。除了開放貢獻(xiàn)代碼外疏尿,AOSP還可以在開源許可下自由使用和修改。
比如易桃,小米褥琐,華為等廠商根據(jù)自己的目的自由調(diào)整該項(xiàng)目,并開發(fā)了自己的衍生產(chǎn)品颈抚,包括多用途的emui和miui踩衩。需要注意的是,AOSP包含了開發(fā)者構(gòu)建Android所需的一切贩汉,但它并不包括成品智能手機(jī)所需的一切。
谷歌和AOSP無(wú)法為所有硬件配置提供內(nèi)核設(shè)備驅(qū)動(dòng)锚赤。所謂設(shè)備驅(qū)動(dòng)匹舞,是指手機(jī)硬件所需的固件,比如處理器或攝像頭线脚。手機(jī)和SoC制造商赐稽,如高通和三星叫榕,必須將這些驅(qū)動(dòng)程序納入他們的Android構(gòu)建中。
這也是為什么從AOSP到實(shí)際設(shè)備的系統(tǒng)更新需要一定時(shí)間的原因姊舵。其次AOSP也不包含谷歌的軟件應(yīng)用套件晰绎,如Chrome瀏覽器、YouTube括丁,甚至谷歌Play商店荞下。
它也不包括谷歌的一些底層技術(shù)和API,而這些技術(shù)和API可以實(shí)現(xiàn)移動(dòng)支付史飞、語(yǔ)音命令和云存儲(chǔ)等功能尖昏,這些都是作為谷歌移動(dòng)服務(wù)(GMS)單獨(dú)授權(quán)的。 任何廠商想要在系統(tǒng)中安裝GMS构资,都必須為自己的設(shè)備獲得GMS授權(quán)和移動(dòng)應(yīng)用分發(fā)協(xié)議(MADA)抽诉,然后通過多項(xiàng)兼容性測(cè)試。有Android兼容性測(cè)試套件(CTS)來(lái)驗(yàn)證軟件和硬件以及API吐绵。
正因?yàn)锳OSP開源的特性迹淌,許多的硬件廠商的驅(qū)動(dòng)代碼并不是開源的,所以AOSP會(huì)有一個(gè)硬件抽象層 (HAL)己单,來(lái)保證驅(qū)動(dòng)程序代碼不被泄露巍沙。大多數(shù)手機(jī)廠商都是從高通等芯片廠商那里獲得AOSP版本,該AOSP版本為硬件量身定坐了高通驅(qū)動(dòng)程序荷鼠,所以刷入真機(jī)是可以正常的運(yùn)行句携。

2. 如何添加硬件驅(qū)動(dòng)

在上面步驟中我們編譯好了AOSP可以直接通過模擬器運(yùn)行.編譯aosp時(shí)也會(huì)生成system.img文件,這個(gè)文件是最終刷機(jī)用的允乐,但是system.img文件必須依賴驅(qū)動(dòng)文件生成矮嫉,
如果沒有放入對(duì)應(yīng)的驅(qū)動(dòng)就編譯,那么生成的鏡像也是無(wú)法正常刷機(jī)的牍疏。通過上文我們知道aosp 僅是一套源碼蠢笋,真機(jī)運(yùn)行需要廠商的驅(qū)動(dòng),廠商的驅(qū)動(dòng)是不包含在AOSP中的鳞陨,
第三方ROM(如CM等)的廠家驅(qū)動(dòng)是自行提取的昨寞。但是google也開源了nexus和pixel對(duì)應(yīng)的AOSP版本的硬件驅(qū)動(dòng)代碼.如果我們有nexus或者是pixel設(shè)備就可以下載相應(yīng)的驅(qū)動(dòng)進(jìn)行編譯,
然后將編譯好的系統(tǒng)輸入到設(shè)備中去.

(1.)下載對(duì)應(yīng)的驅(qū)動(dòng)

需要根據(jù)你選擇的版本
驅(qū)動(dòng)頁(yè)面下載合適的驅(qū)動(dòng)厦滤。

(2.)生成驅(qū)動(dòng)

將驅(qū)動(dòng)文件下載后援岩,解壓到AOSP根目錄,得到幾個(gè).sh文件掏导,執(zhí)行后享怀,會(huì)在AOSP下創(chuàng)建vendor目錄,里面包含了驅(qū)動(dòng)趟咆。

(3.)編譯帶有驅(qū)動(dòng)的AOSP

再次make -j4添瓷,此次編譯的結(jié)果就包含了驅(qū)動(dòng)梅屉,編譯出新的系統(tǒng).

十一.ROM編譯及燒錄

一般定制ROM其實(shí)就是對(duì)手機(jī)內(nèi)存里的system/app文件夾的內(nèi)容進(jìn)行自定義,系統(tǒng)所有的程序都在這個(gè)文件夾里鳞贷,比如瀏覽器坯汤、撥號(hào)器、聯(lián)系人等搀愧。自己安裝的軟件\data\文件夾中惰聂。

1.真機(jī)驅(qū)動(dòng)下載

在上文中可以了解到廠商的驅(qū)動(dòng)是不包含在AOSP中的.因此編譯出來(lái)的AOSP系統(tǒng)源碼要在真機(jī)上運(yùn)行,還需要加上廠商驅(qū)動(dòng)進(jìn)行編譯才能燒錄到真機(jī)上使用.
Google提供了Nexus和Pixel這兩個(gè)太子機(jī)的驅(qū)動(dòng)妈橄,我們可以在驅(qū)動(dòng)頁(yè)面下載合適的驅(qū)動(dòng)庶近。
Driver Binaries for Nexus and Pixel Devices

2.配置真機(jī)驅(qū)動(dòng)到AOSP

  1. 在上面鏈接里面,兩個(gè)文件都進(jìn)行下載,一個(gè)是google vendor眷蚓,一個(gè)qcom鼻种。
  2. 解壓得到extract-google_devices-blueline.shextract-qcom-blueline.sh
  3. 將這兩個(gè)腳本放到aosp代碼目錄下沙热,進(jìn)行提取
    sh extract-google_devices-blueline.sh
vendor/
vendor/google_devices/
vendor/google_devices/marlin/
vendor/google_devices/marlin/device-vendor-marlin.mk
vendor/google_devices/marlin/android-info.txt
vendor/google_devices/marlin/BoardConfigVendor.mk
vendor/google_devices/marlin/BoardConfigPartial.mk
vendor/google_devices/marlin/proprietary/
vendor/google_devices/marlin/proprietary/vendor.img
vendor/google_devices/marlin/device-partial.mk

Files extracted successfully.

第2個(gè) 高通驅(qū)動(dòng)
sh extract-qcom-blueline.sh

vendor/
vendor/qcom/
vendor/qcom/marlin/
vendor/qcom/marlin/BoardConfigPartial.mk
vendor/qcom/marlin/proprietary/
vendor/qcom/marlin/proprietary/lib64/
vendor/qcom/marlin/proprietary/lib64/libbcc.so
vendor/qcom/marlin/proprietary/lib64/libLLVM_android.so
vendor/qcom/marlin/proprietary/lib64/libiperf.so
vendor/qcom/marlin/proprietary/lib64/libminui.so
vendor/qcom/marlin/proprietary/ATT_profiles.xml
vendor/qcom/marlin/proprietary/pktlogconf
vendor/qcom/marlin/proprietary/VZW_profiles.xml
vendor/qcom/marlin/proprietary/ROW_profiles.xml
vendor/qcom/marlin/proprietary/libclcore_neon.bc
vendor/qcom/marlin/proprietary/sanitizer-status
vendor/qcom/marlin/proprietary/libiperf.so
vendor/qcom/marlin/proprietary/qcrilhook.jar
vendor/qcom/marlin/proprietary/libminui.so
vendor/qcom/marlin/proprietary/libion.so
vendor/qcom/marlin/proprietary/iperf3
vendor/qcom/marlin/device-partial.mk
vendor/google_devices/
vendor/google_devices/marlin/
vendor/google_devices/marlin/device-vendor-marlin.mk
vendor/google_devices/marlin/android-info.txt
vendor/google_devices/marlin/BoardConfigVendor.mk

Files extracted successfully.

執(zhí)行后叉钥,會(huì)在AOSP下創(chuàng)建vendor目錄,里面包含了驅(qū)動(dòng)篙贸。編譯完成后投队,執(zhí)行make fastboot adb單獨(dú)編譯fastboot和adb。

3.編譯Rom

重新對(duì)AOSP進(jìn)行編譯.此次編譯的結(jié)果就包含了驅(qū)動(dòng)爵川,編譯完成后敷鸦,執(zhí)行make fastboot adb 單獨(dú)編譯fastboot和adb。

4. 燒錄Rom到手機(jī)

  1. 手機(jī)啟用開發(fā)者模式寝贡,打開 USB 調(diào)試 adb shell 能進(jìn)入扒披。
  2. 開機(jī)鍵 + 音量- 進(jìn)入 bootloader 模式。
  3. 電腦上能識(shí)別出來(lái)手機(jī)并裝上了驅(qū)動(dòng)圃泡。
  4. fastboot devices 能看到設(shè)備碟案。
  5. 再次執(zhí)行./fastboot -w flashall將開始刷機(jī),刷完會(huì)自動(dòng)重啟颇蜡,over!

參考資料:
Android 鏡像使用幫助
MIUI ROM適配之旅第一天——認(rèn)識(shí)Android手機(jī)
Android FrameWork 學(xué)習(xí)之Android 系統(tǒng)源碼調(diào)試
從CM刷機(jī)過程和原理分析Android系統(tǒng)結(jié)構(gòu)
Android ROM移植
android rom移植知識(shí)普及
Android系統(tǒng)源碼修改
android系統(tǒng)的分區(qū)結(jié)構(gòu)
Android ROM的制作與燒錄
android系統(tǒng)源碼中添加app源碼(源碼部署移植)

參考資料:
Ubentu編譯Android源碼(AOSP)
AOSP源碼下載/編譯/刷機(jī)/調(diào)試
Android rom移植一
目前通用的Android拼包移植方法均是正向移植
Android驅(qū)動(dòng)開發(fā)全過程

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末价说,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子风秤,更是在濱河造成了極大的恐慌鳖目,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唁情,死亡現(xiàn)場(chǎng)離奇詭異疑苔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)甸鸟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門惦费,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人抢韭,你說我怎么就攤上這事薪贫。” “怎么了刻恭?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵瞧省,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我鳍贾,道長(zhǎng)鞍匾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任骑科,我火速辦了婚禮橡淑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咆爽。我一直安慰自己梁棠,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布斗埂。 她就那樣靜靜地躺著符糊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪呛凶。 梳的紋絲不亂的頭發(fā)上男娄,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音漾稀,去河邊找鬼模闲。 笑死,一個(gè)胖子當(dāng)著我的面吹牛县好,可吹牛的內(nèi)容都是我干的围橡。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼缕贡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼翁授!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起晾咪,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤收擦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后谍倦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塞赂,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年昼蛀,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宴猾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圆存。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仇哆,靈堂內(nèi)的尸體忽然破棺而出沦辙,到底是詐尸還是另有隱情,我是刑警寧澤讹剔,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布油讯,位于F島的核電站,受9級(jí)特大地震影響延欠,放射性物質(zhì)發(fā)生泄漏陌兑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一由捎、第九天 我趴在偏房一處隱蔽的房頂上張望兔综。 院中可真熱鬧,春花似錦隅俘、人聲如沸邻奠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)碌宴。三九已至,卻和暖如春蒙畴,著一層夾襖步出監(jiān)牢的瞬間贰镣,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工膳凝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留碑隆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓蹬音,卻偏偏與公主長(zhǎng)得像上煤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子著淆,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容