MuntashirAkon/AppManager · error · BadParcelableException
Parcelable protocol requires a Parcelable.Creator object cal
Error message
Parcelable protocol requires a Parcelable.Creator object called CREATOR on class " + name
What it means
ParcelUtils.readParcelableCreator requires the class's CREATOR field to be of a type assignable to Parcelable.Creator. If the field exists and is static but has some other type, BadParcelableException is thrown before Field.get() to avoid initializing the class.
Source
Thrown at libcore/io/src/main/java/aosp/android/content/pm/ParcelUtils.java:74
ClassLoader parcelableClassLoader = (loader == null ? from.getClass().getClassLoader() : loader);
// Avoid initializing the Parcelable class until we know it implements
// Parcelable and has the necessary CREATOR field.
Class<?> parcelableClass = Class.forName(name, false /* initialize */,
parcelableClassLoader);
if (!Parcelable.class.isAssignableFrom(parcelableClass)) {
throw new BadParcelableException("Parcelable protocol requires that the "
+ "class implements Parcelable");
}
Field f = parcelableClass.getField("CREATOR");
if ((f.getModifiers() & Modifier.STATIC) == 0) {
throw new BadParcelableException("Parcelable protocol requires "
+ "the CREATOR object to be static on class " + name);
}
Class<?> creatorType = f.getType();
if (!Parcelable.Creator.class.isAssignableFrom(creatorType)) {
// Fail before calling Field.get(), not after, to avoid initializing
// parcelableClass unnecessarily.
throw new BadParcelableException("Parcelable protocol requires a "
+ "Parcelable.Creator object called "
+ "CREATOR on class " + name);
}
creator = (Parcelable.Creator<?>) f.get(null);
} catch (IllegalAccessException e) {
Log.e(TAG, "Illegal access when unmarshalling: " + name, e);
throw new BadParcelableException(
"IllegalAccessException when unmarshalling: " + name);
} catch (ClassNotFoundException e) {
Log.e(TAG, "Class not found when unmarshalling: " + name, e);
throw new BadParcelableException("ClassNotFoundException when unmarshalling: " + name);
} catch (NoSuchFieldException e) {
throw new BadParcelableException("Parcelable protocol requires a "
+ "Parcelable.Creator object called "
+ "CREATOR on class " + name);
}
if (creator == null) {
throw new BadParcelableException("Parcelable protocol requires a "View on GitHub (pinned to 0152f468fc)
Solutions
- Change the CREATOR field's declared type to Parcelable.Creator<T>
- Rename any unrelated constant that shadows the CREATOR convention
- Confirm the class name in the parcel refers to the intended Parcelable class
Example fix
// before
public static final MyCustomFactory CREATOR = new MyCustomFactory();
// after
public static final Parcelable.Creator<MyData> CREATOR = new Parcelable.Creator<MyData>() {...}; Defensive patterns
Strategy: validation
Validate before calling
try {
Class<?> c = Class.forName(name, false, loader);
Class<?> t = c.getField("CREATOR").getType();
if (!Parcelable.Creator.class.isAssignableFrom(t)) throw new IllegalStateException("CREATOR wrong type");
} catch (ReflectiveOperationException e) { /* handle */ } Try / catch
try {
T p = ParcelUtils.readParcelable(parcel, loader);
} catch (BadParcelableException e) {
Log.e(TAG, "CREATOR type invalid on class", e);
} Prevention
- Declare CREATOR with the exact type Parcelable.Creator<T>
- Don't name non-Creator constants "CREATOR"
- Use IDE Parcelable templates to generate correct CREATORs
When it happens
Trigger: Reading a Parcelable whose CREATOR field is declared as a non-Creator type (e.g. a custom factory interface, Parcelable.Creator's raw generic in an incompatible hierarchy, or a field named CREATOR of an unrelated type).
Common situations: Refactoring where CREATOR's type was changed; classes with a constant named CREATOR that isn't a Creator; copying parcel-read helpers across unrelated classes.
Understand the failure class
Background: "is not a compatible type" / "cannot merge" errors: when a value's type doesn't match what the library requires — this error's family across 65 libraries.
Related errors
- Parcelable protocol requires that the class implements Parce
- Can't unparcel type " + actual.getName() + " in list of type
- Parcelable protocol requires the CREATOR object to be static
- IllegalAccessException when unmarshalling: " + name
- ClassNotFoundException when unmarshalling: " + name
AI-assisted analysis of MuntashirAkon/AppManager@0152f468fc (2026-09-12).
Data as JSON: /api/errors/4f7fcf261855e70b.
Report an issue: GitHub.