下載源碼
你可以從 google 或 清華的鏡像進(jìn)行同步次坡,android 源碼非常大(20 - 50 G)通常都要同步好幾天麻昼,而且中間還不斷出錯斷開祠乃。
當(dāng)然你也可以下載或拷貝別人下載好的源碼优妙,這樣不好的地方是不能同步最新的代碼了助琐。如果你下載的源碼中有 .repo 文件夾應(yīng)該也是可以同步最新代碼的。
我從百度網(wǎng)盤 https://pan.baidu.com/s/1ngsZs 下載了 android-7.0.0_r1 源碼舅巷, 7zip 壓縮后 6.73G羔味。
推薦用 https://github.com/iikira/BaiduPCS-Go 工具下載,我下載時能達(dá)到 7M/s , 20 分鐘就下載完了钠右。
編譯環(huán)境準(zhǔn)備
主要參考官網(wǎng) https://source.android.google.cn/setup/build/initializing
mac 文件系統(tǒng)是大小寫不敏感的赋元,可能導(dǎo)致編譯出錯,所以第一步新建一個大寫小敏感的磁盤飒房。
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g ~/android.dmg
源碼是 23G, 編譯后是 60G搁凸, 所以建議新建磁盤至少 80G
這條命令會在用戶主目錄下面生成 android.dmg 鏡像文件
雙擊 android.dmg.sparseimage 掛載這個磁盤,把原代碼拷貝到新建的磁盤中
安裝依賴
- JDK1.8 (android7.0 ~ android8.0 需要 JDK1.8)
- Xcode
- Xcode command line tools (通過
xcode-select --install
命令安裝) - 安裝 MacPorts, 從這里下載相應(yīng)版本 https://www.macports.org/install.php
- 用 MacPort 安裝其它依賴庫
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
設(shè)置最大打開文件數(shù)
ulimit -S -n 1024
編譯
source build/envsetup.sh
報錯
WARNING: Only bash is supported, use of other shell would lead to erroneous results
直接切換到 bash狠毯, 輸入 bash
命令
執(zhí)行 lunch
make -j8 # 開啟 8 線程編譯
報錯找不到 SDK
2018-03-28 21:46:59.877 xcodebuild[31923:2630108] Failed to load plugin at: /Users/lesliefang/Library/Application Support/Developer/Shared/Xcode/Plug-ins/Unity4XC.xcplugin, skipping. Reason for failure: *** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[0]
build/core/combo/mac_version.mk:26: none of the installed SDKs (ac_sdk_versions_installed) match supported versions (10.8 10.9 10.10 10.11), trying 10.8
build/core/combo/mac_version.mk:36: no SDK 10.8 at /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk, trying legacy dir
build/core/combo/mac_version.mk:40: *****************************************************
build/core/combo/mac_version.mk:41: * Can not find SDK 10.8 at /Developer/SDKs/MacOSX10.8.sdk
build/core/combo/mac_version.mk:42: *****************************************************
build/core/combo/mac_version.mk:43: *** Stop.. Stop.
build/core/combo/mac_version.mk 中配置的 SDK 是
mac_sdk_versions_supported := 10.8 10.9 10.10 10.11
而我系統(tǒng)中只有 10.12
Xcode SDK 路徑是
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
從這里 https://github.com/phracker/MacOSX-SDKs/releases 下載 10.11 扔到 SDK 目錄里面就行了
繼續(xù) make ,編譯到 45%報錯护糖,內(nèi)存不足,坑爹啊嚼松。所以這里大家務(wù)必提前設(shè)置
[ 45% 14861/32771] Building with Jack: out/target/common/ob...VA_LIBRARIES/framework_intermediates/with-local/classes.dex
FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/with-local/classes.dex.rsp
Out of memory error (version 1.2-rc4 'Carnac' (298900 f95d7bdecfceb327f9d201a1348397ed8a843843 by android-jack-team@google.com)).
GC overhead limit exceeded.
Try increasing heap size with java option '-Xmx<size>'.
Warning: This may have produced partial or corrupted output.
[ 45% 14861/32771] Building with Jack: out/target/common/obj/JAVA_LIBRARIES/colorpicker_intermediates/classes.jack
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] Error 1
我們對prebuilts/sdk/tools/jack-admin文件進(jìn)行如下修改:
1.找到如下語句:
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"
2.將上述語句修改為:
JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS -Xmx4096m -cp $LAUNCHER_JAR $LAUNCHER_NAME"
主要是添加了-Xmx4096m參數(shù)嫡良,接下來在源碼目錄下執(zhí)行如下命令重啟jack-admin服務(wù):
./prebuilts/sdk/tools/jack-admin stop-server
./prebuilts/sdk/tools/jack-admin start-server
重啟完jack-admin服務(wù)后,此時再重新執(zhí)行編譯命令就能編譯通過ninja了
編譯了1小時18分 編譯成功
執(zhí)行 emulator 命令啟動模擬器
模擬器特別卡献酗,要有耐心
怎么沒有編譯 Linux 內(nèi)核寝受??罕偎? prebuilts/qemu-kernel 下面有編譯好的內(nèi)核鏡像, 我編譯的 target 是 aosp_arm_eng
, 不帶任何參數(shù)啟動模擬器使用的內(nèi)核鏡像就是 prebuilts/qemu-kernel/arm/kernel-qemu
如果你有 Nexus 或 Pixel 手機(jī)就可以把 ROM 刷到手機(jī)里面了
android源碼編譯后在 out/target/product/generic 下生成
system.img很澄, ramdisk.img,userdata.img 鏡像文件颜及。
- ramdisk.img 是emulator的文件系統(tǒng)
- system.img 包括了主要的包, 庫等文件
- userdata.img 包括了一些用戶數(shù)據(jù)
emulator加載這3個鏡像文件后, 會把 system 和 userdata 分別加載到 ramdisk 文件系統(tǒng)中的 system 和 userdata 目錄下
接下來我們就可以學(xué)習(xí)修改 framework 層代碼并編譯測試了甩苛。