Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Proguard-为什么不需要保留CreateFromParcelable创建者的地块名称_Android_Proguard - Fatal编程技术网

Android Proguard-为什么不需要保留CreateFromParcelable创建者的地块名称

Android Proguard-为什么不需要保留CreateFromParcelable创建者的地块名称,android,proguard,Android,Proguard,我的项目与多个proguard文件链接。如果我查看所有proguard文件,以下是处理Parcelable的规则 我有下面的类文件,它在proguard进程之前 前保护过程 经过proguard过程后,我通过逆向工程得到以下代码 如您所见,CREATOR createFromParcelParcel和newArrayint已重命名为aParcel和newArrayint 我预计在像Bundle.putParcelable这样的parceble过程中,事情会失败,因为操作系统不再能够找到creat

我的项目与多个proguard文件链接。如果我查看所有proguard文件,以下是处理Parcelable的规则

我有下面的类文件,它在proguard进程之前

前保护过程 经过proguard过程后,我通过逆向工程得到以下代码 如您所见,CREATOR createFromParcelParcel和newArrayint已重命名为aParcel和newArrayint

我预计在像Bundle.putParcelable这样的parceble过程中,事情会失败,因为操作系统不再能够找到createFromParcel

然而,令我惊讶的是,下面这行代码仍然可以毫无问题地执行

Log.i("CHEOK", "createFromParcel");

我可以知道为什么会这样吗?我认为Android操作系统应该执行createFromParcelParcel。操作系统如何知道它需要执行aParcel?

我对此也很好奇。事实证明,编译器创建了一个指向模糊化方法的合成方法。如果使用apktool反转apk并深入研究smali代码,就可以看到这一点

下面是实现Parcelable的类Foo的相关smali,该类已被模糊化,因此createFromParcel->a


正如我所说,在生成apk后,甚至在签署应用程序后,还是一样的,或者包裹认为不知道对不起
package org.yccheok.jstock.engine;

import android.os.Parcel;
import android.os.Parcelable;

/**
 *
 * @author yccheok
 */
public class Code implements Parcelable {
    private Code(String code) {
        this.code = code;
    }

    public static Code newInstance(String code) {
        if (code == null) {
            throw new java.lang.IllegalArgumentException("code cannot be null");
        }

        return new Code(code);
    }

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + code.hashCode();

        return result;
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) {
            return true;
        }

        if (!(o instanceof Code)) {
            return false;
        }

        return this.code.equals(((Code)o).code);
    }

    @Override
    public String toString() {
        return code;
    }

    ////////////////////////////////////////////////////////////////////////////
    // Handling Parcelable nicely.

    public static final Parcelable.Creator<Code> CREATOR = new Parcelable.Creator<Code>() {
        public Code createFromParcel(Parcel in) {
            android.util.Log.i("CHEOK", "createFromParcel");
            return new Code(in);
        }

        public Code[] newArray(int size) {
            android.util.Log.i("CHEOK", "newArray");
            return new Code[size];
        }
    };

    private Code(Parcel in) {
        code = in.readString();
        android.util.Log.i("CHEOK", "Code parcel " + code);
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel parcel, int flags) {
        parcel.writeString(code);        
    }

    // Handling Parcelable nicely.    
    ////////////////////////////////////////////////////////////////////////////

    private String code;
}
package org.yccheok.jstock.engine;

import android.os.Parcel;
import android.os.Parcelable;
import android.os.Parcelable.Creator;
import android.util.Log;

public class Code
  implements Parcelable
{
  public static final Parcelable.Creator<Code> CREATOR = new Parcelable.Creator()
  {
    public Code a(Parcel paramAnonymousParcel)
    {
      Log.i("CHEOK", "createFromParcel");
      return new Code(paramAnonymousParcel, null);
    }

    public Code[] a(int paramAnonymousInt)
    {
      Log.i("CHEOK", "newArray");
      return new Code[paramAnonymousInt];
    }
  };
  private String code;

  private Code(Parcel paramParcel)
  {
    this.code = paramParcel.readString();
    Log.i("CHEOK", "Code parcel " + this.code);
  }

  private Code(String paramString)
  {
    this.code = paramString;
  }

  public static Code newInstance(String paramString)
  {
    if (paramString == null)
      throw new IllegalArgumentException("code cannot be null");
    return new Code(paramString);
  }

  public int describeContents()
  {
    return 0;
  }

  public boolean equals(Object paramObject)
  {
    if (paramObject == this)
      return true;
    if (!(paramObject instanceof Code))
      return false;
    return this.code.equals(((Code)paramObject).code);
  }

  public int hashCode()
  {
    return 527 + this.code.hashCode();
  }

  public String toString()
  {
    return this.code;
  }

  public void writeToParcel(Parcel paramParcel, int paramInt)
  {
    paramParcel.writeString(this.code);
  }
}
Log.i("CHEOK", "createFromParcel");
# The synthetic method definition
.method public synthetic createFromParcel(Landroid/os/Parcel;)Ljava/lang/Object;

    invoke-virtual {p0, p1}, Lcom/example/Foo$1;->a(Landroid/os/Parcel;)Lcom/example/Foo;

    move-result-object v0

    return-object v0
.end method

# The obfuscated method definition
.method public a(Landroid/os/Parcel;)Lcom/example/Foo;

    new-instance v0, Lcom/example/Foo;

    invoke-direct {v0, p1}, Lcom/example/Foo;-><init>(Landroid/os/Parcel;)V

    return-object v0
.end method
at com.example.Foo$1.a(SourceFile:52)
    at com.example.Foo$1.createFromParcel(SourceFile:49)
    at android.os.Parcel.readParcelable(Parcel.java:2471)
    at android.os.Parcel.readValue(Parcel.java:2365)
    at android.os.Parcel.readListInternal(Parcel.java:2793)
    at android.os.Parcel.readArrayList(Parcel.java:2036)
    at android.os.Parcel.readValue(Parcel.java:2386)
    at android.os.Parcel.readArrayMapInternal(Parcel.java:2732)
    at android.os.BaseBundle.unparcel(BaseBundle.java:269)
    at android.os.BaseBundle.getString(BaseBundle.java:992)