APK包名修改 请问如何修改APK包名

今天,想在android手机上安装两个相同的应用,本以为可以安装不同版本的,试了几次,均相互覆盖了,于是,只能设法修改apk所对应的包名(package name)。

目的声明:本文只是为了满足DIY的需要,并不是为了成为打包党,窃取别人的劳动成果,本文所涉及的工具也均为开源的,仅供学习交流之用。

DIY前提:在国内的论坛里,搜索了一下,找到了各种解包,打包的技术内容,以及各种汉化、去广告的帖子,但这个并不是本文的目的。以前见过打包党不仅修改了别人apk的广告用来获利,还将别人apk的包名修改了,所以有人早就实现了,但未能找到相关的技术文章,本文涉及的知识都还是比较浅显的,没有深入的研究底层原因,也参考了网上几个帖子。

PS:在国内论坛上,找一篇原创的帖子很难,基本都是转载的,还不附原文链接,引入了的很多错误,想找到原文都很难,真是很悲剧。国内论坛里,热心人还是少了点,很多问题都死了,无人回答,笔者尝试在CSDN、ITEYE、EOE发过几个帖子,但很少能解决问题,于是只能求助于国外论坛,这也是一个悲剧。

这个问题解决完了,也很简单,至少我这个比较简单,我是想多安装几个QQ浏览器(有IT屌丝安装了10个微信的,这个我表示很汗),基本过程如下:

1、将apk解包成一个文件夹

2、修改AndroidManifest.xml中对应的包名

3、修改smali目录下中的包

4、将文件夹打包成apk

5、将apk重新签名

6、验证apk的签名

7、优化apk

8、安装apk,并测试

基本前提条件

1、java的环境

2、Eclipse及android的开发环境(这个主要是用来进行调试)

3、text文本编辑器,本人用的是UEdit,也可以用类似的,主要是利用其查找及替换功能

这篇文章主要用来反编译apk得到源码,但google进行了反制,只能得到一些可读性不高的源码,这里主要是利用反编译apk生成程序的源代码和图片、XML配置、语言资源等文件.

参考文献里提到的apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip均可以从http//code.google.com/p/android-apktool/上下载,下载好之后,将涉及的命令行目录及exe目录添加到电脑的path路径中,这样就便于操作了,如检测apktool是否可以,可以在命令行中输入apktool,如果可以识别就表示OK了。

参考了国内的技术文章后,有人发帖以上面的思路进行操作,但没有发技术文章,所以笔者只能去国外论坛中逛逛了,在Stack Overflow中,找到了相关的帖子,有老外留言"you can't do this",这个的确有违技术道德,但这里只做学习参考或交流。找到了一片帖子http://stackoverflow.com/questions/9218641/renaming-the-package-name-inside-an-apk,这篇帖子的回答给了比较详细的步骤(如上),他的情况比这个还稍微复杂点,简化后就是我要的结果,我就是按照这个基本步骤来的,回答的英文比较好懂(很有可能是国人)。

下面就按照上面的步骤一步步操作:我是已QQ浏览器4.0版的apk来操作的。

1、我的apktool安装到了E盘下的apktool目录下,所以的操作也在这个目录下进行 E:\apkTool

   将apk复制到E:\apkTool目录下,重命名为qq4.0.apk(这个没有要求,随意就好)

将apk解包  命令行下cd到E:\apkTool这个目录  apktool d qq4.o.apk qq4  将apk解包到qq4(这个也可以随意)这个目录

E:\apkTool\qq4这个目录下内容如下:

2、修改AndroidManifest.xml中的包名

将package后面的包名com.tencent.qbx改为你想要的新包名,我改为了com.tianxiao.tencentweb

将涉及原包名的com.tencent.qbx的相关activity的声明中的包名均改为新包名com.tianxiao.tencentweb

   至于intent-filter里面的action名中包含原包名的,则可以不改,如果改的话,代码中也要相应的改变

