• apk的结构和安装过程


    mark一下一个apk的目录结构和安装过程:

    文件结构:

    asserts:

    用于存放需要打包到APK中的静态文件,和res的不同点在于,assets目录支持任意深度的子目录,用户可以根据自己的需求任意部署文件夹架构,而且res目录下的文件会在.R文件中生成对应的资源ID,assets不会自动生成对应的ID,访问的时候需要AssetManager类。

    lib:

    存放应用程序依赖的native库文件,一般是用C/C++编写,这里的lib库可能包含4中不同类型,根据CPU型号的不同,大体可以分为ARM,ARM-v7a,MIPS,X86,分别对应着ARM架构,ARM-V7架构,MIPS架构和X86架构。

    res:

    存放资源文件,存在这个文件夹下的所有文件都会映射到Android工程的.R文件中,生成对应的ID。

    res又分以下几个部分,每个对应单独的文件夹:

    • anim存放动画文件;
    • drawable目录存放图像资源;
    • layout目录存放布局文件;
    • values目录存放一些特征值;
    • colors.xml存放color颜色值;
    • dimens.xml定义尺寸值;
    • string.xml定义字符串的值;
    • styles.xml定义样式对象;
    • xml文件夹存放任意xml文件

    META-INF:签名信息,用于验证APK文件的完整性,确保apk没有被恶意修改或者病毒感染。META-INF目录下包含的文件有CERT.RSA/CERT.DSA,CERT.SF和MANIFEST.MF,其中CERT.RSA是开发者利用私钥对APK进行签名的签名文件,RSA和DSA表示使用的加密算法,CERT.SF,MANIFEST.MF记录了文件中文件的SHA-1哈希值。

    RSA 与 DSA 都是非对称加密算法。其中RSA的安全性是基于极其困难的大整数的分解(两个素数的乘积);DSA 的安全性是基于整数有限域离散对数难题。虽然理论上可以生成更长长度的 DSA 密钥 (NIST FIPS 186-3),但ssh-keygen在生成 DSA 密钥时,其长度只能为1024位(基于NIST FIPS 186-2);而 ssh-keygen 在 RSA 的密钥长度上没有限制。由于小于1024位密钥长度的 RSA 已经有被攻破的记录,所以说现在:RSA 2048 位密钥是更好的选择。当然相比RSA和DSA,还有更好的算法:ECC(Elliptic Curves Cryptography)椭圆曲线算法。在 ssh-keygen 中,ECC 算法的相应参数是 “-t ecdsa”。可惜的是由于椭圆曲线算法只有在较新版本的 openssl 与 ssh-keygen 中才被支持,而无法得到普遍使用而去完全替代 RSA/DSA。(以上内容从这抄的:https://blog.csdn.net/qq_35180983/article/details/82665269)

    AndroidManifest.xml:

    Android应用程序的配置文件。在开发Android应用程序的时候,通常需要在AndroidManifest.xml中注册每一个Activity,Service,Provider和Receiver,另外这个文件还包含一些权限声明以及使用的SDK版本信息等等。打包时,会把AndroidManifest.xml进行简单的编译,便于Android系统识别,编译之后的格式是axml。

     盗个图

    axml头:文件标志,固定是 0x00080003
    axml文件长度:标识 axml 文件的大小
    StringDataSegment:保存xml文件中所有字符串类型。
    ResourceIdSegment:保存xml文件中声明的资源文件ID。
    XmlContentSegment:保存xml的数据内容。

    classes.dex:

    Android应用在打包时通过AndroidSDK中的dx工具将Java字节码转换为Dalvik字节码。dx工具可以对多个class文件进行合并,重组,优化,可以达到减小体积,缩短运行时间的目的。

    resources.arsc:

    记录资源文件和资源ID之间的映射关系,根据资源ID寻找资源。

    apk的安装过程:

    1.将apk拷贝到/data/app下(系统应用会放在/system分区下);

    2.校验APK的签名,解压并且校验APK中的dex文件,再把dex优化成odex,使得应用程序启动时间加快,同时在/data/data目录下应用包名同名文件夹,存放相关数据:数据库,xml文件,二进制的so动态库。

    3.解析AndroidMainfinest.xml文件。Android有个类似注册表的文件会记录所有安装的应用信息,它是:data/system/packages.xml。安装应用时,会解析AndroidMainfinest.xml,写入到packages.xml中。并将解析出的组件、权限注册到PackageManagerService,完成后广播。

    参考文档:

    https://blog.csdn.net/bupt073114/article/details/42298337

  • 相关阅读:
    javaScript表单焦点自动切换
    JavaScript禁止用户多次提交方法
    javaScript事件机制兼容【整理】
    DOM元素尺寸和位置(clientwidth ,scrollwidth , offsetwidth.......)
    javaScript给元素添加多个class
    javaScript增加样式规则(新增样式)
    javaScript动态添加样式
    工作中遇到的各种jar包说明
    springboot—Jpa原生sql使用
    Des3EncryptionUtil加密与解密
  • 原文地址:https://www.cnblogs.com/yeqluofwupheng/p/14198526.html
Copyright © 2020-2023  润新知