浅析Android的资源打包和安装后Apk文件的下落
2015-11-12 14:53
453 查看
Apk包对于Android系统来说是一个可执行的文件,但其实质上是一个压缩包,我们以一个相对比较完整的apk应用来看下整个过程。先把apk文件转为zip格式,解压,可以看到:
![](http://img.blog.csdn.net/20151121133642861?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
解压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方法来压缩方法数量。
解压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方法来压缩方法数量。
相关文章推荐
- Android中drawableStart和drawableLeft的区别
- Android编程实现监听EditText变化的方法
- Android实现透明式状态栏
- SignalR在Xamarin Android中的使用
- The Perils of Loading Native Libraries on Android
- Android之如何使用javascript调用android代码
- Android使用KSOAP2调用WebService及正确导入jar包的问题(转)
- 如何在Android的ListView中构建CheckBox和RadioButton列表(支持单选和多选的投票项目示例)
- 问题记录:在打包APK的时候遇到的问题
- android 遗忘很久的android 渐变色
- Mac下android_sdk配置环境变量
- android 强制修改adb pull 文件的路径
- Android编程之消息机制实例分析
- Android Studio背景换图片跟一些比较好用插件的介绍
- Android Studio资源
- Android中的硬件加速
- Android 自定义长按事件
- Android 手势基础 GestureDetector和SimpleOnGestureListener的使用教程
- Android强制设置横屏或竖屏
- Android 实时时间显示实现