另外,如果有provider,provider的authorities也得改,这个在同一手机上必须唯一,否则安装会失败

3、在E:\apkTool\qq4\smali目录下,有很多子目录,子目录下的文件多以smali结尾,这中文件的语法有点类似于汇编语言,具体原理就不深究了。

   将smali目录下的所有文件中的原包名的声明形式com/tencent/qbx改为新包名com/tianxiao/tencentweb

   具体如下,用UEdit在文件中替换即可,将目标目录指向E:\apkTool\qq4\smali,这个将近1000条左右

如果之前改为action里面的包名,也要将字符串形式的包名com.tencent.qbx改为com.tianxiao.tencentweb

如果有provider也要讲原来的authorities值改为在AndroidManifest.xml中新改的authorities值。

4、将E:\apkTool\qq4重新打包为apk

apktool b qq4 newqq.apk

5、将新的newqq.apk 重新签名

签名的方法很多,一主要是手动生成签名,用命令行签名

我采用的现成的,下载了一个Auto-sign的文件夹,进行了签名,这个比较简单,网上帖子很多,就不赘述。

新签名后的apk名为  newqq4signed.apk

6、验证签名 是否正确

jarsigner -verify  -verbose -certs newqq4signed.apk

一般来说,没问题,略过

7、优化apk

zipalign -v 4 newqq4signed.apk latestqq.apk    优化过的apk名为latestqq.apk

8、安装新的apk,验证是否成功

这个最好把Eclipse打开,手机连上,查看logcat的安装信息。

我尝试了3次才成功,主要是忘了 provider的authorities的处理,

出错信息如下: Can't install because provider name qbx_bookmarks (in package com.tianxiao.tencentweb) is already used by com.tencent.qbx

原因很清楚,所以debug还是相当给力的,原来不喜欢debug,看debug过程可以更好的了解执行过程。

在进行了测试后,笔者有多次重复了2-8这几个步骤,共得到了4个新的apk,安装后的结果如下图:

如图,QQ4.0的浏览器,原装的装了一个,重新打包的有4个,预期目标达到了。

本次尝试成功了,花了不少时间查资料,基本原理相当的清楚,本文中笔者尽可能不产生歧义,欢迎各位交流和批评。

(0)

