{"record":{"id":"b602774d083c6f9d","repo":"microg/GmsCore","slug":"no-creator-found-for-tclass-getname","errorCode":null,"errorMessage":"No Creator found for \" + tClass.getName()","messagePattern":"No Creator found for \" \\+ tClass\\.getName\\(\\)","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"play-services-basement/src/main/java/com/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable.java","lineNumber":21,"sourceCode":" * SPDX-License-Identifier: Apache-2.0\n */\n\npackage com.google.android.gms.common.internal.safeparcel;\n\npublic abstract class AbstractSafeParcelable implements SafeParcelable {\n\n    @SuppressWarnings(\"unchecked\")\n    public static <T extends AbstractSafeParcelable> SafeParcelableCreatorAndWriter<T> findCreator(java.lang.Class<T> tClass) {\n        java.lang.Class<?> upmostClass = tClass;\n        while (upmostClass.getEnclosingClass() != null) upmostClass = upmostClass.getEnclosingClass();\n        String upmostClassName = upmostClass.getName();\n        int idx = upmostClassName.lastIndexOf('.');\n        String packagePrefix = idx > 0 ? upmostClassName.substring(0, idx + 1) : \"\";\n        String creatorClassName = packagePrefix + tClass.getSimpleName() + \"$000Creator\";\n        try {\n            return (SafeParcelableCreatorAndWriter<T>) java.lang.Class.forName(creatorClassName).newInstance();\n        } catch (Exception e) {\n            throw new RuntimeException(\"No Creator found for \" + tClass.getName(), e);\n        }\n    }\n\n    @Override\n    public int describeContents() {\n        return 0;\n    }\n\n}\n","sourceCodeStart":3,"sourceCodeEnd":31,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-basement/src/main/java/com/google/android/gms/common/internal/safeparcel/AbstractSafeParcelable.java#L3-L31","documentation":"AbstractSafeParcelable.findCreator() locates the generated '<Class>$000Creator' class by naming convention and reflection. When the generated creator class is missing or cannot be instantiated it throws a RuntimeException 'No Creator found for <class>'. This microG-specific mechanism requires codegen output that the official Play services library does not produce.","triggerScenarios":"Deserializing/writing a SafeParcelable subclass whose generated $000Creator class is not on the classpath or whose class name/package does not match the convention (e.g. obfuscated class names, class loaded from a different package).","commonSituations":"Mixing official Google Play services classes with microG's AbstractSafeParcelable (or vice versa); ProGuard/R8 stripping or renaming generated creator classes; class loaded via a different classloader/package after refactoring.","solutions":["Ensure the corresponding generated <Class>$000Creator class exists on the classpath","Exclude safeparcel classes from ProGuard/R8 obfuscation (keep rules)","Use the matching microG/safeparcel runtime for the parcelable classes in use","Check that the class's package structure was not moved after generation"],"exampleFix":"// proguard-rules.pro\n// before\n(nothing)\n// after\n-keep class * extends com.google.android.gms.common.internal.safeparcel.AbstractSafeParcelable { *; }\n-keep class **$000Creator { *; }","handlingStrategy":"try-catch","validationCode":"String pkg = tClass.getPackage().getName();\ntry {\n    Class.forName(pkg + \".\" + tClass.getSimpleName() + \"$000Creator\");\n} catch (ClassNotFoundException e) { /* creator missing */ }","typeGuard":null,"tryCatchPattern":"try { creator = AbstractSafeParcelable.findCreator(cls); } catch (RuntimeException e) { logMissingCreator(e); }","preventionTips":["Add ProGuard keep rules for $000Creator classes","Keep generated creator classes packaged with their parcelables","Use matching safeparcel runtime versions"],"tags":["reflection","classpath","proguard","safeparcel"],"backgroundTag":"class-not-found","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"}