android开发的一些问题

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错误

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值