问题背景
在反编译测试中,使用apktool反编译apk报错,如:当我们反编译从华为MATE20 PRO导出的时钟apk时,得到了一条错误信息如下:
$ apktool d com.android.deskclock.apk
I: Loading resource table...
I: Decoding resources...
I: Loading resource table from file: 1.apk
W: Could not decode attr value, using undecoded value instead: ns=android, name=drawable
W: Could not decode attr value, using undecoded value instead: ns=android, name=icon
Can't find framework resources for package of id: 2. You must install proper framework files, see project website for more info.
问题分析
错误提示:该错误原因提示我们不能找到id=2的框架包资源,必须安装正确的框架(framework)文件;
报错原因:我们反编译的apk针对特定的框架(如:华为的framework-res.apk、framework-res-hwext,本文以华为MATE20 PRO为例)做了适配,依赖framework中部分资源文件,在反编译过程中未找到相关的文件所以报错。
解决方案
由上述分析可知,当发生此类错误时,需要我们首先安装依赖的框架资源文件,然后再执行反编译。整个操作流程如下:
此刻我们返回到问题背景,发现报错信息为Can't find framework resources for package of id: 2.,报错信息中是找不到id=2的framework resources,而当前安装的id=1,说明该framework resources不多,此时执行apktool反编译依然会报错,在framework文件夹中发现还有另外一个framework-res-hwext.apk文件,这里我们继续安装。
对framwork-res.apk进行安装,采用的命令为apktool if framework-res.apk,执行结果如下:
$ apktool if com.htc.resources.apk
I: Framework installed to: C:\Users\XXX\AppData\Local\apktool\framework\1.apk
对framework-res-hwext.apk进行,用的命令为apktool if framework-res-hwext.apk,执行结果如下:
$ apktool if framework-res-hwext.apk
I: Framework installed to: C:\Users\XXX\AppData\Local\apktool\framework\2.apk
此时我们现在安装的framework resource与报错信息中的id一致,说明已找到正确的framework resource。
再一次执行反编译,命令如下apktools d com.android.deskclock.apk,结果如下:
$ apktool d com.android.deskclock.apk
I:.............
I: Decoding values */* XMLs.
I: Baksmaling classes.dex...
I: Copying assets and libs..
I: Copying unknown files...
I: Copying original files...
反编译成功,反编译文件夹中包含smali文件等内容。
关于查找framework resource的说明:
在大多数情况下,设备上/system/framework中的任何apk都将是一个框架文件(framework resource)。在某些设备上,它们可能位于/data/system framework中,甚至巧妙地隐藏在/system/app或/system/priv app中。通常它们以"resources", "res" 或者"framework"命名。