背景介绍:

最近在做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. TypeScript中的怪语法

    TypeScript中的怪语法 如何处理undefined 和 null undefined的含义是:一个变量没有初始化. null的含义是:一个变量的值是空. undefined 和 null 的最 ...

  2. C# 使用itextsharp 读取pdf中文字坐标

      程序调用: using iTextSharp.text.pdf; using System; using System.Collections.Generic; using System.Linq ...

  3. win10 UWP 剪贴板 Clipboard

    win10 UWP 剪贴板 Clipboard使用Windows.ApplicationModel.DataTransfer.Clipboard 设置文本 DataPackage dataPackag ...

  4. C GOTO使用示例

    GOTO虽然会破坏程序的结构,使用代码可读性变差,但是GOTO依然还是有可用的地方 #include <stdio.h>#include <stdbool.h> int mai ...

  5. C#通过OpenCL调用显卡GPU做高效并行运算

    GPU的并行运算能力远超CPU,有时候我们会需要用到超大数据并行运算,可以考虑用GPU实现,这是一篇C#调用GPU进行运算的入门教程. 1: 下载相关的库: https://sourceforge.n ...

  6. [mysql使用(2)] mysql的一些语法与Oracle的差别

    一.表空间 mysql的表空间有共享表空间和独占表空间,独占表空间,其实就是一张表一个表空间,其实也就是一张表一个数据文件,共享表空间似乎有点类似oracle的表空间,不同的表可以保存在同一个数据文件 ...

  7. 理解JDK1.5的自动装箱拆箱

    JDK1.5的升级引入了装箱和拆箱概念,简单说就是为了简化书写. JDK1.5之前,创建Integer对象是需要这么写的  Integer i = new Integer("3") ...

  8. tamcat的使用

    tomcat的基础知识 一.tomcat的定义 apache的官网是这么说的:使用Apache Tomcat ®软件了Java Servlet,JavaServer页,Java表达式语言和Java的W ...

  9. Invalid environment specified: http://datatables.org/alltables.env

    获取Yahoo股票的API会报错:http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.quotes ...

  10. java语言插入数组中一个数,仍然能够实现排序

    package com.llh.demo; import java.util.Scanner; /** * * @author llh * */ public class Demo16 { /* * ...