microg/GmsCore · error · RuntimeException

CREATOR in is not accessible

Error message

CREATOR in  is not accessible

What it means

Reflection guard in SafeParcelReflectionUtil.getCreator(Class): the CREATOR field exists but accessing it threw (e.g. setAccessible(true) blocked by hidden-API restrictions or module boundaries). The class name is embedded in the message.

Solutions

  1. Make the CREATOR field public and statically accessible
  2. Bypass the reflective SafeParcel path and implement an explicit CREATOR-based writer/reader for that class
Defensive patterns

Strategy: fallback

When it happens

Trigger: Thrown at play-services-basement/src/main/java/org/microg/safeparcel/SafeParcelReflectionUtil.java:127 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/d949f65c7db37138. Report an issue: GitHub.

Appendix: source

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

        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) {
            return safeParcelableField.subClass();
        } else {

View on GitHub (pinned to 157c9d86ac)