Android 8.0源碼編譯問題記錄


清理make clean; make clobber 更嚴格。

1 替換framework.jar不起作用

使用nexus 燒錄system後,單獨替換framework.jar不起作用。
研究出兩種解決方案。親自測試有效。

第一種方法:不編譯優化成odex

默認情況在linux編譯系統 會開啓odex的。
build/make/core/dex_preopt.mk

# The default values for pre-opting: always preopt PIC.
# Conditional to building on linux, as dex2oat currently does not work on darwin.
ifeq ($(HOST_OS),linux)
  WITH_DEXPREOPT ?= true
# For an eng build only pre-opt the boot image. This gives reasonable performance and still
# allows a simple workflow: building in frameworks/base and syncing.
  ifeq (eng,$(TARGET_BUILD_VARIANT))
    WITH_DEXPREOPT_BOOT_IMG_ONLY ?= true
  endif
# Add mini-debug-info to the boot classpath unless explicitly asked not to.
  ifneq (false,$(WITH_DEXPREOPT_DEBUG_INFO))
    PRODUCT_DEX_PREOPT_BOOT_FLAGS += --generate-mini-debug-info
  endif
endif

我們可以將WITH_DEXPREOPT修改成false,具體位置:
build/make/core/dex_preopt.mk 或者device/對應板級/BoardConfig.mk。

然後清理out目錄,重新編譯系統燒錄,之後可以單獨編譯framework替換。

adb root
adb remount
adb push framework.jar /system/framework/
adb shell reboot

第二種方法:不刪除dex文件。

默認DEX_PREOPT_DEFAULT爲true,會刪除apk、jar包中的classes.dex文件。值爲nostripping時,不刪除,這樣編譯的framework.jar不會只是1kb左右。

# The default value for LOCAL_DEX_PREOPT
DEX_PREOPT_DEFAULT ?= true

修改方式:
WITH_DEXPREOPT保持爲true,使用odex優化。
修改DEX_PREOPT_DEFAULT,設爲nostripping。
如果有板級,可以在device/對應板級/BoardConfig.mk中添加,或者在
build/make/core/dex_preopt.mk
最好使重新編譯系統鏡像燒錄,之後單獨編譯framework後。

adb root
adb remount;
adb push framework.jar /system/framework/
adb shell
cd /system/framework/
rm arm/boot-framework*
rm arm64/boot-framework*
adb shell reboot

其他一些使用的指令

設置不編譯優化成odex:
1 .make showcommands WITH_DEXPREOPT=false
或者mm WITH_DEXPREOPT=false
2 單獨模塊 Android.mk添加LOCAL_DEX_PREOPT := false

2 adb disable-verity

重新燒錄系統後,adb remount報以下錯誤:

Use "adb disable-verity" to disable verity.
If you do not, remount may succeed, however, you will still not be able to write to these volumes.
remount succeeded

雖然顯示remount succeeded,但是依然不能寫成功。

adb disable-verity
adb reboot
//重啓後
adb root
adb remount

3 unknown package name of class file

framework 下面添加了一些新的java文件。報錯:unknown package name of class file。
在build/core/tasks/check_boot_jars/package_whitelist.txt
查看該文件發現PRODUCT_BOOT_JARS的其他jar的包名都有在這裏定義,仿照文件格式把自己的包名添加到這裏,重新編譯ok!

4 fastboot 燒錄指令

Android手機分區(每個分區都有相應的img文件對應):開機啓動畫面區(splash1),數據恢復區(recovery),內核區(boot),
系統區(system),數據緩存區(cache),用戶數據區(userdata)。

//進入bootloader模式
adb reboot bootloader
//查找設備
fastboot devices
//燒寫多個分區(boot recovery system vendor),並自動重啓
export ANDROID_PRODUCT_OUT=/home/py/android8.0/out/target/product/angler
fastboot flashall
//單獨燒寫某個img
//刷寫boot
fastboot flash boot boot.img
//刷寫recovery
fastboot flash recovery recovery.img
//刷寫system
fastboot flash system system.img
//刷寫userdata
fastboot flash userdata userdata.img
//重啓
fastboot reboot

5 設置系統語言默認爲中文

1.android 系統的默認語言配置文件路徑如下:
build/make/target/product/full_base.mk
在文件中找到變量 “PRODUCT_LOCALES”
然後修改爲如下形式即可:
PRODUCT_LOCALES := zh_CN
2.刪除多餘的語言包
配置文件路徑如下:
build/make/target/product/locales_full.mk
在文件中找到變量"PRODUCT_LOCALES"
把不需要的語言刪除就好,例如:
PRODUCT_LOCALES := en_US zh_HK zh_CN

6 nexus 8.0刷機,重啓後時間和上次時間不一致,差別大。

燒錄vendor.img後,重啓時間沒有問題。
以angler OPR6.170623.0.19爲例

./extract-qcom-angler.sh
//輸入I ACCEPT
./extract-huawei-angler.sh
//輸入I ACCEPT

之後make編譯會編譯出vendor.img.燒錄即可。

7 nexus 8.0刷機,自動確定日期和時間無效

adb shell settings put global ntp_server ntp7.aliyun.com
然後重啓設備。

8 nexus 8.0連接WiFi成功,但提示“已連接 但無法訪問互聯網”

adb shell settings put global captive_portal_https_url https://www.google.cn/generate_204
重啓或者開關飛行模式。

9 nexus 8.0 設置日期彈框以2007.1.1開始

設置-日期和時間-設置日期–彈框默認使2007.01.01,修改成2020.0101.
package/apps/Settings/src/com/android/settings/datetime/DatePreferenceController.java
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章