说说Android--图形系统基础之Parcel

172 阅读1分钟

前面我们分析到ViewRootImpl.java通过Surface拿到Canvas进行图像数据填充:

public class Surface implements Parcelable {

今天我们来讲讲Android的Parcel和Parcelable:

Parcelable类的官方解释文字:

Interface for classes whose instances can be written to and restored from a Parcel.

我的理解:Parcelable接口表示通过Parcel进行写入内存(序列化)和恢复(反序列化)。

官方Parcelable例子:

   public class MyParcelable implements Parcelable {
       private int mData;
  
       public int describeContents() {
           return 0;
       }
  
       public void writeToParcel(Parcel out, int flags) {
           out.writeInt(mData);
       }
  
       public static final Parcelable.Creator<MyParcelable> CREATOR
               = new Parcelable.Creator<MyParcelable>() {
           public MyParcelable createFromParcel(Parcel in) {
               return new MyParcelable(in);
           }
  
           public MyParcelable[] newArray(int size) {
               return new MyParcelable[size];
           }
       };
  
       private MyParcelable(Parcel in) {
           mData = in.readInt();
       }
   }

其中:

  1. describeContents() 一般默认实现就可以(return 0),只有特殊情况下需要返回1。
  2. writeToParcel() :写入内存方法 也就是序列化方法
  3. createFromParcel() 从内存中恢复Parcelable对象,也就是反序列化

跟踪源码我们可以发现: writeInt实现是 Native层的Parcel.cpp

跟踪源码可以发现

    //写入方法
    @CriticalNative
    private static native int nativeWriteInt(long nativePtr, int val);
    @CriticalNative
    private static native int nativeWriteLong(long nativePtr, long val);
    
    //读取方法
    @FastNative
    private static native String nativeReadString8(long nativePtr);
    @FastNative
    private static native String nativeReadString16(long nativePtr);

通过JNI可以找到

{"nativeWriteInt", "(JI)V", (void*)[android_os_Parcel_writeInt](https://cs.android.com/android/platform/superproject/+/master:libnativehelper/tests/JniSafeRegisterNativeMethods_test.cpp;drc=fe54112f40c78e99ed63a75a52f3f137df0c6477;l=901?q=nativeWriteInt)}

android_os_Parcel_writeInt --->Parcel.writeInt:

   static int android_os_Parcel_writeInt(jlong nativePtr, jint val) {
        Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
        return (parcel != NULL) ? parcel->writeInt32(val) : OK;
} 

Parcel.cpp中会将数据存储到内存中 //TODO