microg/GmsCore · error · RuntimeException

Field has broken interface:

Error message

Field has broken interface: 

What it means

Wraps a reflection failure in SafeParcelReflectionUtil.readField while reading a typed field (e.g. an interface-typed field whose Stub.asInterface lookup failed). The field details prefix the message and the cause identifies the broken reflective operation — the field's declared type does not match the parcelled representation.

Source

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

        switch (descriptor.type) {
            case Parcelable:
                descriptor.field.set(object, SafeParcelReader.readParcelable(parcel, header, descriptor.creator));
                break;
            case Binder:
                descriptor.field.set(object, SafeParcelReader.readBinder(parcel, header));
                break;
            case Interface: {
                boolean hasStub = false;
                for (Class<?> aClass : descriptor.field.getType().getDeclaredClasses()) {
                    try {
                        descriptor.field.set(object, aClass.getDeclaredMethod("asInterface", IBinder.class)
                                .invoke(null, SafeParcelReader.readBinder(parcel, header)));
                        hasStub = true;
                        break;
                    } catch (Exception ignored) {
                    }
                }
                if (!hasStub) throw new RuntimeException("Field has broken interface: " + descriptor.field);
                break;
            }
            case StringList:
                descriptor.field.set(object, SafeParcelReader.readStringList(parcel, header));
                break;
            case IntegerList:
                descriptor.field.set(object, SafeParcelReader.readIntegerList(parcel, header));
                break;
            case BooleanList:
                descriptor.field.set(object, SafeParcelReader.readBooleanList(parcel, header));
                break;
            case LongList:
                descriptor.field.set(object, SafeParcelReader.readLongList(parcel, header));
                break;
            case FloatList:
                descriptor.field.set(object, SafeParcelReader.readFloatList(parcel, header));
                break;
            case DoubleList:

View on GitHub (pinned to 157c9d86ac)

Solutions

  1. Fix the field's declared type to match the parcelled data (IBinder, Parcelable, or concrete class)
  2. Ensure nested Stub classes exist for interface-typed fields
  3. Catch the RuntimeException and treat the parcel as unreadable
Defensive patterns

Strategy: try-catch

When it happens

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