{"record":{"id":"fc307ed37e7a3b51","repo":"microg/GmsCore","slug":"field-has-broken-interface","errorCode":null,"errorMessage":"Field has broken interface: ","messagePattern":"Field has broken interface: ","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"play-services-basement/src/main/java/org/microg/safeparcel/SafeParcelReflectionUtil.java","lineNumber":287,"sourceCode":"        switch (descriptor.type) {\n            case Parcelable:\n                descriptor.field.set(object, SafeParcelReader.readParcelable(parcel, header, descriptor.creator));\n                break;\n            case Binder:\n                descriptor.field.set(object, SafeParcelReader.readBinder(parcel, header));\n                break;\n            case Interface: {\n                boolean hasStub = false;\n                for (Class<?> aClass : descriptor.field.getType().getDeclaredClasses()) {\n                    try {\n                        descriptor.field.set(object, aClass.getDeclaredMethod(\"asInterface\", IBinder.class)\n                                .invoke(null, SafeParcelReader.readBinder(parcel, header)));\n                        hasStub = true;\n                        break;\n                    } catch (Exception ignored) {\n                    }\n                }\n                if (!hasStub) throw new RuntimeException(\"Field has broken interface: \" + descriptor.field);\n                break;\n            }\n            case StringList:\n                descriptor.field.set(object, SafeParcelReader.readStringList(parcel, header));\n                break;\n            case IntegerList:\n                descriptor.field.set(object, SafeParcelReader.readIntegerList(parcel, header));\n                break;\n            case BooleanList:\n                descriptor.field.set(object, SafeParcelReader.readBooleanList(parcel, header));\n                break;\n            case LongList:\n                descriptor.field.set(object, SafeParcelReader.readLongList(parcel, header));\n                break;\n            case FloatList:\n                descriptor.field.set(object, SafeParcelReader.readFloatList(parcel, header));\n                break;\n            case DoubleList:","sourceCodeStart":269,"sourceCodeEnd":305,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-basement/src/main/java/org/microg/safeparcel/SafeParcelReflectionUtil.java#L269-L305","documentation":"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.","triggerScenarios":"Thrown at play-services-basement/src/main/java/org/microg/safeparcel/SafeParcelReflectionUtil.java:287 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Fix the field's declared type to match the parcelled data (IBinder, Parcelable, or concrete class)","Ensure nested Stub classes exist for interface-typed fields","Catch the RuntimeException and treat the parcel as unreadable"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}