持续更新

首先,把需要反编译的apk文件放到apktool目录,调出cmd命令apktool.bat d xxx.apk解包。正常情况下解包之后的xxx目录如图所示:

android 修改apk versioncode apk改之理修改教程_java


当然了,大一些的项目还会有assets等文件夹。


到这一步,资源文件和manifest配置文件就已经得到了,这一步基本很少有人可以加固防止。从这一步我们可以得到应用的图片、布局等资源,也可以通过配置文件得知应用需要获取的权限以及首次打开的哪个activity的名字,如图代码代表最先出现的activity。

<intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

apktool.yml是可以用EditPlus修改的,回编译时改文件名版本等可以用到。

smali则是我们反编译的核心,smali语法比较晦涩,不深学很难看懂,如果要增加方法和类,尽量少的加入逻辑到原文件,避免出错。

首先,我们写一个test工程,把需要加的逻辑代码资源文件等等都放进去然后生成apk,将apk用以上方法apktool反编译,可以得到转变出的smali文件。

增添新的逻辑时,如果用到了第三方jar和新的类、图片、布局文件、raw资源,需添加进原应用目录,资源文件必须在values中的xml文件(比如public.xml等带有资源ID的文件)以及R文件相关配置。注意:有新资源文件加入时,资源ID可以随意自增,但不能有重复。R文件一般会在主包目录:

android 修改apk versioncode apk改之理修改教程_apk_02

,但部分项目不会。


        今天遇到一个很重要的问题,在反编译一些大型项目时,会遇到dex分包的情况,目录中会出现多个smali目录

android 修改apk versioncode apk改之理修改教程_安卓_03

,而main活动一般会在第一个smali,这时候如果向main里注入逻辑或添加jar包,那么回编译时必定会报方法超过65535的错误,解决办法如下:


按照图片上的例子,我们在根目录新建一个文件夹,命名为smali_classes4(注意,这里包的路径还是必须正确),将jar包和方法放进去,在main里invoke引用一下,回编译就没问题啦!进去到build里也可以看到dex文件多了一个,这种方法相当于再多分了一次包,就不会出现方法超过的错误,success~


2017.5.22

今天回编译时又遇到一些问题,百度google都没有得到什么有用的信息让我很烦躁。好在机智如我。

没有图,错误代码就手写出来吧。

answer:某app无raw文件夹,我手动创建之后在public.xml加了随便一个不与内容重复的id,信心满满回编译,结果报错。

提示:Multiple type names declared for public type identifier 0x8(raw vs integer). 

/home/apktool/***/public.xml:356:originally defined here.

我加的id是0x7f090006,看到上面有个0x8我还傻傻的以为id要改成是0x7f0800006,被自己蠢哭~ 试了两次之后终于得到结论:不同type的16进制ID不能随便写,第四位数不能相同。

但是0x9都用过了,怎么办呢?没关系,字母也是可以的,我写的0x7f0e0000。不过字母好像只能a-f。

今天到此为止。


2017.5.23

    反编译完之后我想全局修改一下包名,然后用UE编辑器直接目录内全局替换包名,回编译,签名很顺利,但是在安装最后魅族手机提示安装空间不足? (只有魅族这么恶心) 其实并不是空间不足,我试了下三星,会提示应用未安装。我反复删删改改之后发现,是

因为全局替换的时候动到了之前打包生成的build文件里的东西,生成的

build

dist两个文件夹是可以直接删除的,我删了之后再全局替换,再回编译,安装成功~