关于apk的反编译修改,你不知道的事,尤其是官方Rom

来源:互联网 发布:苹果mac 镜像下载 编辑:程序博客网 时间:2024/06/14 19:34
最近,有几个Rom组的朋友来问我反编译的事,让我颇为诧异。

我想,既然如此,干脆把这个问题提出来探讨一下好了,没什么值得藏私的。

很多新手,包括老手,在反编译修改系统apk的时候,经常遇到无法成功的情况,尤其是在反编译官方Rom的系统apk时候。
很多朋友在反编译时使用的是第三方工具集合(如土豆工具箱等),然后直接反编译。
网上也有很多的教程告诉我们直接apktool,执行这个命令  apktool d xxx.apk ;
稍微全面的教程还会告诉我们先要 apktool if framework-res.apk 。

可是,很多时候光是这样还是不能成功。

那么问题出在哪里呢?请听我慢慢道来。

大家都知道 framework-res.apk 在Rom中是个很重要的apk文件。
它本身其实不是一个android程序,因为它内部没有 classes.dex 可执行文件。
framework,中文意思是框架、架构。
在Android系统里,它是所有其他应用的资源配置中心,其内部的 resources.arsc 里包含了系统整体资源的配置列表
其中非常重要的一个文件便是 framework-res.apk/res/values/public.xml ,它为框架内的每个图片等资源文件设定了唯一的一个id。

apktool if framework-res.apk 命令的作用在于安装这个资源列表,以便在反编译其他依赖该资源列表的apk时获取参数。
如果参数不对,各资源文件的id就会出错,从而造成无法反编译或者显示出错等问题。

比如,我要反编译修改状态栏systemui.apk ,但是状态栏上显示的图标并不全部包含在systemui.apk里。
systemui.apk 里的 class.dex 文件在反编译回去时就没有可依赖的参数列表,从而造成反编译出的id出错或者直接无法反编译。

那么,为什么有时候即便安装了用 apktool if framework-res.apk 命令安装了framework-res.apk ,反编译时却任然失败呢?
这种情况通常在反编译官方Rom的时候出现,如果你的apktool版本够新的话,它会提示你少了一个 id 为2的resource table。
这个时候请检查 system/framework 目录下,除了 framework-res.apk ,是否还有其他的apk文件?
如华为荣耀U8860就还有一个 framework-res-hwext.apk , 这就是症结所在了。
它是官方新增的一个框架文件,里面包含一个 id 为2的资源配置列表,系统自带的 framework-res.apk 的 id 为1 。
这下明白为什么执行 apktool if framework-res.apk 之后,系统提示“Framework installed to: X:\...\apktool\framework\1.apk”了吧?
同理,在执行 apktool if framework-res-hwext.apk 之后, 系统会提示“Framework installed to: X:\...\apktool\framework\2.apk”。
如果有第三个的话,依此类推...

其他的官方Rom,
如HTC的 com.htc.resources.apk ,三星的 twframework-res.apk 等也分别是包含 id 为2的的资源配置文件的apk。
如果你想反编译系统 apk ,也必须先安装他们。

到此,我相信,多数朋友应该明白为何反编译官方Rom的apk总是失败的原因了。

另外,跟新手朋友们啰嗦一句,反编译app目录下的系统apk时,最好先安装该Rom对应的framework-res.apk ;
用其他Rom的,可能会无法反编译,或者编译完成后图片等资源显示错误,如该显示电池的图标的地方却显示sim卡图标了。

反过来,图标显示出错也多半是因为资源列表不一致,从而使得系统引用了其他图标。



原创粉丝点击