極力推薦文章:歡迎收藏
Android 干貨分享
閱讀五分鍾,每日十點,和您一起終身學習,這里是程序員Android
本篇文章主要介紹展訊平台手機開發中的部分重啟問題知識點,通過閱讀本篇文章,您將收獲以下內容:
一、 User 版本 默認開啟 sysdump 方法
二、插入SD卡 抓取Sysdump log
三、 sysdump log 分析
四、展訊平台抓取重啟 串口log的方案
五、展訊平台判斷重啟類型
六、展訊平台關閉 sysdump 與watchdog關聯
七、展訊平台手動觸發sysdump 方法
一、 User 版本 默認開啟 sysdump 方法
首先,為什么要這么干?
主要原因是,展訊平台部分重啟問題,同樣的代碼,userdebug
版本無法復現,User
版本 可以復現,這樣才有此默認開啟sysdump
的方案。
那么展訊平台user
版本默認開啟sysdump
方案
修改一下代碼
device\sprd\xxxx\common\rootdir\root\init.common.rc
在 on post-fs-data 下添加:
// 設置 Ylog 默認開啟開關 1 開啟,0或不寫 關閉
setprop persist.ylog.enabled 1
start ylog
// 設置sysdump 默認開關屬性值 開啟為true 關閉 false
setprop debug.sysdump.enabled true
setprop persist.sys.eng.reset 0
在代碼中添加后,可以進行一下操作查看是否成功
-
- 確認是否開啟
sysdump
開關
- 確認是否開啟
*#*#83781#*#* (進入工程模式菜單)
-> DEBUG&LOG
-> YLog
-> Setting
-> Sysdump Enable (開啟sysdump)
-
- 確認是否開
Ylog
- 確認是否開
*#*#83781#*#*(進入工程模式菜單)
-> DEBUG&LOG
-> YLog (開啟ylog)
二、插入SD卡 抓取Sysdump log
注意事項 一定要 插入4G及以上的SD卡,否則無法抓的重啟的dump log
三、 sysdump log 分析
插入SD 卡后,成功dump log
信息如下:
dump log
成功后,我們需要解析 sysdump log
,解析過程中需要使用對應版本的 vmlinux (out/target/product/sp9832e_1h10_go/obj/KERNEL/vmlinux
) 以及
crash_arm (vendor/sprd/tools/crash/crash_arm
) 解析腳本來解析dumpcore
文件。
-
- 將 vmlinux 、crash_arm、 sysdump log 放置同一目錄
cp out/target/product/sp9832e_1h10_go/obj/KERNEL/vmlinux reboot/
cp vendor/sprd/tools/crash/crash_arm reboot/
-
- 將 sysdump 所有文件 追加到一個文件中
-
- 使用 crash_arm 腳本 聯合 vmlinux 解析 sysdump log
-
- 使用 Log 命令 將
Crash log
追加到指定文件中
- 使用 Log 命令 將
-
- 查看
log
,分析重啟的具體原因
- 查看
- 6.參考調試命令
32 位系統調試命令
./crash_arm -m phys_base=0X80000000 --cpus number2 vmlinux all
64 位系統調試命令
./crash_arm64 vmlinux all -m phys_offset=0x80000000
四、展訊平台抓取重啟 串口log的方案
- 調高 Kernel log 等級為 7
修改代碼路徑如下:
kernel/arch/arm/boot/dts/<sprd-xx-yourboard>.dts
,將bootargs = ""
里修改loglevel字段 1 修改為 7 loglevel=7, console=ttyS1,115200n8
。
搜索關鍵字 loglevel 即可。
- 將 logcat log 重定向到 串口
修改init.common.rc
代碼(device/sprd/sharkle/common/rootdir/root/init.common.rc
)。
在 init 腳本中添加 logcat
重定向 Service .
+service logcat /system/bin/logcat -f /dev/kmsg *:w
+ class main
+ user root
+ group log
+ oneshot
on boot
chown system system /proc/wcn_gnss/start
chown system system /proc/wcn_gnss/stop
- disabble SElinux
在 init.cpp (/system/core/init/init.cpp
)中,讓selinux_is_enforcing(void)
函數直接返回false,同時注掉selinux_status_from_cmdline()
函數。
#if 0
static selinux_enforcing_status selinux_status_from_cmdline() {
selinux_enforcing_status status = SELINUX_ENFORCING;
import_kernel_cmdline(false, [&](const std::string& key, const std::string& value, bool in_qemu) {
if (key == "androidboot.selinux" && value == "permissive") {
status = SELINUX_PERMISSIVE;
}
});
return status;
}
#endif
static bool selinux_is_enforcing(void)
{
#if 0
if (ALLOW_PERMISSIVE_SELINUX) {
return selinux_status_from_cmdline() == SELINUX_ENFORCING;
}
return true;
#else
return false;
#endif
}
五、展訊平台判斷重啟類型
- 在main.log 中查看
在 main.log
中搜索關鍵字 bootmode
2.在 phone.info 文件中查看
在 Ylog
->poweron
->aplog
目錄下的phone.info 文件中 搜索關鍵字 bootmode
- 在
Sysdump
中查看觸發重啟dump
的類型
六、展訊平台關閉 sysdump 與watchdog關聯
關閉sysdump
與watchdog
關聯,防止開啟sysdump
后watchdog
被默認關閉,導致無法抓取復現到重啟log
的dump
。
修改文件路徑如下:
kernel/drivers/soc/sprd/debug/sysdump/sysdump.c
sysdump_status = 1;
sprd_set_reboot_mode("dumpenable");
set_sysdump_enable(1);
//****************
- sysdump_enable_watchdog(0);
//*************
} else if (!strncmp(sysdump_buf, "off", 3)) {
pr_emerg("sprd_sysdump_write: disable user version sysdump!!!\n");
sysdump_status = 0;
七、展訊平台手動觸發sysdump
方法
-
- 在
Kernel
未完全死掉時候,觸發SWT(優先方案)
- 在
手動觸發方案:
同時按住音量+ 、音量- 、然后雙擊Power鍵
-
- 在
Kernel
完全死掉,觸發HWT
- 在
手動觸發方案:
長按Power 鍵、 音量+
至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!