Tencent/tinker · error · DexException

Unexpected type:

Error message

Unexpected type: 

What it means

DexException from AbstractIndexMap's encoded-value transformer: while rewriting annotations/static field values with remapped string/type indices, reader.peek() returned an encoded-value type tag the switch does not handle. The dex contains an encoded value kind this dexlib2 fork does not understand.

Solutions

  1. Upgrade Tinker so the bundled dexlib2 knows the newer encoded value types
  2. Simplify/annotate less: identify the offending annotation (the hex tag hints at the type) and adjust build config
  3. Regenerate the patch with matched generator/applier versions
Defensive patterns

Strategy: try-catch

Try / catch

try {
    applier.executeAndSaveTo(out);
} catch (com.android.dex.DexException e) {
    if (String.valueOf(e.getMessage()).startsWith("Unexpected type")) {
        // unknown encoded value tag: upgrade Tinker or simplify annotations
    } else { throw e; }
}

Prevention

When it happens

Trigger: Applying a dex patch whose old/new dex contains annotation or encoded-array values of an unknown type tag, during transform() when indices are adjusted and re-written.

Common situations: Newer dex features emitted by recent compilers; corrupted encoded-value sections; patch generated/applied across mismatched Tinker versions.

Related errors


AI-assisted analysis of Tencent/tinker@1b7ea02c23 (2026-08-14). Data as JSON: /api/errors/4da3bff26cfa0bac. Report an issue: GitHub.

Appendix: source

Thrown at tinker-commons/src/main/java/com/tencent/tinker/commons/dexpatcher/util/AbstractIndexMap.java:496

                    break;
                case EncodedValueReader.ENCODED_ARRAY:
                    writeTypeAndArg(EncodedValueReader.ENCODED_ARRAY, 0);
                    transformArray(reader);
                    break;
                case EncodedValueReader.ENCODED_ANNOTATION:
                    writeTypeAndArg(EncodedValueReader.ENCODED_ANNOTATION, 0);
                    transformAnnotation(reader);
                    break;
                case EncodedValueReader.ENCODED_NULL:
                    reader.readNull();
                    writeTypeAndArg(EncodedValueReader.ENCODED_NULL, 0);
                    break;
                case EncodedValueReader.ENCODED_BOOLEAN:
                    boolean value = reader.readBoolean();
                    writeTypeAndArg(EncodedValueReader.ENCODED_BOOLEAN, value ? 1 : 0);
                    break;
                default:
                    throw new DexException("Unexpected type: " + Integer.toHexString(reader.peek()));
            }
        }

        private void transformAnnotation(EncodedValueReader reader) {
            int fieldCount = reader.readAnnotation();
            Leb128.writeUnsignedLeb128(out, adjustTypeIdIndex(reader.getAnnotationType()));
            Leb128.writeUnsignedLeb128(out, fieldCount);
            for (int i = 0; i < fieldCount; i++) {
                Leb128.writeUnsignedLeb128(out, adjustStringIndex(reader.readAnnotationName()));
                transform(reader);
            }
        }

        private void transformArray(EncodedValueReader reader) {
            int size = reader.readArray();
            Leb128.writeUnsignedLeb128(out, size);
            for (int i = 0; i < size; i++) {
                transform(reader);

View on GitHub (pinned to 1b7ea02c23)