探索Android该Parcel机制(上)
一.先从Serialize说起
我们都知道JAVA中的Serialize机制,译成串行化、序列化……,其作用是能将数据对象存入字节流其中,在须要时又一次生成对象。主要应用是利用外部存储设备保存对象状态,以及通过网络传输对象等。
二.Android中的新的序列化机制
在Android系统中,定位为针对内存受限的设备。因此对性能要求更高,另外系统中採用了新的IPC(进程间通信)机制,必定要求使用性能更出色的对象传输方式。
在这种环境下。Parcel被设计出来,其定位就是轻量级的高效的对象序列化和反序列化机制。
三.Parcel类的背后
在Framework中有parcel类,源代码路径是:
Frameworks/base/core/java/android/os/Parcel.java
典型的源代码片断例如以下:
从中我们看到,从这个源程序文件里我们看不到真正的功能是怎样实现的。必须透过JNI往下走了。于是,Frameworks/base/core/jni/android_util_Binder.cpp中找到了线索
从这里我们能够得到的信息是函数的实现依赖于Parcel指针,因此还须要找到Parcel的类定义。注意,这里的类已经是用C++语言实现的了。
找到Frameworks/base/include/binder/parcel.h和Frameworks/base/libs/binder/parcel.cpp。最终找到了最终的实现代码了。
有兴趣的朋友能够自己读一下,不难理解。这里把主要的思路总结一下:
1. 整个读写全是在内存中进行,主要是通过malloc()、realloc()、memcpy()等内存操作进行,所以效率比JAVA序列化中使用外部存储器会高非常多;
2. 读写时是4字节对齐的。能够看到#define PAD_SIZE(s) (((s)+3)&~3)这句宏定义就是在做这件事情。
3. 假设预分配的空间不够时newSize = ((mDataSize+len)*3)/2;会一次多分配50%;
4. 对于普通数据。使用的是mData内存地址,对于IBinder类型的数据以及FileDescriptor使用的是mObjects内存地址。
后者是通过flatten_binder()和unflatten_binder()实现的。目的是反序列化时读出的对象就是原对象而不用又一次new一个新对象。
好了。这就是Parcel背后的动作,全是在一块内存里进行读写操作。就不啰嗦了,把parcel的代码贴在这供没有源代码的朋友參考吧。
接下来我会用一个小DEMO演示一下Parcel类在应用程序中的使用,详见《探索Android中的Parcel机制(下)》。
本文的源代码使用的是Android 2.1版本号。
——欢迎转载,转载请注明出处 http://blog.csdn.net/caowenbin ——
相关文章
- Android Studio第一次启动的Fetching android sdk component information的问题
- Android studio 2.0--android增量更新的那些事
- Android OpenGL ES 开发教程 从入门到精通
- Android - Style问题
- Android-Unable to resolve target 'android-8'
- Android studio的错误:radle sync failed: Cause: failed to find target android-21 :
- 《Android游戏开发详解》一2.20 对象的更多实践——模拟一个色子
- Android深度探索(卷2):系统应用源代码分析与ROM定制》——导读
- 基于Android 移动端的网络视频探索系统【100010403】
- Android JNI 传递对象
- 实现Android Studio JNI开发C/C++使用__android_log_print输出Log
- Android图片压缩(质量压缩和尺寸压缩)
- android 使用Scroller实现缓慢移动
- Android应用加入微信分享
- Android 滑动效果进阶篇(五)—— 3D旋转
- android开发:Android 中自定义View的应用
- android照相及照片上传
- Android图形显示系统——上层显示1:界面绘制大纲---android的GUI系统
- Android 串口通信基于licheedev和android-serialport两种方案实现附Demo
- 谷歌回应欧盟垄断指控:Android促进了市场竞争
- 不要在Android的Application对象中缓存数据!
- Android Jni Android.mk经常使用语句
- 【Android开发经验】android:windowSoftInputMode属性具体解释
- 基于Android的“哲学家就餐问题”防死锁的设计与实现
- 探索Android该Parcel机制(上)
- Android App修改字体大小,且不随系统字体大小更改
- Android Studio Error:Could not find com.android.tools.build:gradle