【轉(zhuǎn)】自己動手編譯Android源碼(超詳細)
Repo
sudo apt-get install repo
repo init -u https://android.googlesource.com/platform/manifest
repo sync
https://github.com/esrlabs/git-repo
mkdir ~/bin
curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo > ~/bin/repo
curl https://raw.githubusercontent.com/esrlabs/git-repo/stable/repo.cmd > ~/bin/repo.cmd
JDK
sudo apt-get update
sudo apt-get install openjdk-8-jdk
有時候,我們需要編譯不同版本的android系統(tǒng),就可能使用不同的jdk版本.關(guān)于jdk版本切換,可以使用如下命令:
sudo update-alternative --config java
sudo update-alternative --config javac
Prerequisites
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
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 libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
Emulator
source build/envsetup.sh
lunch(選擇剛才你設(shè)置的目標版本,比如這里了我選擇的是2)
emulator
Image
Linux Kernel
system.img
userdate.img
ramdisk.img
如果你在使用lunch命令時選擇的是aosp_arm-eng,那么在執(zhí)行不帶參數(shù)的emualtor命令時,Linux Kernel默認使用的是/source/prebuilds/qemu-kernel/arm/kernel-qemu目錄下的kernel-qemu文件;而android鏡像文件則是默認使用source/out/target/product/generic目錄下的system.img,userdata.img和ramdisk.img,也就是我們剛剛編譯出來的鏡像文件.
上面我在使用lunch命令時選擇的是aosp_arm64-eng,因此linux默認使用的/source/prebuilds/qemu-kernel/arm64/kernel-qemu下的kernel-qemu,而其他文件則是使用的source/out/target/product/generic64目錄下的system.img,userdata.img和ramdisk.img.
模塊編譯
其中mmm指令就是用來編譯指定目錄.通常來說,每個目錄只包含一個模塊.比如這里我們要編譯Launcher2模塊,執(zhí)行指令:
mmm packages/apps/Launcher2/
在out/target/product/gereric/system/app就可以看到編譯的Launcher2.apk文件了.
重新打包系統(tǒng)鏡像
編譯好指定模塊后,如果我們想要將該模塊對應(yīng)的apk集成到系統(tǒng)鏡像中,需要借助make snod指令重新打包系統(tǒng)鏡像,這樣我們新生成的system.img中就包含了剛才編譯的Launcher2模塊了.重啟模擬器之后生效.
單獨安裝模塊
我們在不斷的修改某些模塊,總不能每次編譯完成后都要重新打包system.img,然后重啟手機吧?有沒有什么簡單的方法呢?
在編譯完后,借助adb install命令直接將生成的apk文件安裝到設(shè)備上即可,相比使用make snod,會節(jié)省很多事件.
SDK編譯
如果你需要自己編譯SDK使用,很簡單,只需要執(zhí)行命令make sdk即可.