Apk包对于Android系统来说是一个可执行的文件,但其实质上是一个压缩包,我们以一个相对比较完整的apk应用来看下整个过程。先把apk文件转为zip格式,解压,可以看到:


解压APK后文件夹里包含的文件:
1、assets目录,保留工程中asset目录,其它工程下的、jar包中的asset也会合并到该assets目录下
2、lib目录,由于编译的时候jar文件已经合并到主工程中,lib中包含所有的so文件,so目录的路径保留原有路径(CPU类型)
3、META-INF目录,信息描述,签名等用途
4、res目录,工程资源文件,以主工程为主,其它文件合并,values文件将不会出现在此目录下,因为已经将其编译到resouces.arsc文件中,raw文件将保持原有内容不会被编译。
5、AndroidManifest文件,用来做组件查找
6、classes.dex文件,虚拟机执行的文件
7、resources.arsc资源文件索引
安装过程的时候实际上就是将APK文件放到特定的目录下,并且生成与此应用有关的文件,应用级的应用一般放到data/app下,系统级应用放到system/app下。

之前有过的一篇讲解Resources和AssetManager,这时候资源的路径就指向了这个apk文件,就可以取得到需要的资源了。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,在2.3系统之前,虚拟机的内存只分配了5M,所以去掉一些无用的jar包,将一些属性设置为public,从而可以去掉get/set方法来压缩方法数量。

更多相关文章

  1. android 文件读取(assets)
  2. JAVA环境下创建JSP文件报错: The superclass "javax.servlet.http
  3. 【JavaWeb-6】HttpServletResponse的字符字节输出流、编码、文件
  4. Java 简单解决springmvc获取properties文件里面中文内容出现论码
  5. 解决Eclipse建立Maven项目后无法建立src/main/java资源文件夹的
  6. java读写中文文件
  7. java文件上传输入输出流的问题
  8. Android MediaCodec硬解码AAC音频文件(实时AAC音频帧)并播放
  9. 获取所有音乐文件的专辑封面

随机推荐

  1. Android(安卓)ZXing源码简化
  2. Android中资源的引用
  3. Android(安卓)使用Rtmp音视频推流
  4. Android之浅谈Android中的MVP
  5. 浅谈 MVP in Android
  6. 史上最全的Android文章精选合集
  7. Android(安卓)虚拟机常用快捷键
  8. 使用LinearLayout线性布局编写左上右上左
  9. Google 地图 API for Android
  10. 辅助功能 AccessibilityService笔记