Parcelable混淆

本文详细介绍了在项目中正确配置 Parcelable 的方法。除了常见的保留在混淆过程中的 Creator 对象外,还需要保留 public 和 private 字段。这对于实现 Parcelable 接口的类来说至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

看其他博客上都说混淆时只要加入下面代码就可以

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}


但是在我项目中,这样是不够的,还要加入

-keepclassmembers class * implements android.os.Parcelable {
 public <fields>;
 private <fields>;
}


至于为什么,不太清楚, 好神奇


最终结果就是如下配置:

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * implements android.os.Parcelable {
 public <fields>;
 private <fields>;
}




### 使用Parcelable接口在Android中传递对象 为了实现组件间的数据传输,`Parcelable` 接口提供了一种高效的方法来序列化自定义类的对象。通过实现 `Parcelable` 接口并遵循特定的编码解码逻辑,可以在不同组件之间安全有效地传递复杂数据结构。 #### 实现 Parcelable 类 创建一个实现了 `Parcelable` 的 Java 类: ```java public class Person implements Parcelable { private String name; private int age; protected Person(Parcel in) { name = in.readString(); age = in.readInt(); } public static final Creator<Person> CREATOR = new Creator<Person>() { @Override public Person createFromParcel(Parcel in) { return new Person(in); } @Override public Person[] newArray(int size) { return new Person[size]; } }; public Person(String name, int age){ this.name = name; this.age = age; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } @Override public int describeContents() { return 0; } } ``` 此代码片段展示了如何构建一个简单的 `Person` 对象,并使其能够被写入和读取到 `Parcel` 中[^1]。 #### 将对象放入 Intent 或 Bundle 当需要跨进程通信时,可以将实现了 `Parcelable` 的对象作为额外参数附加给 `Intent` 或者 `Bundle`: ```java // 创建一个新的 person 对象实例 Person person = new Person("John Doe", 30); // 放置该对象进入 intent 额外信息里 Intent intent = new Intent(context, TargetActivity.class); intent.putExtra("person_key", person); // 启动目标 activity 并携带上述意图 startActivity(intent); ``` 接收端可以从传来的 `Intent` 提取出 `Person` 对象: ```java @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 获取启动当前 Activity 所使用的 Intent Intent receivedIntent = getIntent(); // 解析出之前放置进去的人的信息 Person person = receivedIntent.getParcelableExtra("person_key"); } ``` 确保混淆配置正确无误以防止编译后的 APK 文件丢失静态内部成员变量 `CREATOR` 和其他字段。这可以通过向 ProGuard 规则文件添加以下条目完成[^2]: - `-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; }` - `-keepclassmembers class * implements android.os.Parcelable { public <fields>; private <fields>; }` 这些设置会阻止混淆器重命名或移除必要的部分,从而保持应用正常工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值