Q:系统未休眠原因(高通)
测试之前执行 dumpsys batterystats --reset 清空电池信息,
测完 dumpsys batterystats 分析,可以先看 Battery History 中谁在什么时间持有 wake_lock。
再看 kernel wake locks 发现 soc:gpio_keys 持有wake锁的时间最久,测试时是在15s内需要休眠,所以原因大概率就是这里
All kernel wake locks:
Kernel Wake lock soc:gpio_keys: 31s 820ms (0 times) realtime
Kernel Wake lock PowerManagerService.WakeLocks: 9s 44ms (4 times) realtime
Kernel Wake lock 800f000.qcom,spmi:qcom,pm660@0:qcom,qpnp-smb2: 1s 58ms (1 times) realtime
Kernel Wake lock CHG_PLCY_HVDCP_WL: 926ms (16 times) realtime
Kernel Wake lock NETLINK: 894ms (43 times) realtime
...
再附上一个确认从休眠状态唤醒的唤醒源的方法
两种比较明显的kernel log:
Pending Wakeup Sources: soc:gpio_keys
pm_system_irq_wakeup: 336 triggered wake_on_motion
01-03 08:37:48.599 0 0 E PM : =============================================
01-03 08:37:48.599 0 0 E PM : ============ Enter to Suspend!!! ============
01-03 08:37:48.599 0 0 E PM : =============================================
01-03 08:37:48.599 0 0 I PM : suspend entry (deep)
01-03 08:37:48.599 0 0 I PM : Syncing filesystems ... done.
01-03 08:37:48.610 0 0 E : qti_leds_pm_callback]------------
01-03 08:37:48.610 0 0 I : Freezing user space processes ... (elapsed 0.024 seconds) done.
01-03 08:37:48.634 0 0 I : OOM killer disabled.
01-03 08:37:48.634 0 0 I : Freezing remaining freezable tasks ... (elapsed 0.011 seconds) done.
01-03 08:37:48.646 0 0 I : Suspending console(s) (use no_console_suspend to debug)
01-03 08:37:48.669 0 0 E afe_set_lpass_clock_v2: afe_set_source_clk fail -22
01-03 08:37:48.672 0 0 I PM : Pending Wakeup Sources: soc:gpio_keys
01-03 08:37:48.672 0 0 E PM : Some devices failed to suspend, or early wake event detected
01-03 08:37:48.672 0 0 E PM : =============================================
01-03 08:37:48.672 0 0 E PM : ============== Resume Start!!! ==============
01-03 08:37:48.672 0 0 E PM : =============================================
01-03 08:37:48.689 0 0 I : OOM killer enabled.
01-03 08:37:48.721 1052 6333 I BatteryStatsService: In wakeup_callback: suspend aborted
01-03 08:37:48.689 0 0 I : Restarting tasks ... done.
01-03 08:37:48.712 0 0 E : qti_leds_pm_callback]------------
01-03 08:37:48.712 0 0 E Abort : Pending Wakeup Sources: soc:gpio_keys
01-03 08:37:48.712 0 0 E PM : =============================================
01-03 08:37:48.712 0 0 E PM : ============ Exit from Suspend!! ============
01-03 08:37:48.712 0 0 E PM : =============================================
...
01-03 08:37:49.734 0 0 E PM : =============================================
01-03 08:37:49.734 0 0 E PM : ============== Suspend Done!!! ==============
01-03 08:37:49.734 0 0 E PM : =============================================
01-03 08:37:49.734 0 0 I resume cycles: 457469796428
01-03 08:37:49.734 0 0 W pm_system_irq_wakeup: 336 triggered wake_on_motion
Q:修改保存log大小
#查看当前保存log的大小
adb logcat -g
#全部修改为1M
adb logcat -G 1M
#只修改kernel的
adb logcat -bkernel -G 1M
Q:查看进程是32位还是64位
方法一:
查看进程 mediaserver 是多少位
#查看mediaserver的可执行文件位置
which mediaserver
/system/bin/mediaserver
#看这个文件的信息,其中写了是12位
file /system/bin/mediaserver
/system/bin/mediaserver: ELF shared object, 32-bit LSB arm, dynamic (/system/bin/linker), for Android 34, BuildID=88435f855e340c25
2a9ff7db3edc845e, stripped
方法二:
#查看 zygote64 和 zygote 的 PID,分别是 1109 1110
ps -A |grep zygote
root 1109 1 16345824 50172 do_sys_poll 0 S zygote64
root 1110 1 1780684 37896 do_sys_poll 0 S zygote
#查看进程的父进程是哪个,zygote64 fork 的一般就是64位, zygote fork 32位
ps -eT |grep zcam
u0_a206 19794 19794 1109 16922488 114988 do_epoll_wait 0 S com.symbol.zcam
Q:恢复出厂设置
开机后进入recorver,原因未知
报错如下
virtual bool android::fiemap::ImageManagerBinder::MapImageDevice(const std::string &, const std::chrono::milliseconds &, std::string *) binder returned: Failed to map
Overlayfs setup for /system failed, skipping: No such process
virtual bool android::fiemap::ImageManagerBinder::MapImageDevice(const std::string &, const std::chrono::milliseconds &, std::string *) binder returned: Failed to map
[libfs_mgr]could not map scratch image
Overlayfs setup for /vendor failed, skipping: No such process
virtual bool android::fiemap::ImageManagerBinder::MapImageDevice(const std::string &, const std::chrono::milliseconds &, std::string *) binder returned: Failed to map
[libfs_mgr]could not map scratch image
进入fastboot,擦除一些镜像后ok(相当于恢复出厂设置)
adb reboot bootloader
fastboot erase userdata
fastboot erase meradata
fastboot erase para
fastboot erase misc
fastboot reboot
Q:安装应用失败
PS D:\temp> adb install -d -r .\Meet13.apk
Performing Streamed Install
adb: failed to install .\Meet13.apk: Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Existing package com.google.android.apps.tachyon signatures do not match newer version; ignoring!]
想要在 Android U 上装 Android T 的 谷歌Meet 应用,但是签名不同,一个 android,一个 tachyon
所以需要先把U上的Meet卸载,重启之后再安装
adb shell
#根据top命令看到功耗最高的是 com.google.android.apps.tachyon ,所以大概率这个包就是Meet应用
pm list packages |grep com.google.android.apps.tachyon # 找到应用的包名
pm path com.google.android.apps.tachyon # 找到应用位置: /product/app/Meet/
rm -rf /product/app/Meet/
# 重启安卓
adb shell stop
adb shell start
adb install .\Meet13.apk
Q:查看Clock状态
Elsa_32:/sys/kernel/debug/clk # cat clk_summary
enable prepare protect duty
clock count count count rate accuracy phase cycle
---------------------------------------------------------------------------------------------
PG_VPU 0 0 0 0 0 0 50000
PG_ADSP 0 0 0 0 0 0 50000
......
Q:getprop读取属性
xref: /LINUX/android/device/zebra/common/sepolicy/property_contexts
27 #For Camera tuning version
28 persist.vendor.tuning.camera.0 u:object_r:vendor_zebra_camera_prop:s0
29 persist.vendor.tuning.camera.1 u:object_r:vendor_zebra_camera_prop:s0
比如上面 persist.vendor.tuning.camera.0 的属性可以通过下面的命令直接查看
adb root
adb shell getprop persist.vendor.tuning.camera.0
Q:dump相机信息
adb shell dumpsys media.camera
在打印的信息中找到Latest received frame(如果没搜到就多dump几次)
检索 android.sensor.exposureTime 和 android.control.aeTargetFpsRange 可以看到曝光时间和帧率
Latest received frame:
Dumping camera metadata array: 193 / 193 entries, 55888 / 55888 bytes of extra data.
Version: 1, Flags: 00000000
...
// [10 30] 表示当前设定的帧率为 10~30
android.control.aeTargetFpsRange (10005): int32[2]
[10 30 ]
...
android.sensor.exposureTime (e0000): int64[1]
[75000000 ]
Q:*软件实时控制GPIO(mtk平台)
如何看当前是上拉还是下拉:
首先看第二位,如果第二位是1,则接着看第三位,第三位是0就是下拉1就是上拉;如果第二位是0,则接着看第四位0/1就是下拉/上拉
第二位表示 选择输出 1 还是输入 0
第三位表示 是否正在输出
第四位表示 是否正在输入
倒数第三位表示 是否支持上下拉
倒数第二位表示 选择上拉 1 还是下拉 0
adb shell 后,进到 /sys/devices/platform/pinctrl 目录下查看 mt_gpio 文件可以看到gpio的配置
cat mt_gpio
#修改权限
chmod 777 mt_gpio
#gpio49配置为输出
echo out 49 1 > mt_gpio
#部分后面带括号的表示 使用哪个上拉电阻 R1 R0,这个就是使用的R0
013: 0100000110 (0 1)
#修改电阻方法如下,在dts里
gpio-keys {
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <&right_scan_key_irq_default>;
......
pio: pinctrl@1000b000 {
right_scan_key_irq_default: right_scan_key_irq_default {
pins_cmd_dat {
pinmux = <PINMUX_GPIO92__FUNC_GPIO92>;
# 看后面 R1R0_01 表示使用的R0, 使用R1则是R1R0_10
bias-pull-up = <MTK_PUPD_SET_R1R0_01>;
};
};
Q:adb控制led灯
sys/class/leds 目录下有red,blue,green,red_Ⅱ等2节点
#修改对应节点的brightness即可改变对应灯的亮度
echo 255 > brightness
#修改trigger为timer可以让灯闪烁
echo timer > trigger
Q:.te导致的报错
out/soong/.intermediates/prebuilts/build-tools/m4/linux_glibc_x86_64/m4:device/mediatek/sepolicy/basic/non_plat/file.te:687: ERROR: end of file in comment
prebuilts/build-tools/linux-x86/bin/m4:device/mediatek/sepolicy/basic/non_plat/file_contexts:984: ERROR: end of file in comment
file.te 文件末尾需要多加几个回车符,否则可能会报错
Q:查看NE报错打印堆栈在代码中的位置
addr2line -e 可执行文件 内存地址
addr2line -e *.so xxxx
so选symbol里面的
AEE_AED : #07 pc 0000000000031a88 /vendor/lib64/lib3a.af.so (NS3A::PdAlgo::setPDBlockInfo(PD_CONFIG_T&)+840) (BuildId: 4f207883fcb88aa4d32f389c32481fff)
/* 以这个为例 000000000015538c libcam.hal3a.v3.so */
AEE_AED : #08 pc 000000000015538c /vendor/lib64/libcam.hal3a.v3.so (NS3Av3::PDMgr::SetCaliData2PDCore(PD_ALGO_TUNING_T*, PD_CALIBRATION_DATA_T*)+3668) (BuildId: 334ad1a8b27cddd54bf559c9023f4f46)
AEE_AED : #09 pc 0000000000152810 /vendor/lib64/libcam.hal3a.v3.so (NS3Av3::PDMgr::setPDCaliData(PD_NVRAM_T*)+1704) (BuildId: 334ad1a8b27cddd54bf559c9023f4f46)
~/workspace/项目/target/out/target/product/tb8768p1_64_bsp/symbols$ addr2line -e vendor/lib64/libcam.hal3a.v3.so 000000000015538c
vendor/mediatek/proprietary/hardware/mtkcam/aaa/source/mt6765/pd_mgr/pd_mgr.cpp:1612
Q:fastboot模式开不开机
fasboot reboot 重启后也一直在fastboot模式
可能是OEM锁没开,或者软件有问题
fastboot oem remaining_reboot
如果软件没问题拆装电池再开机
Q:高通项目开不开机,一直重启
A:
串口线看log,发现提示什么校验过快之后接着就重启了
[ 16.152864] reboot: Restarting system with command 'dm-verity device corrupted' //这个,说明校验错误
[ 16.160450] Going down for restart now
长按音量- 进fastboot模式
#(不确定是哪个,作用是关闭这个校验)
fastboot --disable-verity flash vbmeta Z:\项目\target\out\target\product\trinket\vbmeta.img
fastboot --disable-verification flash vbmeta Z:\项目\target\out\target\product\trinket\vbmeta.img
fastboot --set-a
fastboot reboot
可以开机了
Q:查看手机显示布局
C:\Users\xxx\AppData\Local\Android\Sdk\tools\bin\uiautomatorviewer.bat
使用Android的SDK里的 uiautomatorviewer.bat 工具可以方便的查看手机显示的布局
Q:内核层打堆栈(C)
A:https://gityuan.com/2017/07/09/android_debug/
#include <linux/kernel.h>
dump_stack()
查看时可以使用
logcat |grep -A 20 "Call trace:"
dmesg
Q:框架层打堆栈(JAVA)
A:https://gityuan.com/2017/07/09/android_debug/
Log.d("debug", "", new Exception("stack"));
Q:框架层打堆栈(CPP)
A:https://gityuan.com/2017/07/09/android_debug/
找到要打堆栈的文件对应的android.bp文件
cc_library_shared {
name: "libcameraservice",
header_libs: [
"libutils_headers",
],
shared_libs: [
"libutilscallstack",
],
#include <utils/CallStack.h>
CallStack stack("debug_trace");
Q:Android Studio下载的demo,编译时 R.文件 爆红
A:AndroidManifest文件中 包名package错误