Android apk包解析

1、apk包解析后的结构:

Android apk包解析_第1张图片
image.png

2、解压Apk后文件夹里包含的文件:

  1. assets目录,保留工程中assets目录,其他工程下的、jar包中的assets也会合并到该assets目录下。

  2. lib目录,由于编译的时候jar文件已经合并到主工程中,所以lib目录下不会有jar文件,但是lib中包含所有的so文件,so目录的路径保留原有的路径。

  3. META-INF目录,信息描述,签名等用途。
    编译生成一个apk包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。而在Android手机上安装apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个apk。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后,如果想要替换里面的一幅图片,一段代码, 或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系 统的安全。


    Android apk包解析_第2张图片
    image.png
  4. res目录,工程资源文件,以主工程为主,其他文件如jar包会合并到该目录下;但是values文件将不会出现在此目录下,因为已经将其编译到resources.arsc文件中;raw文件将保持原有的内容不会被编译。


    Android apk包解析_第3张图片
    image.png
  5. AndroidManifest文件,用来做组件查找。

  6. classes.dex文件,虚拟机执行的文件。
    dex文件也是通过DexClassLoader来加载的,所以如果我们在程序中使用加载器加载指定的dex文件,就可以实现动态加载了。Facebook分dex包也是基于这种方式来做的。至于为什么要分多个dex文件,原因如下:
    因为一个应用的功能会越来越多,随着工程越来越大,代码量也会越来越多,但是Android方法数量不能超过65K,如果超出之后,将会抛出Conversion to Dalvik format failed:Unable to execute dex:method ID not in[0,0xffff]65536。由于Android系统中,一个Dex文件中存储方法的id用的是short类型数据,所以导致你的dex中方法数不能超过65K。可以通过去掉无用的jar包,或者将一些属性设置为public,从而可以去掉get/set方法来压缩方法数量。

  7. resources.arsc资源文件索引。


    Android apk包解析_第4张图片
    image.png

3、raw与assets的异同之处

1)res/raw和assets的相同点:
  • 两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。
2) res/raw和assets的不同点:
  • res/raw中的文件会被映射到R.java文件中,访问的时候直接使用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,访问的时候需要AssetManager类。
  • res/raw不可以有目录结构,而assets则可以有目录结构,也就是assets目录下可以再建立文件夹

你可能感兴趣的:(Android apk包解析)