android应用分析之apk文件结构

实际上,一个APK文件就是一个.zip格式的压缩包,我们可以用解压缩工具打开任何一个APK文件,由于代码混淆和加密,通过普通解压缩工具打开里面的文件或目录会看到各种乱码。一个典型的apk文件包含以下内容:



?AndroidManifest.xml 
Android应用的配置清单文件,它向Android系统介绍了这个应用的很多配置信息,系统可以根据这个文件在相当程度上了解这个应用的一些信息。该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息,如要把apk上传到Google Market上,也要对这个xml做一些配置。在apk中的AndroidManifest.xml是经过压缩的,可以通过AXMLPrinter2工具(针对该文件)或apktool工具进行反编译(反编译整个apk)。

?META-INF目录 
META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。没有签名的应用是不被系统认可的,也无法安装到手机中。Android SDK在对APK进行打包的时候,会把APK中全部文件的完整信息保存到这里,这样应用在安装的时候会进行完整性校验,确保APK的文件不会被篡改,大大提升了应用和系统的安全性与完整性。META-INF目录下有CERT.RSA、CERT.SF和MANIFEST.MF这几个文件,其中的CERT.RSA文件记录了开发者的私钥对APK签名后的信息,MANIFEST.MF文件则保存了整个APK中所有文件的SHA-1进行base64编码后的值,CERT.SF则与MANIFEST.MF差不多,包括了后者所有的信息,然后又加入了MANIFEST.MF文件的SHA-1并base64编码的值。

?res目录 
存放各种资源文件的目录。这个目录中的所有文件,最终会被映射到Android工程中的R文件中,生成对应的int型的ID,在程序中访问这些资源文件的时候,直接使用资源的ID就能进行调用了。

res目录下还包含着多个子文件夹:anmi中存放着动画文件;drawable则存放着一些图片资源;layout中存放的是布局文件;menu则是自定义菜单的项;raw目录中的文件则是可以直接复制到设备中的文件,不会被编译;values中存放着一些特殊的值——colors.xml记录的是你自定义的颜色,dimens.xml记录着你自定义的尺寸,strings.xml则是你自定义的字符串常量值,styles.xml定义了一些样式。

?lib目录

这个目录中存放着应用依赖的native库文件,这些以.so结尾的文件是用C或者C++语言编写的,一个简单的Android应用可能并不需要这些库,但一个功能全面而又追求性能的应用是不可能无视这个目录的,譬如图片处理、网络处理、音视频处理等一些对性能要求很高的功能,单纯依靠Java会十分吃力,性能更加强大而且更加接近底层的C/C++就是更合适的选择了。

根据手机CPU的架构,lib库大体上可以分为4种:ARM、ARM-V7、MIPS和X86,分别对应着4种CPU架构,在lib目录里则分别是armeabi、armeabi-v7a、mips和x86一共4个目录。每个目录中的.so库名字都是一样的,实际上功能也是相同的,它们只是为了适配不同架构的CPU而存在。实际上,市面上的手机几乎全都是ARM架构的,所以大多数情况下我们只需要有armeabi和armeabi-v7a两种类型的库就足够了。

?assets目录 
跟res目录有点相似,但实际上二者还是有区别的。res目录中的文件会映射到R文件中,每个资源文件都有自己的ID,而assets中的文件则直接通过访问文件的地址来使用AssetManager类进行访问,而且assets目录你可以添加任意深度的子目录,这一点会比较方便管理和归类文件。相比较之下,res目录目前不能支持更深级的子目录。

?classes.dex文件 
      classes.dex是java源码编译后生成的java字节码文件(首先是java文件通过jdk编译成字节码文件然后经过dex编译成classes.dex)。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容 的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。Android模拟 器中提供了一个dex文件的反编译工具,dexdump。用法为首先启动Android模拟器,把要查看的dex文件用adb push上传的模拟器中,然后通过adb shell登录,找到要查看的dex文件,执行dexdump xxx.dex。

对比普通java程序和安卓程序差异:
普通java程序        java虚拟机        java字节码(class)        基于栈
安卓程序        Davlik虚拟机        Dalvik字节码(dex)        基于寄存器

?resources.arsc 
      编译后的二进制资源文件的索引,记录了资源文件(即res目录中的文件)和资源文件ID的映射关系,这样程序运行的时候就可以根据资源的ID获取到相应的资源了。

来自为知笔记(Wiz)

时间: 2024-08-04 18:33:53

android应用分析之apk文件结构的相关文章

Android逆向分析(2) APK的打包与安装

