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.

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)

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.