对某日头条 apk 的反编译和二次打包(二)--在apk中新建Activity

2,190 阅读3分钟

前一篇对某日头条apk 的反编译和二次打包介绍了Apk的反编译和二次打包的流程,打包的apk使得其意见反馈按钮失效。这片文章在此基础上创建新的界面,点击意见反馈之后进入到自己创建的一个自定义的空调控制界面,在代码修改层面更有参考意义。这里只是演示效果,不探讨界面功能,其中这个自定义的空调界面是郭霖公众号里介绍的一篇文章自定义View实战:空调遥控器,对自定义View的学习很有帮助,另外安利一下郭霖的公众号,每天都有干货。

demo apk 下载地址apk下载

工具

对某日头条apk 的反编译和二次打包文中介绍过的工具这里不再介绍。本文中主要用到了Android studio中的插件:java2smali,可以在android studio中搜索到,其功能是可以直接把java代码编译为smali,方便二次打包。

目标

在某日头条的apk中插入一个界面代码,在其设置界面中点击意见反馈进入我们自己创建的界面。效果如下,点击意见反馈进入一个新的空调控制界面:



步骤

1. java到smali的转变

在android studio中写完代码以后,github代码地址有代码,使用java2smali生成代码的smali版本:


其中包括AirMoveView和DrawActivity两个java文件的smali版本



由于匿名内部类的原因,每个java文件生成了两个smali文件。

2. Smali文件的修改

android反编译-smali语法文中介绍了smali的语法,smali中的每个变量均使用路径加类名的方式,因此我们需要修改相关的路径。本文中把smali文件放置在com/ss/android/article/base/feature/mine/路径下,与BaseSettingActivity放在同一个路径。修改四个smali文件中的变量为正确的路径,如下所示:Github地址中有完整的代码,可以去下载学习。


3. 资源文件和id

界面一般是需要xml文件来做布局的,因此要把相应的xml布局文件放置在res/layout路径下。此处注意xml文件中的自定义控件也要更改路径为com/ss/android/article/base/feature/mine/

如果认为放置以后就可以直接打包运行,那你就too young 了。Android R文件生成中介绍了android 中R文件的生成规则,我们需要根据根据规则把xml中的id写入R文件中,具体路径是com/ss/android/article/news/R$id。一定要参照Android R文件生成提到的规则正确写,以下引用自文章:

作者:hi大头鬼hi

链接:https://www.zhihu.com/question/19730414/answer/67288581

资源ID是一个4字节的无符号整数,其中,最高字节表示Package ID,次高字节表示Type ID,最低两字节表示Entry ID。

Package ID相当于是一个命名空间,限定资源的来源。Android系统当前定义了两个资源命令空间,其中一个系统资源命令空间,它的Package ID等于0x01,另外一个是应用程序资源命令空间,它的Package ID等于0x7f。所有位于[0x01, 0x7f]之间的Package ID都是合法的,而在这个范围之外的都是非法的Package ID。前面提到的系统资源包package-export.apk的Package ID就等于0x01,而我们在应用程序中定义的资源的Package ID的值都等于0x7f,这一点可以通过生成的R.java文件来验证。

Type ID是指资源的类型ID。资源的类型有animator、anim、color、drawable、layout、menu、raw、string和xml等等若干种,每一种都会被赋予一个ID。

Entry ID是指每一个资源在其所属的资源类型中所出现的次序。注意,不同类型的资源的Entry ID有可能是相同的,但是由于它们的类型不同,我们仍然可以通过其资源ID来区别开来。

所以在该文件中的id不能随意写,前几位要保持一致,后边的Entry ID要按顺序写,本文中的新加id如下图:


另外layout的xml布局文件也要在com/ss/android/article/news/R$layout;中写:


同样要注意规则。

4.小技巧

一般来说我们是没法截获release版本的apk的log数据的,但是我们自己写的那部分代码是可以在运行时是可以看到log的,可以帮助我们调试程序。

另外一定要把编译签名安装的几个命令写为一个脚本,方便安装调试,不然每次去敲几个命令很麻烦,即使有命令记录当需要多次调试时也很麻烦。

总结

本文中需要重要掌握的是R文件的生成规则smali的基础语法,只用掌握的基本知识才能在碰到问题时快速定位问题,解决问题。