背景介绍:

最近在做Robotium自动化测试,使用到solo.takeScreenshot()函数以在测试过程中截图,但此函数需要被测试APP具有<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />权限。在只有被测试APP的apk文件的情况下,修改apk文件后缀名为zip,解压缩后,修改AndroidManifest.xml文件,删除META-INF文件夹,重压缩为apk文件后,再签名就可以了。
但是!本文舍近求远,借机对apk文件进行反编译与重编译、重签名,来修改源代码中的AndroidManifest.xml文件。本文这么做的目的,就是想熟悉一下反编译、重编译和重签名的过程
 
1.请下载反编译、重编译工具Apktool
https://code.google.com/p/android-apktool/downloads/list下载apktool需要依赖的jar和apktool脚本文件。以windows用户为例,下载前两个文件:
 

2.将下载的两个压缩包解压后,得到三个文件,放入某文件夹。例如:

3.将cmd定位至apktool.bat所在文件夹中,输入apktool.bat将出现所有的参数解释。
 
4.我们先来进行反编译apk的过程:
在命令行中输入apktool.bat d -f <apk文件路径/apk文件> <目标文件夹>
参数解释 d:decompile,进行反编译
-f:强制清空目标文件夹内已存在的内容
例如:
 
5.进入生成的文件夹,assets和res文件夹中都已经生成了app用到的xml和素材
lib文件夹里包含了交叉编译库
smali文件夹里包含了反编译出的smali文件
而AndroidManifest.xml正是我们需要修改的东西(为什么要修改它?见背景介绍)
 
这里顺便解释一下odex文件和dex文件。
dex文件:Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java的字节码而是Dalvik字节码,16进制机器指令。
odex文件:将dex文件依据具体机型而优化,形成的optimized dex文件,提高软件运行速度,减少软件运行时对RAM的占用。
smali文件:将dex文件变为可读易懂的代码形式,反编译出文件的一般格式。
 
6.往AndroidManifest.xml里面加入<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 
7.开始重编译吧。在命令行中输入apktool.bat b <反编译出的文件夹>
参数解释:b:build,重编译
例如:
 
8.进入目标文件夹,新生成了build文件夹和dist文件夹
build文件夹里包含了重编译生成apk文件所产生的过渡文件,包括dex文件,资源文件等
dist文件夹则包含了重编译生成的apk文件
 
9.这时候生成的apk文件还无法直接安装到手机上。否则,会出现INSTALL_PARSE_FAILED_NO_CERTIFICATES错误:
出现这个错误的原因是:
每个安装的apk必须包含签名。签名的其中一个作用就是验证该apk安装包是否是个合法的安装包。我们在经过反编译-修改-重编译的过程后,生成的apk是不包含签名的。在安装apk的过程中,手机未检测到apk中的签名,所以提示INSTALL_PARSE_FAILED_NO_CERTIFICATES错误。
 
In a word, Android签名机制不能阻止APK包被修改,但修改后的再签名无法与原先的签名保持一致。(拥有私钥的情况除外)。
 
10.接下来,我们就要重编译的apk文件进行签名
可以使用re-sign.jar。re-sign-jar下载地址:https://dl.dropboxusercontent.com/u/5055823/re-sign.jar
 
双击,将未签名的apk拖进UI界面,过一会儿就会提示你保存签名过的apk了。(第一次使用需要设置ANDROID_HOME和JAVA_HOME环境变量)