http://blog.zhaiyifan.cn/2016/02/13/android-reverse-2/ 2/18日增加对aidl和java编译的描述. 前言 上一次我们反编译了手Q,并遇到了Apktool反编译直接crash的问题,虽然笔者很想在这次解决这个问题,但在解决途中,发现该保护依赖于很多知识,所以本次先插入一下,正所谓知其然知其所以然,授之鱼不如授之以渔,只有知道一些基本原理,才能让我们以后能自行解决更多问题. 那么,你知道么?从我们在Android Studio中,点击run,

Android逆向基础----APK文件结构

参考这个博客 http://www.cnblogs.com/wangtianxj/archive/2010/06/13/1757639.html APK文件结构: AndroidManifest.xml                 配置清单 META-INF                                  签名 assets                                        资源 classes.dex                      

Android中的软件安全和逆向分析[二]—apk反破解技术与安全保护机制

在Android应用开发中,当我们开发完软件之后,我们不希望别人能够反编译破解我们的应用程序,不能修改我们的代码逻辑.实际上,在应用程序的安全机制考虑中,我们希望自己的应用程序安全性高,通过各种加密操作等来增大竞争对手的反编译破解成本.设想,竞争对手开发一个同样的应用程序需要10天,而破解我们的软件程序需要100天,那么势必会打消黑客程序员破解我们应用程序的念头.如何增加对手的破解成本,就需要考验我们应用程序的安全性有多高,加密技术有多强.一个优秀的应用程序,不仅能为用户带来利益,同时也能保护自

怎样给你的Android 安装文件(APK)瘦身

本文源地址:怎样给你的Android 安装文件(APK)瘦身 Android的apk文件越来越大了这已经是一个不争的事实. 在Android 还是最初版本号的时候,一个app的apk文件大小也还仅仅有2 MB左右,到了如今.一个app的apk文件大小已经升级到10MB到20MB这个范围了.apk文件大小的爆炸式增长主要是由于用户对app质量的期待越来越高以及开发人员的开发经验增长,详细体如今下面几个方面: Android设备 dpi 的多样化 ([l|m|tv|h|x|xx|xxx]dpi) A

如何给你的Android 安装文件(APK)瘦身

如何给你的Android 安装文件(APK)瘦身 本文翻译自:Putting Your APKs on Diet           原作者:Cyril Mottier Android的apk文件越来越大了这已经是一个不争的事实.在Android 还是最初版本的时候,一个app的apk文件大小也还只有2 MB左右,到了现在,一个app的apk文件大小已经升级到10MB到20MB这个范围了.apk文件大小的爆炸式增长主要是因为用户对app质量的期待越来越高以及开发者的开发经验增长,具体体现在以下几

Android多线程分析之一:使用Thread异步下载图像

罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 打算整理一下对 Android Framework 中多线程相关知识的理解,主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Message, AysncTask,当然不可避免地要涉及到 native 方法,因此也会分析 dalvik 中和线程以及消息处理相关的代码:如 dalvik 中的 C++ Thread 类以及 Message

Android多线程分析之五:使用AsyncTask异步下载图像

Android多线程分析之五:使用AsyncTask异步下载图像 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在本系列文章的第一篇<Android多线程分析之中的一个:使用Thread异步下载图像>中.曾演示了怎样使用 Thread 来完毕异步任务. Android 为了简化在 UI 线程中完毕异步任务(毕竟 UI 线程是 app 最重要的线程).实现了一个名为 AysncTask 的模板类.使用 AysncTask 能够在异步任务进行的同

Android动态方式破解apk终极篇(加固apk破解方式)

一.前言 今天总算迎来了破解系列的最后一篇文章了,之前的两篇文章分别为: 第一篇:如何使用Eclipse动态调试smali源码 第二篇:如何使用IDA动态调试SO文件 现在要说的就是最后一篇了,如何应对Android中一些加固apk安全防护,在之前的两篇破解文章中,我们可以看到一个是针对于Java层的破解,一个是针对于native层的破解,还没有涉及到apk的加固,那么今天就要来介绍一下如何应对现在市场中一些加固的apk的破解之道,现在市场中加固apk的方式一般就是两种:一种是对源apk整体做一

【Android】Android ListViewAnimations分析

使用:https://github.com/android-cn/android-open-project-demo/tree/master/listview-animations-demo APK例子:https://github.com/android-cn/android-open-project-demo/blob/master/listview-animations-demo/apk/ListviewAnimationDemo-20140706.apk?raw=true 原理:http