1. 準(zhǔn)備環(huán)境
- PC
- 系統(tǒng):Mac OSX 10.14.4 (18E226)
- 至少250GB固態(tài)硬盤
- JDK 1.8.0_171
- Xcode 10 SDK
- Android SDK
- Mobile
- 設(shè)備: Google Pixel
2. 配置環(huán)境
-
2.1 創(chuàng)建大小寫敏感的磁盤鏡像
# 可以通過磁盤管理工具進(jìn)行設(shè)置贴捡,也可以通過以下命令生成250g的鏡像文件 $ hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 250g -volname android android.dmg android.dmg 表示當(dāng)前目錄下生成android.dmg.sparseimage
-
2.2 將鏡像文件轉(zhuǎn)為可讀寫磁盤
# 稍微會(huì)等一會(huì)培遵,我的移動(dòng)硬盤 # 已耗時(shí): 6m 10.512s # 速度:414.6M 字節(jié)/秒 $ hdiutil convert android.dmg.sparseimage -format UDRW -o android.dmg
PS: 創(chuàng)建鏡像的目的是方便移動(dòng),大文件移動(dòng)挺快酵紫。無(wú)所謂的可以直接在大小寫敏感的硬盤(磁盤管理工具格式化為大小寫敏感)上直接操作扒最,省去這一步丑勤。
# 查詢當(dāng)前目錄所在分區(qū)的分區(qū)是否大小寫敏感 $ diskutil info . | grep Name
3.下載源碼
-
3.1 下載repo工具并且給這個(gè)工具可執(zhí)行權(quán)限
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo -O repo & chmod +x repo
-
3.2 源碼地址
# 推薦使用清華大學(xué)TUNA鏡像源,使用每月更新的初始化包進(jìn)行下載更新吧趣。具體步驟請(qǐng)看 https://mirror.tuna.tsinghua.edu.cn/help/AOSP/
-
3.3 同步分支
android-9.0.0_r36
源碼法竞,需要獲取所有源碼可以先repo sync
,然后再切換分支(我獲取的所有源碼强挫,編譯+源碼總共200GB)# 查看可切換的分支 $ cd .repo/manifests $ git branch -a | cut -d / -f 3 # 切換到9.0分支 $ repo init -b android-9.0.0_r36 # long time ..., 報(bào)錯(cuò)繼續(xù)repo sync $ repo sync # 直到顯示下面內(nèi)容岔霸,即為同步完成 Syncing work tree:100%,done.
- 同步源碼報(bào)錯(cuò),其他依賴環(huán)境貌似我這之前裝過俯渤,沒遇到其他錯(cuò)誤
warning: gpg (GnuPG) is not available. warning: Installing it is strongly encouraged. # 解決方法: $ brew install gpg
4. 編譯源碼
-
4.1 首先進(jìn)入
bash
環(huán)境$ bash
-
4.2 初始化編譯環(huán)境
bash-5.0$ source build/envsetup.sh including device/generic/car/vendorsetup.sh including device/generic/mini-emulator-arm64/vendorsetup.sh including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh including device/generic/mini-emulator-mips/vendorsetup.sh including device/generic/mini-emulator-mips64/vendorsetup.sh including device/generic/mini-emulator-x86/vendorsetup.sh including device/generic/mini-emulator-x86_64/vendorsetup.sh including device/generic/uml/vendorsetup.sh including device/google/crosshatch/vendorsetup.sh including device/google/cuttlefish/vendorsetup.sh including device/google/marlin/vendorsetup.sh including device/google/muskie/vendorsetup.sh including device/google/taimen/vendorsetup.sh including device/linaro/hikey/vendorsetup.sh including sdk/bash_completion/adb.bash
-
4.3 配置編譯信息
訪問https://developers.google.com/android/images得到對(duì)應(yīng)設(shè)備的combo名稱呆细,這里Pixel
對(duì)應(yīng)sailfish
這里執(zhí)行
lunch
后輸入45
,或者輸入aosp_sailfish-userdebug
$ lunch You're building on Darwin Lunch menu... pick a combo: ... 45. aosp_sailfish-userdebug ... Which would you like? [aosp_arm-eng] 45 ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=9 TARGET_PRODUCT=aosp_sailfish TARGET_BUILD_VARIANT=userdebug TARGET_BUILD_TYPE=release TARGET_ARCH=arm64 TARGET_ARCH_VARIANT=armv8-a TARGET_CPU_VARIANT=kryo TARGET_2ND_ARCH=arm TARGET_2ND_ARCH_VARIANT=armv8-a TARGET_2ND_CPU_VARIANT=kryo HOST_ARCH=x86_64 HOST_2ND_ARCH=x86 HOST_OS=darwin HOST_OS_EXTRA=Darwin-18.5.0-x86_64-10.14.4 HOST_BUILD_TYPE=release BUILD_ID=PQ3A.190505.001 OUT_DIR=out ============================================
BUILD_ID=PQ3A.190505.001
這里提前把BUILD_ID
對(duì)應(yīng)的設(shè)備驅(qū)動(dòng)下載好八匠,訪問https://developers.google.com/android/drivers得到Pixel binaries for Android 9.0.0 (PQ3A.190505.001)的兩個(gè)驅(qū)動(dòng)絮爷,解壓后放入源碼目錄下解壓诡曙。解壓后再執(zhí)行對(duì)應(yīng)的sh腳本即可。(用于編譯好源碼后略水,線刷安卓系統(tǒng)到Pixel手機(jī)上价卤。)
PS: 執(zhí)行shell腳本時(shí)需要同意協(xié)議,^ + c
快捷鍵可以快速跳過協(xié)議閱讀渊涝,直接彈出同意協(xié)議輸入位置慎璧。
-
4.4 開始構(gòu)建
- 腳本(ccache.sh)
#!/usr/bin/env bash export USE_CCACHE=1 #開啟CCACHE。此配置可以提高二次全編譯的速度跨释⌒厮剑可以添加到.bashrc文件中, export CCACHE_DIR=./.ccache #設(shè)置緩存目錄的路徑鳖谈。也可以添加到.bashrc文件中岁疼, # prebuilts/misc/linux-x86/ccache/ccache -M 50G #設(shè)置緩存目錄的大小。這個(gè)配置一次即可缆娃。 prebuilts/misc/darwin-x86/ccache/ccache -M 50G #設(shè)置緩存目錄的大小捷绒。這個(gè)配置一次即可。
# 啟動(dòng)ccache緩存 $ sh ccache.sh # 開40個(gè)線程編譯贯要,等待編譯完成 $ make -j40
-
遇到的報(bào)錯(cuò)
# 找不到j(luò)dk暖侨,這個(gè)在根目錄的.bash_profile文件中添加
解決方法:
export ANDROID_JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home
# 報(bào)錯(cuò)找不到對(duì)應(yīng)的MacOSX.sdk,比如找不到MacOSX10.13.sdk ============================================ [1/1] out/soong/.minibootstrap/minibp out/soong/.bootstrap/build.ninja [55/56] glob prebuilts/ndk/stl.bp [77/77] out/soong/.bootstrap/bin/soong_build out/soong/build.ninja FAILED: out/soong/build.ninja out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -o out/soong/build.ninja Android.bp internal error: Could not find a supported mac sdk: ["10.10" "10.11" "10.12" "10.13"] ninja: build stopped: subcommand failed. 11:57:25 soong bootstrap failed with: exit status 1 #### failed to build some targets (16 seconds) ####
解決方法:下載Mac OSX SDK,Clone下來復(fù)制
MacOSX10.13.sdk
到目錄/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
下(我測(cè)試的10.13版本崇渗,其他版本自測(cè))# 報(bào)錯(cuò)sdm710 target not found [1/1] out/soong/.minibootstrap/minibp out/soong/.bootstrap/build.ninja FAILED: out/soong/.bootstrap/build.ninja out/soong/.minibootstrap/minibp -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/.bootstrap/build.ninja.d -o out/soong/.bootstrap/build.ninja Android.bp internal error: could not open symlink hardware/qcom/sdm710/Android.bp; its target (display/os_pickup.bp) cannot be opened ninja: build stopped: subcommand failed. 11:02:11 soong minibootstrap failed with: exit status 1 #### failed to build some targets (1 seconds) ####
解決方法:git clone 該鏈接的目錄文件到
hardware/qcom/sdm710
目錄下(全部clone)
https://android.googlesource.com/platform/hardware/qcom/sdm710/ 4.5 編譯完成
#### build completed successfully (25 seconds) ####
5. 修改源碼
-
5.1 去掉wifi感嘆號(hào)
// 去掉感嘆號(hào) // 進(jìn)入文件夾 // /Volumes/sandisk/aosp/frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java // 修改地址鏈接為如下 // private static final String DEFAULT_HTTPS_URL = "https://www.google.com/generate_204"; private static final String DEFAULT_HTTPS_URL = "https://www.qualcomm.cn/generate_204"; private static final String DEFAULT_HTTP_URL = // "http://connectivitycheck.gstatic.com/generate_204"; "http://www.qualcomm.cn/generate_204"; // private static final String DEFAULT_FALLBACK_URL = "http://www.google.com/gen_204"; private static final String DEFAULT_FALLBACK_URL = "http://www.qualcomm.cn/generate_204"; private static final String DEFAULT_OTHER_FALLBACK_URLS = // "http://play.googleapis.com/generate_204"; "http://www.qualcomm.cn/generate_204";
-
5.2 默認(rèn)adb為root
ro.secure=0
即可/Volumes/sandisk/aosp/build/make/core/main.mk ## user/userdebug ## user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT)) enable_target_debugging := true tags_to_install := ifneq (,$(user_variant)) # Target is secure in user builds. ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0 ADDITIONAL_DEFAULT_PROPERTIES += security.perf_harden=1 ifeq ($(user_variant),user) ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=0 endif ifeq ($(user_variant),userdebug) # Pick up some extra useful tools tags_to_install += debug else # Disable debugging in plain user builds. enable_target_debugging := endif # Disallow mock locations by default for user builds ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=1 else # !user_variant # Turn on checkjni for non-user builds. ADDITIONAL_BUILD_PROPERTIES += ro.kernel.android.checkjni=1 # Set device insecure for non-user builds. ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0 # Allow mock locations by default for non user builds ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=1 endif # !user_variant
-
5.3 修改默認(rèn)輸入法(參考其他文章)
在
/Volumes/sandisk/aosp/frameworks/base/packages/SettingsProvider/res/values/defaults.xml
添加如下內(nèi)容:<string name="def_default_input_method" translatable="false">com.google.android.inputmethod.pinyin/.PinyinIME</string> <string name="def_enabled_input_methods" translatable="false">com.google.android.inputmethod.pinyin/.PinyinIME</string>
在
/Volumes/sandisk/aosp/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
方法內(nèi)添加如下內(nèi)容:loadStringSetting(stmt, Secure.ENABLED_INPUT_METHODS, R.string.def_default_input_method);
在
/Volumes/sandisk/aosp/packages/apps/
創(chuàng)建GoogleInput
文件夾字逗,進(jìn)入GoogleInput
創(chuàng)建Android.mk
文件,添加如下內(nèi)容:LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := GoogleInput LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := PRESIGNED include $(BUILD_PREBUILT) LOCAL_MULTILIB := 64
將GoogleInput.apk放入該目錄下
在
build/make/target/product/core.mk
文件中修改如下:PRODUCT_PACKAGES += \ 移除Latin \ 末尾新增GoogleInput
編譯模塊:
# 編譯系統(tǒng)鏡像 $ mmm packages/apps/GoogleInput/ $ make snod
-
5.4 修改系統(tǒng)名稱
修改
/device/google/marlin/aosp_sailfish.mk
文件內(nèi)容為:PRODUCT_MODEL := Pixel
編譯模塊:
# 編譯系統(tǒng)鏡像 $ mmm packages/apps/GoogleInput/ $ make snod