極力推薦文章:歡迎收藏
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 鍵、 音量+
至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!
如有侵權,請聯繫小編,小編對此深感抱歉,屆時小編會刪除文章,立即停止侵權行爲,請您多多包涵。