相关推荐

  • APK包名修改 请问如何修改APK包名

    今天,想在android手机上安装两个相同的应用,本以为可以安装不同版本的,试了几次,均相互覆盖了,于是,只能设法修改apk所对应的包名(package name). 目的声明:本文只是为了满足DIY的需要,并不是为了成为打包党,窃取别人的劳动成果,本文所涉及的工具也均为开源的,仅供学习交流之用. DIY前提:在国内的论坛里,搜索了一下,找到了各种解包,打包的技术内容,以及各种汉化.去广告的帖子,但这个并不是本文的目的.以前见过打包党不仅修改了别人apk的广告用来获利,还将别人apk的包名修改了

  • IIS7下设置https主机名绑定灰色无法修改问题解决

    在Win2008服务器设置IIS证书SSL时候发现有这样的问题,具体情况如下图 具体原因不明,解决方法是 通过编辑IIS的配置文件C:\inetpub\temp\appPools 对应的网站域名是网站启动后生成的临时文件,修改这里的配置一点用都没有.下次IIS启动就删除掉了. 真正的配置文件在这里“C:\Windows\System32\inetsrv\config\applicationHost.config”,找到以下段落 <system.applicationHost> 里面的子段落 &

  • docker修改容器的端口、容器名、映射地址以及注意事项

    目录 1.docker修改容器名 2.docker修改修改端口.映射地址… 2.1.先找容器的ID 2.2.停止docker容器 2.3.停止docker 2.4.查找配置文件 2.5.备份原有文件,如果出现问题后可以还原回去 2.6.修改配置文件(hostconfig.json) 2.6.修改配置文件(config.v2.json) 2.7.启动docker服务 2.8.查看端口是否修改 2.9.启动docker容器 注意!!! 补充:如何利用docker给容器改名呢 总结 1.docker修

  • Pandas.DataFrame的行名和列名的修改

    目录 DataFrame.rename() 多个行名和列名的修改 原DataFrame的修改(参数inplace) 使用lambda表达式和函数进行批处理 add_prefix(), add_suffix() index和columns元素的更新 pandas.DataFrame行名(index)和列名(columns)的修改方法如下. rename() 任意的行名(index)和列名(columns)的修改 add_prefix(), add_suffix() 列名的接头词和结尾词的追加 in

  • vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀

    需求说明: 在开发 vue 项目的过程中遇到的需求是要把 api 接口前缀暴露在命令行,通过 npm run build apiUrl 即可修改接口入口,用于从 docker 部署到不同的测试服务器上,其次是路由模式的问题,部署到测试服务器上的需要是 history 模式,但是产品是用 electron + vue 开发的桌面应用,electron 硬性要求 vue-router 的路由模式是 hash 模式,所以命令行需新增一个配置项 mode ,mode 可选值有 history .hash

  • laravel model模型处理之修改查询或修改字段时的类型格式案例

    先了解一下此图,有助于理解 通过上图了解 这将在原有的列上添加一列is_admin,这需要通过属性访问时才会获得,如果我们希望在获得数据的时候被一起返回,则还需要append属性 class User extends Model{ //设置方法名称 protected $appends = ['is_admin','type']; //查询时 修改 字段格式或者值 [自动触发,无需调用] public function getIsAdminAttribute() { return $this->

  • IDEA对使用了第三方依赖jar包的非Maven项目打jar包的问题(图文详解)

    前言: 最近,遇到了一个问题,都快把我整疯了:这个问题开始是由 使用IDEA 对 非Maven项目进行打 Jar 包 引起的:本来就是想简简单单的打个 jar 包,并将使用的第三方依赖 jar 包打进去,但是问题就出现在了项目中依赖的第三方 jar 包( bcprov-jdk15on-1.54.jar )存在签名,那在打包过程中会把 签名 破坏掉,导致在使用打好的jar包时报错: JCE cannot authenticate the provider BC . 注意:如果依赖的第三方jar包不

  • android studio生成aar包并在其他工程引用aar包的方法

    1.aar包是android studio下打包android工程中src.res.lib后生成的aar文件,aar包导入其他android studio 工程后,其他工程可以方便引用源码和资源文件 2.生成aar包步骤: ①.用android studio打开一个工程,然后新建一个Module,新建Module时候选择Android Library,后面按新建普通工程操作 ②.新建Module 类型为android Library 后如下图所示 ③.在新建的Module中编写完代码后,接下来编

  • python 动态生成变量名以及动态获取变量的变量名方法

    前言 需求: 必须现在需要动态创建16个list,每个list的名字不一样,但是是有规律可循,比如第一个list的名字叫: arriage_list_0=[],第二个叫arriage_list_1=[]--..依次类推,但是我又不想手动的去写16个这样的名字,太累了,而且增加了代码的冗余性,灵活性也不强,所以有没有一种方法是能动态创建list名称的呢?答案是有的!而与之对应,既然要对上面的列表动态操作,肯定是少不了动态去解析list名称.所以下面开始介绍方法. python 动态生成变量名 lo

  • Android在高jar包版本的工程中修改方法

    android的应用程序安装包APK如果是在高版本的android jar上开发的是无法在低版本的android SDK上跑的,所以我们需要将我们已经开发好的应用程序换上低版本的android jar包重新编译一个APK,那么如何简单的在高版本的工程中直接修改呢: 1. eclipse中点击工程->Properties-> Android 在右侧的界面中选中Android 2.2即可(前提是你的android sdk中同时包含这两个版本的android jar包) 或者 打开default.p

随机推荐