=嵌入式开发中的一句话备忘 - 嵌入式linux(安卓特有的特点)

466 阅读8分钟

[TOC]

工具

//安卓的tombstones触发,主要反映的是Android系统中Native层(即基于C/C++编写的代码部分)的进程发生了崩溃。

//Q:如何从linux安装adb和fastboot?

A:

sudo apt install android-tools-adb android-tools-fastboot

kernel

//编译kernel时有些配置可以打开:

#!/bin/sh

make mrproper
export KBUILD_OUTPUT=$(pwd)/out/   #输出编译结果到一个文件夹
make 100ask_imx6ull_defconfig
#printenv
make zImage  -j4 V=1  2>&1 | tee ./_build_kernel_log.txt   #V=1显示详细编译结果
cp $(pwd)/_output/arch/arm/boot/zImage ~/nfs_rootfs

内存问题定位

使用 procrank ,dumpsys meminfo 对比问题前后内存差异.

编译安卓

//编译android如果内存不足,会被killed,可以在Linux系统中,可以通过dd命令和mkswap命令创建一个交换文件,并使用swapon命令激活它。例如:

sudo dd if=/dev/zero of=/swapfile bs=1G count=8 
sudo chmod 600 /swapfile  
sudo mkswap /swapfile  
sudo swapon /swapfile

这将创建一个8GB的交换文件。完成后,你可以通过编辑/etc/fstab文件来确保在系统启动时自动挂载该交换文件。

app的操作

pm list packages

或者,如果您想要获取更多关于每个应用程序的信息,比如权限等信息,可以使用:

pm list packages -f

如果您的设备已经获得了root权限,还可以使用以下命令来列出所有的应用程序,包括系统应用:

pm list packages -s

如果您想要查看已安装的应用程序的详细信息,包括图标、用途、包名等,可以使用:

pm list packages -3

getprop 中的版本号等信息

ro.build.version.release: Android 版本号。
ro.build.version.sdk: Android API 级别。
ro.build.version.security_patch: 安全补丁级别。

启动一个apk的命令行(以com.dfrd.avm为例)

am start -n com.dfrd.avm/.activity.MainActivity

获取触摸按键的坐标


spm8675p1_64_wifi_raite:/ # getevent
add device 1: /dev/input/event0
  name:     "i2c_virtio at virtio bus 90"

/dev/input/event0: 0003 0039 0000001d
/dev/input/event0: 0003 0035 00000082
/dev/input/event0: 0003 0036 0000040f
/dev/input/event0: 0001 014a 00000001
/dev/input/event0: 0003 0000 00000082
/dev/input/event0: 0003 0001 0000040f
/dev/input/event0: 0000 0000 00000000
/dev/input/event0: 0003 0039 ffffffff
/dev/input/event0: 0001 014a 00000000
/dev/input/event0: 0000 0000 00000000

这里

/dev/input/event0: 0003 0035 00000082
/dev/input/event0: 0003 0036 0000040f
/dev/input/event0: 0001 014a 00000001

是一个按下事件,坐标 x=0x82,y=0x40f.

通过命令输入按键

trinket:/ # input keyevent BACK

刷机模式

用adb reboot bootloader 命令先进刷机模式, 然后再用命令去刷写,比如NXP使用uuu命令

Android screencap截屏指令

安卓录屏命令

adb shell screenrecord /sdcard/demo.mp4 录制的视频存放到手机sd卡里,默认录制时间为180s。按Ctrl+C结束录制。

adb shell screenrecord --time-limit 10 /sdcard/demo.mp4 说明:限制视频录制时间为10s

dumpsys

// dumpsys meminfo $pid : 查询进程的内存信息

//dumpsys media.camera :查询摄像头的能力

查看设备分辨率: adb shell wm size

比如G59项目是 Physical size: 1920x720

查看屏幕密度(DPI): adb shell wm density

比如G59项目是 Physical density: 160

Q:aosp代码哪里显示该代码的版本?

要确定AOSP(Android Open Source Project)代码的版本,可以通过检查代码库中的特定文件或使用一些Git命令来实现。下面是一个快速查找指南,帮助你定位版本信息:

信息类型查找位置方法/命令说明
构建版本 (PLATFORM)build/make/core/build_id.mk查看 PLATFORM_VERSION显示主要的平台版本,如 "Android 14" 。
SDK/API 级别build/make/core/version_defaults.mk搜索 PLATFORM_SDK_VERSION对应Android的API级别 。
分支信息代码库中的 .repo/manifests 目录git --git-dir .repo/manifests/.git branch -a列出所有可用的远程分支。
当前分支任意目录(在Repo管理下)repo info显示当前项目各个仓库的分支信息。
内核版本设备系统设置或 /proc/versioncat /proc/version 或 设置 > 关于手机这是编译该内核的源码版本信息,内核源码与AOSP主代码分离 。

🛠️ 操作步骤与技巧

  1. 查看构建版本和SDK版本 你可以直接导航到 build/make/core/ 目录下,查看 build_id.mkversion_defaults.mk 这两个文件。例如,在 build_id.mk 中你可能会看到类似 PLATFORM_VERSION := 14 的配置,这表明这是 Android 14 的代码 。

  2. 确定代码分支

    • 要查看当前项目跟踪的是哪个分支,可以在源码根目录下执行 repo info 命令。
    • 如果想了解这个源码仓库支持哪些分支,可以运行 git --git-dir .repo/manifests/.git branch -a

