2021-09-27 Android AEE简单介绍以及如何抓第三方app 的exception

本文介绍了AEE(AndroidExceptionEngine),它是安卓系统中用于异常捕获和调试信息生成的机制。当手机出现错误导致异常重启或卡死时,AEE会生成加密的db文件来保存内存信息,便于后续的调试。通过设置过滤器和exceptionlevel,可以捕获第三方应用的异常。在mode3和mode4下,分别对应不同的异常级别,可用于不同场景的调试需求。同时,文章还展示了jnicrash时的日志分析过程。

一、AEE介绍
       AEE (Android Exception Engine)是安卓的一个异常捕获和调试信息生成机制。

      手机发生错误(异常重启/卡死)时生成db文件(一种被加密过的二进制文件)用来保存和记录异常发生时候的全部内存信息,经过调试和仿真这些信息,能够追踪到异常的缘由。

二、如何抓第三方app 的exception

      1、setprop persist.vendor.mtk.aee.filter 0 vendor\mediatek\proprietary\frameworks\base\core\java\com\mediatek\aee\ExceptionLogImpl.java

2、setprop persist.vendor.mtk.aee.mode 3 修改exception level

     关于aee mode,我们一般只会用到mode 3跟mode 4;
mode 3对应exception level 1, eng load默认会是在这个mode     // exception level 1 对应FATAL +EXCETPTION + REMINDING(manual dump)
mode 4对应exception  level 0 、user/userdebug load默认会是在这个mode;  //exception level 0只抓fatal db.

 vendor\mediatek\proprietary\frameworks\base\core\java\com\mediatek\aee\jni\com_mediatek_aee_exceptionlog.cpp

 三、看一个jni crash时候的log

参考文章

mtk log系统详解 - 尚码园

深入分析Linux Kernel Exception 框架(基础篇) - 程序员Android - 博客园

【MTK】user版本下输出aee db 和 anr trace_ch853199769的博客-CSDN博客

以下是关于 `mblock-5-aee_lk` 的深度技术解析,结合 ARM Trusted Firmware 和芯片级实现细节: --- ### **1. 基础概念** `mblock-5-aee_lk` 表示 **内存块编号5AEE-LK保留区域**,关键属性: - **类型**:`no-map` 物理保留内存(Linux内核不可见) - **典型地址**:`0x48000000-0x48200000`(MTK平台常见) - **作用**:存储异常引擎(Abnormal Event Engine)的调试内核(Little Kernel) --- ### **2. 技术实现细节** #### **2.1 内存声明方式** 在 **设备树(DTS)** 中的定义示例: ```dts reserved-memory { #address-cells = <2>; #size-cells = <2>; ranges; aee_lk: aee-lk@48000000 { compatible = "mediatek,aee-reserved"; no-map; reg = <0 0x48000000 0 0x200000>; // 2MB空间 mediatek,block-id = <5>; // mblock-5 }; }; ``` #### **2.2 启动阶段的初始化流程** 1. **BL1阶段**(BootROM后): ```c // 在ARM TF-A中解析设备树 void bl2_plat_preload_setup(void) { dt_parse_reserved_memory(); // 提取所有no-map区域 mblock_init(); // 初始化内存块管理器 } ``` 2. **BL2阶段**(当前代码上下文): ```c const struct reserved_mem *aee_lk = mblock_query_reserved(5); // 通过block-id查询 mmap_add_dynamic_region(aee_lk->base, aee_lk->base, aee_lk->size, MT_MEMORY | MT_RW); // 动态映射 ``` #### **2.3 内存访问权限配置** - **MMU属性**: - **MTK平台**:配置为 `Device-nGnRnE`(强一致性,无缓存) - **高通平台**:`MT_NON_CACHEABLE`(通过SCSHARED协议) - **MPU保护**(Cortex-M系列): ```asm LDR r0, =0x48000000 // Base address LDR r1, =0x48200000 // End address BL TZ_MPU_SetRegion // TrustZone内存保护 ``` --- ### **3. 异常处理场景下的工作流程** #### **3.1 内存加载时序** ```mermaid sequenceDiagram BL2->>+eMMC: 读取分区"lk"(偏移0x80000) eMMC-->>-BL2: 返回AEE-LK镜像数据 BL2->>DMA: 配置传输 (src=0x60080000, dst=0x48000000) DMA->>AEE_LK: 写入镜像并校验CRC32 AEE_LK-->>BL2: 加载完成中断(IRQ88) ``` #### **3.2 关键数据格式** AEE-LK镜像头部结构(小端序): | 偏移量 | 字段名 | 长度 | 说明 | |--------|-------------|------|--------------------------| | 0x0 | magic | 4B | 0x4C4B4145 ("AELK") | | 0x4 | version | 2B | 0x0102 (v1.2) | | 0x6 | load_size | 4B | 实际载荷大小(不含头) | | 0xA | crc32 | 4B | 全镜像CRC校验值 | | 0xE | reserved | 2B | 对齐填充 | --- ### **4. 平台差异处理** #### **4.1 高通平台(QCOM)** - **内存查询方式**: ```c void *aee_lk = smem_get_entry(SMEM_AEE_LK, &size); // 通过SMEM ID获取 ``` - **安全要求**:必须通过XPU(内存保护单元)配置写保护: ```c qcom_xpu_config(REGION_AEE_LK, XPU_ATTR_AP_RW_RW); ``` #### **4.2 华为平台(HiSilicon)** - **加密加载**: ```c hisi_secboot_decrypt(aee_lk_addr, img_size, KEY_ID_AEE); ``` - **内存隔离**:通过TEE的`MEM_REFCOUNT`机制防止非法访问。 --- ### **5. 调试与问题排查** #### **5.1 常见故障** 1. **内存冲突错误**: ```bash [BL2] ERROR: mblock-5 overlap with TZRAM (0x48100000-0x48300000) ``` **解决方案**:调整设备树的基地址或大小。 2. **加载失败**: ```bash AEE-LK CRC32 mismatch: expected 0x8A3C5E1D, got 0x2749B06F ``` **排查步骤**: - 使用`dd`命令验证原始镜像完整性 - 检查eMMC分区表是否损坏 #### **5.2 调试工具** - **MTK平台**: ```bash mtk_dump_mem.py -a 0x48000000 -l 0x200000 -o aee_dump.bin ``` - **通用方法**: ```c // 在BL2中添加调试打印 pal_log_info("AEE-LK loaded at %p, size=0x%x\n", aee_lk->start, size); ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值