zoukankan      html  css  js  c++  java
  • android的apk文件结构

    什么是APK?APK文件都由那些组成?不懂没关系,让小编来为你详细解答。
      一、APK简介与描述
    APK是AndroidPackage的缩写,即Android安装包(apk)。APK是类似Symbian Sis或Sisx的文件格式。通过将APK文件直接
    传到Android模拟器或Android手机中执行即可安装。apk文件和sis一样,把 android sdk编译的工程打包成一个安装程序文件,
    格式为apk。APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik VM executes
    的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。在Android平台中dalvik vm的执行文件被打包
    为apk格式,最终运行时加载器会解压然后获取编译后的androidmanifest.xml文件中的permission分支相关的安全访问,但仍然
    存在很多安全限制,如果你将apk文件传到/system/app文件夹下会发现执行是不受限制的。安装的文件可能不是这个文件夹,而
    在android rom中系统的apk文件默认会放入这个文件夹,它们拥有着root权限。

      二、APK的文件结构
      1. META-INF (注:Jar文件中常可以看到);
      2. res (注:存放资源文件的目录) ;
      3. AndroidManifest xml (注:程序全局配置文件) ;
      4. classes dex (注:Dalvik字节码);
      5. resources arsc (注:编译后的二进制资源文件)。


    接下来挨个介绍下apk中个文件及目录的内容和作用吧,一下资料来源于网络和官方文档当然还有个人理解。

    AndroidManifest.xml
    该文件是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息[ , ],如要把apk上
    传到Google Market上,也要对这个xml做一些配置。在apk中的AndroidManifest.xml是经过压缩的,可以通过AXMLPrinter2工
    具 [ , ]解开,具体命令为:java -jar AXMLPrinter2.jar AndroidManifest.xml

    META-INF目录
    META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk包时,会对所有
    要打包的文件做一个 校验计算,并把计算结果放在META-INF目录下。这就保证了apk包里的文件不能被随意替换。比如拿到一
    个apk包后,如果想要替换里面的一幅图片, 一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能
    的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。

    res目录
    res目录存放资源文件。包括图片,字符串等等。

    lib目录
    lib目录下的子目录armeabi存放的是一些so文件。这个地方多讲几句,都是在开发过程中摸索出来的。eclipse在打包的
    时候会根据文件名的命 名规则(lib****.so)去打包so文件,开头和结尾必须分别为“lib”和“.so”,否则是不会打包到apk文
    件中的。其他非eclipse开 发环境没有测试过。如果你是用SDK和NDK开发的话,这部分很重要,甚至可以通过把一些不是so文
    件的文件通过改名打包到apk中,具体能干些什么那就 看你想干什么了,呵呵呵!

    assets目录
    assets目录可以存放一些配置文件,这些文件的内容在程序运行过程中可以通过相关的API获得。具体的方法可以参考一个
    在SDK中的例子:在sdk的 SDK1.6android-sdk-windows-1.6_r1platformsandroid-1.6samplesApiDemos 例子中,有个
    com.example..android.apis.content 的例子,在这个例子中他把一个text文件放到工程的asset目录下,然后把这个txt当作
    普通文件处理。处理的过程在ReadAsset.java 中。同理,asset也可以放置其他文件。

    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。另,有人介绍到Dedexer是目前在网上能找到的唯一一个反编译dex文件的开源
    工具,需要自己编译源代码。

    resources.arsc
    编译后的二进制资源文件的索引(apk文件的资源表(索引))

    上面这些资源最后通过aapt这个工具打包成apk,其实当生成apk的时候就会调用这个命令

  • 相关阅读:
    LeetCode
    算法
    GitHub
    GitHub
    git
    将博客搬家至CSDN
    base64与图片互转
    windows下mongodb数据库搭建过程遇到问题
    mongodb数据插入语句与navicat导入mongodb的json结构
    Visual C++安装失败解决:Error 0x80240017: Failed to execute MSU package.
  • 原文地址:https://www.cnblogs.com/sun-frederick/p/4763619.html
Copyright © 2011-2022 走看看