異常Log:
01-01 07:05:18.156: W/System(9653): ClassLoader referenced unknown path: /system/framework/ConnectivityExt.jar
01-01 07:05:18.161: W/System(9653): ClassLoader referenced unknown path: /system/priv-app/QtiTetherService/lib/arm
01-01 07:05:18.169: I/art(9653): Rejecting re-init on previously-failed class java.lang.Class<com.qualcomm.qti.tetherservice.TetherService$1>
01-01 07:05:18.169: I/art(9653): Rejecting re-init on previously-failed class java.lang.Class<com.qualcomm.qti.tetherservice.TetherService$1>
01-01 07:05:18.183: I/art(9653): Rejecting re-init on previously-failed class java.lang.Class<com.qualcomm.qti.tetherservice.TetherService$1>
01-01 07:05:18.183: D/AndroidRuntime(9653): Shutting down VM
01-01 07:05:18.184: E/AndroidRuntime(9653): FATAL EXCEPTION: main
01-01 07:05:18.184: E/AndroidRuntime(9653): Process: com.qualcomm.qti.tetherservice, PID: 9653
01-01 07:05:18.184: E/AndroidRuntime(9653): java.lang.NoClassDefFoundError: com.qualcomm.qti.tetherservice.TetherService$1
01-01 07:05:18.184: E/AndroidRuntime(9653): at com.qualcomm.qti.tetherservice.TetherService.<init>(TetherService.java:77)
01-01 07:05:18.184: E/AndroidRuntime(9653): at java.lang.Class.newInstance(Native Method)
01-01 07:05:18.184: E/AndroidRuntime(9653): at android.app.ActivityThread.handleCreateService(ActivityThread.java:2859)
01-01 07:05:18.184: E/AndroidRuntime(9653): at android.app.ActivityThread.access$1900(ActivityThread.java:150)
01-01 07:05:18.184: E/AndroidRuntime(9653): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1427)
01-01 07:05:18.184: E/AndroidRuntime(9653): at android.os.Handler.dispatchMessage(Handler.java:102)
01-01 07:05:18.184: E/AndroidRuntime(9653): at android.os.Looper.loop(Looper.java:148)
01-01 07:05:18.184: E/AndroidRuntime(9653): at android.app.ActivityThread.main(ActivityThread.java:5417)
01-01 07:05:18.184: E/AndroidRuntime(9653): at java.lang.reflect.Method.invoke(Native Method)
01-01 07:05:18.184: E/AndroidRuntime(9653): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
01-01 07:05:18.184: E/AndroidRuntime(9653): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
01-01 07:05:18.187: W/ActivityManager(1279): Process com.qualcomm.qti.tetherservice has crashed too many times: killing!
從log中分析可能是ConnectivityExt.jar這個包沒有引入,到/system/framework下一查看,果真如此。將這個jar包push到手機/system/framework目錄,就不再crash了。
由於剛添加了自己的產品目錄,猜測應該是相關的mk沒有改好。源碼中搜索了下,導入ConnectivityExt.jar的mk爲
vendor/qcom/proprietary/prebuilt_HY11/target/product/msm8226/prebuilt.mk,在此添加打印發現沒有輸出,那就是這裏沒有執行了。
繼續往上查找,引用prebuilt.mk的爲vendor/qcom/proprietary/common/config/device-vendor
ifneq (, $(filter $(PRODUCT_LIST), $(TARGET_PRODUCT)))
***#include device/qcom/$(TARGET_PRODUCT)/BoardConfig.mk
file = device/qcom/$(TARGET_PRODUCT)/BoardConfig.mk
ifeq ($(file), $(wildcard $(file)))
include device/qcom/$(TARGET_PRODUCT)/BoardConfig.mk
else
include vendor/koko/$(TARGET_PRODUCT)/BoardConfig.mk
endif***
ifeq ($(call is-board-platform,msm8660),true)
PREBUILT_BOARD_PLATFORM_DIR := msm8660_surf
else ifeq ($(TARGET_PRODUCT),msm8625)
PREBUILT_BOARD_PLATFORM_DIR := msm8625
else ifeq ($(TARGET_PRODUCT),mpq8064)
PREBUILT_BOARD_PLATFORM_DIR := mpq8064
else
PREBUILT_BOARD_PLATFORM_DIR := $(TARGET_BOARD_PLATFORM)
endif
$(call inherit-product-if-exists, $(QC_PROP_ROOT)/common-noship/etc/device-vendor-noship.mk)
$(call inherit-product-if-exists, $(QC_PROP_ROOT)/prebuilt_grease/target/product/$(PREBUILT_BOARD_PLATFORM_DIR)/prebuilt.mk)
$(call inherit-product-if-exists, $(QC_PROP_ROOT)/prebuilt_HY11/target/product/$(PREBUILT_BOARD_PLATFORM_DIR)/prebuilt.mk)
$(call inherit-product-if-exists, $(QC_PROP_ROOT)/prebuilt_HY22/target/product/$(PREBUILT_BOARD_PLATFORM_DIR)/prebuilt.mk)
從源碼中調用inherit-prouct-if-exists來引入prebuilt.mk,那如果判斷不存在,也就不引入了。在這裏我們看到引用了變量PREBUILT_BOARD_PLATFORM_DIR,這是在上面代碼的if–elseif–else中獲取的。is-board-platform判斷當前的boardplatform是否匹配,而當前的boardplatform又是通過include device/qcom/$(TARGET_PRODUCT)/BoardConfig.mk引入。看到這裏就發現了問題,原來這裏目錄指定爲了device/qcom/…..,而我的product則是新建在了vendor/koko/下了,難怪找不到了。
按照源碼中* *部分做了修改,重新編譯燒錄,順利引用。