关于apk程序的双开
今天查邮件看到有人发邮件问我android下的阿里旺旺怎么双开。经过我的中外查证,貌视同个apk程序没有办法运行多个实例,也就是同一个程序不能实现双开;同时同个程序也不能被安装二次,更进一步扼杀了双开的可能。于是那我唯一能想到的是:改apk,让android系统认不出原版和改版是同一个程序。那么关键在哪里?android又是凭什么说这二个程序是相同的或不同的呢?网上一找无果。不过,以前捣鼓的时候有注意一个问题,在/data/data文件夹下,这个地方会存在安装的程序数据,每个文件夹是这个程序的包名,换句话说,android之所以能区分二个程序是不是相同或不同就是看它们的包名(PS:包是java中的一个编程概念)。
按照这种思路,要实现同一个apk程序的“双开”,我们可以把原程序的“包”给它改一下。比如,原包是com.z4mod.z4root是z4root程序的包名,那我们就把它改成net.z4mod.z4root这样原版和改版就不在同一个包下了,android就会认为它俩可没关系,是二个程序,这样就能同时安装这二个程序,就能同时运行,就能实现“双开”(这种当然只能算是伪双开)。
好吧,下面我就用我刚发布的SD2Flash.apk来演示这个“双开”功能(至于你想挂多个QQ、旺旺,我表示我不会再去深入研究“双开”的问题,参考我这篇文章或许会有点启发)。先帖个图吧。
有人说了,你这二个SD2Flash名字都不一样,不会是写了二个程序来晃点人吧?这个我表示绝对不是,这个任务名称也可以直接改,不过单改这种名称是实现不了“双开”的。详细修改教程参考下文。
二、修改过程(仅供参考)
这里用我的SD2Flash作为修改源,这个程序比较简单,不过万丈高楼平地起,我这个人又懒,我就在这里只打个地基了,其它程序可能会复杂点,比如包含多个包,那改起来有够麻烦的:
(同样的不厚道,同样的只请技术玩家观看)
1、用Apktool反编译SD2Flash.apk,假设得到反编译目录SD2Flash
2、编辑SD2Flash\AndroidManifest.xml,将:
package="mandarava.android"
复制代码
改成:
package="mandaravb.android"
复制代码
这样一改主要是为了让改版程序的包名与原版程序的包名不一致,android系统就会认为是二个程序,这样就可以同时安装原版和改版,实现“双开”。(改的时候注意只稍微改个字母就行了,不要用添加或删除字母的方式,这样特别是针对.so的二进制修改有好处)
3、编辑SD2Flash\res\values\strings.xml,将:
<stringname="app_name">SD2Flash</string>
复制代码
改成:
<stringname="app_name">SD2Flash2</string>
复制代码
这个是改程序名称。这样一改主要是为了让改版创建的桌面图标不会覆盖原版,因为如果快捷图标的名称相同后装的会覆盖先装的。
4、接下来要将smali中所有包含有“mandarava/android/”的路径全部改成“mandaravb/android/”,这样与前面的改后的包名“mandaravb.android”相对应。这个用查找替换的方式,可以使用apk改之理快速替换。
另外,有些时候源代码文件中还会出现类似mandarava.android的包名情况,这些也要注意修改得与mandaravb.android一致。不过,SD2Flash没这么复杂,没有这种情况;还有是有些程序带有.so文件的,如果也出现包关联的话,也要注意修改。
5、最后将SD2Flash\mandarava文件夹改名为:mandaravb,这样与包名“mandaravb.android”也是保持一致。
改完成之后编译签名安装,会在桌面生成SD2Flash、SD2Flash2二个快捷图标,分别运行它们就可以实现伪“双开”。
我用的这个示例apk程序是很简单的,所以改起来没什么麻烦,不过如果其它的程序可能会遇到其它更多情况,比如可能包含.so文件,再比如程序有多个包名的情况等等,我比较懒,我只抛砖引玉;我也不知道哪位想改阿里旺旺,我不去试了,如果你想改可以参考我这边的方法自己研究一下。不过我表示,这会挺麻烦,改的时候要细心!
今天查邮件看到有人发邮件问我android下的阿里旺旺怎么双开。经过我的中外查证,貌视同个apk程序没有办法运行多个实例,也就是同一个程序不能实现双开;同时同个程序也不能被安装二次,更进一步扼杀了双开的可能。于是那我唯一能想到的是:改apk,让android系统认不出原版和改版是同一个程序。那么关键在哪里?android又是凭什么说这二个程序是相同的或不同的呢?网上一找无果。不过,以前捣鼓的时候有注意一个问题,在/data/data文件夹下,这个地方会存在安装的程序数据,每个文件夹是这个程序的包名,换句话说,android之所以能区分二个程序是不是相同或不同就是看它们的包名(PS:包是java中的一个编程概念)。
按照这种思路,要实现同一个apk程序的“双开”,我们可以把原程序的“包”给它改一下。比如,原包是com.z4mod.z4root是z4root程序的包名,那我们就把它改成net.z4mod.z4root这样原版和改版就不在同一个包下了,android就会认为它俩可没关系,是二个程序,这样就能同时安装这二个程序,就能同时运行,就能实现“双开”(这种当然只能算是伪双开)。
好吧,下面我就用我刚发布的SD2Flash.apk来演示这个“双开”功能(至于你想挂多个QQ、旺旺,我表示我不会再去深入研究“双开”的问题,参考我这篇文章或许会有点启发)。先帖个图吧。
有人说了,你这二个SD2Flash名字都不一样,不会是写了二个程序来晃点人吧?这个我表示绝对不是,这个任务名称也可以直接改,不过单改这种名称是实现不了“双开”的。详细修改教程参考下文。
二、修改过程(仅供参考)
这里用我的SD2Flash作为修改源,这个程序比较简单,不过万丈高楼平地起,我这个人又懒,我就在这里只打个地基了,其它程序可能会复杂点,比如包含多个包,那改起来有够麻烦的:
(同样的不厚道,同样的只请技术玩家观看)
1、用Apktool反编译SD2Flash.apk,假设得到反编译目录SD2Flash
2、编辑SD2Flash\AndroidManifest.xml,将:
package="mandarava.android"
复制代码
改成:
package="mandaravb.android"
复制代码
这样一改主要是为了让改版程序的包名与原版程序的包名不一致,android系统就会认为是二个程序,这样就可以同时安装原版和改版,实现“双开”。(改的时候注意只稍微改个字母就行了,不要用添加或删除字母的方式,这样特别是针对.so的二进制修改有好处)
3、编辑SD2Flash\res\values\strings.xml,将:
<stringname="app_name">SD2Flash</string>
复制代码
改成:
<stringname="app_name">SD2Flash2</string>
复制代码
这个是改程序名称。这样一改主要是为了让改版创建的桌面图标不会覆盖原版,因为如果快捷图标的名称相同后装的会覆盖先装的。
4、接下来要将smali中所有包含有“mandarava/android/”的路径全部改成“mandaravb/android/”,这样与前面的改后的包名“mandaravb.android”相对应。这个用查找替换的方式,可以使用apk改之理快速替换。
另外,有些时候源代码文件中还会出现类似mandarava.android的包名情况,这些也要注意修改得与mandaravb.android一致。不过,SD2Flash没这么复杂,没有这种情况;还有是有些程序带有.so文件的,如果也出现包关联的话,也要注意修改。
5、最后将SD2Flash\mandarava文件夹改名为:mandaravb,这样与包名“mandaravb.android”也是保持一致。
改完成之后编译签名安装,会在桌面生成SD2Flash、SD2Flash2二个快捷图标,分别运行它们就可以实现伪“双开”。
我用的这个示例apk程序是很简单的,所以改起来没什么麻烦,不过如果其它的程序可能会遇到其它更多情况,比如可能包含.so文件,再比如程序有多个包名的情况等等,我比较懒,我只抛砖引玉;我也不知道哪位想改阿里旺旺,我不去试了,如果你想改可以参考我这边的方法自己研究一下。不过我表示,这会挺麻烦,改的时候要细心!