一.準(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-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
- $HOME/.jack-settings
SERVER_PORT_SERVICE=8386
SERVER_PORT_ADMIN=8387
- $HOME/.jack-server/config.properties
jack.server.service.port=8386
jack.server.admin.port=8387
- $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/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)
- 安裝 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
- 查看系統(tǒng) KVM 是否可用
$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used
- 創(chuàng)建 kvm 用戶組并把當(dāng)前登錄用戶(如 peng )添加到 kvm 用戶組
sudo addgroup kvm
sudo usermod -a -G kvm peng
- 改變 /dev/kvm 用戶組為 kvm
sudo chgrp kvm /dev/kvm
- 創(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"
- 重啟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
- 在上面鏈接里面,兩個(gè)文件都進(jìn)行下載,一個(gè)是google vendor眷蚓,一個(gè)qcom鼻种。
- 解壓得到
extract-google_devices-blueline.sh
,extract-qcom-blueline.sh
- 將這兩個(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ī)
- 手機(jī)啟用開發(fā)者模式寝贡,打開 USB 調(diào)試 adb shell 能進(jìn)入扒披。
- 開機(jī)鍵 + 音量- 進(jìn)入 bootloader 模式。
- 電腦上能識(shí)別出來(lái)手機(jī)并裝上了驅(qū)動(dòng)圃泡。
- fastboot devices 能看到設(shè)備碟案。
- 再次執(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ā)全過程