[转]Android应用安装包apk文件的反编译与重编译、重签名的更多相关文章

  1. Android安装包apk文件在某些版本操作系统上安装解析包出错问题的解决办法

    当我们将Android升级功能的中的下载新版本apk文件存放在data/data/xxx.apk位置时,在有的些版本的手机中安装可能会出现安装包解析出错的问题,对于该问题的解决方案是提升该文件的权限. ...

  2. Android App安装包瘦身计划

    Android App安装包瘦身计划 Android App安装包体积优化: 理由, 指标和可以采用的方法. 本文内容归纳如下图: 为什么要安装包瘦身 安装包需要瘦身吗? 不需要吗? 安装包要瘦身的主 ...

  3. 关于iOS和Android的安装包更新笔记

    关于iOS和Android的安装包更新问题 1. Android更新apk 1)使用DownloadManager下载 2)使用HttpClient下载 apk的下载不能使用ssl,即不能使用http ...

  4. eclipse下Android无法自动生成apk文件怎么办?

    eclipse下Android无法自动生成apk文件怎么办? 现象:创建android工程后,通过手动build/clean或自动build均无法在bin文件夹下生成.apk文件 解决方法:进入win ...

  5. 下载谷歌浏览器(Chrome)扩展离线安装包crx文件最简单的方法

    转:http://alyzq.com/?p=627 如果不会使用,请看下面的操作步骤 引言(可以不看): 下面介绍一下,下载谷歌浏览器(Google Chrome)扩展的离线安装包crx文件最简单的方 ...

  6. Android系统加载Apk文件的时机和流程分析(1)--Android 4.4.4 r1的源码

    本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/80982869 Android系统在启动时安装应用程序的过程,这些应用程序安装好之 ...

  7. Android 开发笔记“程序安装包APK的制作”

    资源来源:http://blog.csdn.net/qualcent/article/details/6959547 完成Android项目后,需要将程序打包成APK文件(Android Packag ...

  8. 【转】Android系统中的.apk文件和dex文件

    1. *.apk文件 APK是Android Package的缩写,即Android安装包.通过将APK文件直接传到Android模拟器或Android手机中执行即可安装. 使用Android打包工具 ...

  9. 在Visual Studio 2013/2015上使用C#开发Android/IOS安装包和操作步骤

    Xamarin 配置手册和离线包下载 http://pan.baidu.com/s/1eQ3qw8a 具体操作: 安装前提条件 1. 安装Visual Studio 2013,安装过程省略,我这里安装 ...

随机推荐

  1. 压缩SQLServer数据库日志的一个存储过程

    use master --注意,此存储过程要建在master数据库中 go if exists (select * from dbo.sysobjects where id = object_id(N ...

  2. WPF Popup全屏 弹出方法。解决只显示75%的问题。

    WPF Popup全屏 弹出方法.解决只显示75%的问题.   WPF 中 Popup 有一个特点.当Popup的高度超过屏幕的75%的时候,只显示75%的高度. 如下代码: <Window x ...

  3. vb6.0快速操作注册表函数大全(仅字符串KEY值部分)

    Option Explicit '声明要加载的函数 Private Declare Function RegCreateKey Lib "advapi32.dll" Alias & ...

  4. scanf和gets的差别

    scanf("%s", str1); scanf() 读取到空格时就认为字符串输入结束了,不会继续读取了. 第一个 scanf() 读取到 "Java" 后遇到 ...

  5. spring容器启动扩展

    我们可以在spring容器启动时添加自己的定制化初始化工作. 1)具体方法为:在web.xml中配置初始化属性contextInitializerClasses的值例如: <context-pa ...

  6. OpenWRT 添加应用程序开机启动方法

    方法一:在/etc/inid.d/目录下新建启动脚本. 方法二:直接在/etc/rc.local 中添加启动命令,如:./usr/bin/relay &

  7. mysql的读写分离

    1.laravel实现数据库读写分离配置或者多读写分离配置 config\database.php里配置 'connections' => array(      //默认mysql配置,访问t ...

  8. keepalived实现nginx高可用

    keepalived是什么 keepalived直译就是保持存活,在网络里面就是保持在线了,也就是所谓的高可用或热备,用来防止单点故障(单点故障是指一旦某一点出现故障就会导致整个系统架构的不可用)的发 ...

  9. svn 提交 working copy is not up-to-date

    svn在提交时报错信息如下: working copy is not up-to-date svn:commit failed(details follow): svn:file "xxxx ...

  10. python函数下篇装饰器和闭包,外加作用域

    装饰器和闭包的基础概念 装饰器是一种设计模式能实现代码重用,经常用于查日志,性能测试,事务处理等,抽离函数大量不必的功能. 装饰器:1.装饰器本身是一个函数,用于装饰其它函数:2.功能:增强被装饰函数 ...