其他

//某些安卓项目单独升级镜像image,会因为镜像校验导致休眠唤醒和原始版本不一致,可以关闭镜像校验:

adb reboot bootloader  
  
fastboot reboot fastboot  
  
fastboot --disable-verification --disable-verity flash vbmeta E:\Vresion\10.4.3.105\release\ci-s31\S31a_20250906_128G_ufs_Updates\android\vbmeta.img  
  
fastboot flash boot boot.img  
  
fastboot flash vendor vendor.img  
  
fastboot reboot

// 安卓的日志打印有五个等级,分别是:

  1. Verbose:这是最低级别,用于输出一些详细的调试信息。
  2. Debug:用于输出调试信息,可以在开发过程中使用。
  3. Info:用于输出一些重要的信息,如应用启动、网络请求等。
  4. Warning:用于输出警告信息,如一些不严重的错误。
  5. Error:用于输出错误信息。

在Android Studio中,可以直接在Logcat中看到这些等级的日志信息。

//不同项目的安卓设备树可能不同,比如集成在boot.img 中,所以保险起见,直接make kernel -j8同时生成boot.img和dtbo.img,一起升级.编译脚本中必须明确地删除自己项目的.o文件的文件夹,和dtb的文件夹,避免没有实际编译生效.

//上层log开启的标志是

--------- beginning of main

//如果出现重启,则导出的log中有关键字backtrace的类似堆栈打印:

01-01 08:01:34.745  2604 21611 F DEBUG   : backtrace:
01-01 08:01:34.745  2604 21611 F DEBUG   :     #00 pc 00007c8c  /vendor/lib/lib_omx_v4l2_common_arm11_elinux.so (V4l2Object::IsFormatSupported(unsigned int)+8)
01-01 08:01:34.745  2604 21611 F DEBUG   :     #01 pc 00007cdd  /vendor/lib/lib_omx_v4l2_common_arm11_elinux.so 

//实时搜索logcat的log,比如实时搜索 FAULT_CAM : logcat |grep FAULT_CAM

//安卓的版本:8.0简称o版本,9.0简称p版本,以此类推

//安卓文件系统的原始路径: system/core/rootdir android9产品,busybox在 /sbin/busybox,而 /bin里面的二进制大都指向了toybox(/system/bin/下)

//adb remount执行前后的分区差异 image

IMX8 (android 9)

//安卓下uboot里敲fastboot 0,进入fastboot状态,可以方便升级 //安装软件后(adb install -r xxx.apk),桌面不显示图标需要: adb shell settings put system "showallapp" 1 ps -A | grep -i launcher 找到桌面进程,杀一次,就可以了,或者重启设备. 恢复简洁模式: adb shell settings put system "showallapp" 0 adb shell "am force-stop com.dftc.launcher"

//nxp imx 升级使用uuu工具,windows下升级时插入的USB会映射出一个外设: image

//反复开关机,挂机测试时长时间抓log的方法 先查询logcat的使用配置项: ps -A -o ARGS 可以看到: logcat -b main -b system -b crash -f /logcache/log/logcat.log -r2048 -n 50 -v threadtime logcat -b kernel -f /logcache/log/logcat_kernel.log -r1024 -n 50 -v threadtime

如果禁用"-b main -b system -b crash"类型log,就修改 /system/etc/init.logcat.sh 去掉"-b main -b system -b crash"相关行; 如果希望kernel log不要1MB才存一次,可以修改 /system/etc/init.logkernel.sh 中的-r1024 为 -r100,即100KB存一次

//如果要清除所有缓冲区(如radio,kernel..etc),请使用以下命令 adb shell logcat -b all -c 

Qualcomm

//XBL(eXtensible Boot Loader / Secondary Bootloader)是高通平台上的一个扩展引导加载程序。其主要负责芯片驱动及充电等核心应用功能的加载和初始化,对硬件环境进行初始化,并从flash中加载RPM、QSEE等镜像至内存中并执行其初始化。

此外,XBL核心是none-HLOS boot_image代码的一部分,属于高通私有代码。

//Trinket 是骁龙665移动平台的代号

QCM6125是高通骁龙670

QRD:Qualcomm Reference Design(高通参考设计)

IDP Integrated development platform  高通文档中的Integrated Development Platform(IDP)是一个用于开发、部署和运行高通芯片组应用程序的集成开发环境。它提供了一整套开发工具和库,使得开发者可以更加方便地使用高通的芯片组进行应用程序开发,包括硬件抽象层(HAL)、中间件、应用程序框架和开发工具等。IDP使得开发者能够充分利用高通芯片组的性能和功能,同时提供易于使用的开发接口和工具,以简化开发过程并加速应用程序的开发和部署。

QSC——qualcomn single chip,高通单芯片,主要是给非智能机主控的

MDM——mobile date modem,移动数据基带,主要给手机当基带,传输信号的。

MSM——mobile station modem,移动基带处理器,主要给手机当处理器,包含基带。

QSD--Qualcomm Snapdragon,高通老一代的设计体系,新的设计为MSM

具体产品相关

//对于支持休眠唤醒的产品,比如车机,一定要在对外设操作前,增加对休眠唤醒状态GPIO的判断,类似:

http://gerrit.tc.dfmc.com.cn:8080/c/QCM6125/kernel/msm-4.14/+/127648