起因
收到了一个 OPPO A53 用户的报错,错误是从 android.widget.OppoFloatPanelView 里面报出来的,很明显,这是一个 rom 里的 view。所以想尝试拿到 rom 里 OppoFloatPanelView 的源码。
Caused by: android.content.res.Resources$NotFoundException: Resource ID #0xc05040d
at android.content.res.Resources.getValue(Resources.java:1333)
at android.content.res.Resources.getDimension(Resources.java:644)
at android.widget.OppoFloatPanelView.initArrowOffset(OppoFloatPanelView.java:52)
at android.widget.OppoFloatPanelView.initialize(OppoFloatPanelView.java:46)
at android.widget.OppoFloatPanelView.<init>(OppoFloatPanelView.java:42)
... 47 more
下载固件
去官方网站 https://bbs.coloros.net/firmwareLoad
下载 OPPO A53 的固件
得到 A53_11_A.08_OTA_008_all_201601212240.zip,并解压缩
提取镜像
使用 sdat2img 工具得到 system.img
./sdat2img.py system.transfer.list system.new.dat system.img
看到 system.img 的格式为 Linux rev 1.0 ext4 filesystem data
file system.img
system.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-946fc0f9f25b (extents) (large files)
挂载 system.img
必须要使用到 osxfuse
brew cask install osxfuse
然后有两个工具 ext4fuse,fuse-ext2
ext4fuse 只支持读操作,但安装简单,fuse-ext2 安装比较麻烦,最后没有搞出来,所以决定使用 ext4fuse。
安装 ext4fuse:
brew install ext4fuse
然后执行
ext4fuse system.img ./out
得到镜像内部目录
具体对焦 framework 目录,将 framework 全部拷贝出来。将其中 arm 内所有文件移到 framework 中。
接下来使用 dextra
~/Downloads/dextra -dextract ~/Desktop/framework/boot.oat
使用 jadx 对 dex 进行反编译
jadx system@framework@framework.jar@classes.dex
打开结果目录,即可找到 OppoFloatPanelView