microg/GmsCore · error · RuntimeException

is an Parcelable without CREATOR

Error message

 is an Parcelable without CREATOR

What it means

Thrown in SafeParcelReflectionUtil.getCreator(Class) when the Parcelable class declares no CREATOR field (getDeclaredField threw NoSuchFieldException). The class name is appended; the type violates the Parcelable contract.

Source

Thrown at play-services-basement/src/main/java/org/microg/safeparcel/SafeParcelReflectionUtil.java:125

    private static Parcelable.Creator<Parcelable> getCreator(Field field) {
        Class<?> clazz = field.getType();
        if (clazz.isArray()) {
            clazz = clazz.getComponentType();
        }
        if (clazz != null && Parcelable.class.isAssignableFrom(clazz)) {
            return getCreator((Class<? extends Parcelable>) clazz);
        }
        throw new RuntimeException(clazz + " is not an Parcelable");
    }

    @SuppressWarnings("unchecked")
    public static Parcelable.Creator<Parcelable> getCreator(Class<? extends Parcelable> clazz) {
        try {
            Field creatorField = clazz.getDeclaredField("CREATOR");
            creatorField.setAccessible(true);
            return (Parcelable.Creator<Parcelable>) creatorField.get(null);
        } catch (NoSuchFieldException e) {
            throw new RuntimeException(clazz + " is an Parcelable without CREATOR");
        } catch (IllegalAccessException e) {
            throw new RuntimeException("CREATOR in " + clazz + " is not accessible");
        }
    }

    @SuppressWarnings("deprecation")
    private static Class<?> getSubClass(Field field) {
        SafeParceled safeParceled = field.getAnnotation(SafeParceled.class);
        SafeParcelable.Field safeParcelableField = field.getAnnotation(SafeParcelable.Field.class);
        if (safeParceled != null && safeParceled.subClass() != SafeParceled.class) {
            return safeParceled.subClass();
        } else if (safeParceled != null && !"undefined".equals(safeParceled.subType())) {
            try {
                return Class.forName(safeParceled.subType());
            } catch (ClassNotFoundException e) {
                throw new IllegalArgumentException(e);
            }
        } else if (safeParcelableField != null && safeParcelableField.subClass() != SafeParcelable.class) {

View on GitHub (pinned to 157c9d86ac)

Solutions

  1. Add a public static Parcelable.Creator CREATOR field to the class
  2. Use a field type that already exposes a CREATOR
Defensive patterns

Strategy: type-guard

When it happens

Trigger: Thrown at play-services-basement/src/main/java/org/microg/safeparcel/SafeParcelReflectionUtil.java:125 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of microg/GmsCore@157c9d86ac (2026-09-06). Data as JSON: /api/errors/a3bf9989aa4f9fec. Report an issue: GitHub.