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
- Upgrade Tinker so the bundled dexlib2 knows the newer encoded value types
- Simplify/annotate less: identify the offending annotation (the hex tag hints at the type) and adjust build config
- 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
- Keep generator and applier Tinker versions identical
- Smoke-test patches against apps using newer annotation processors before full rollout
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
- old dex version mismatch! expetced:
- bad dex patch file version:
- Unexpected type: ${type}
- createDelegate failed
- can't recognize dex mode:{}
AI-assisted analysis of Tencent/tinker@1b7ea02c23 (2026-08-14).
Data as JSON: /api/errors/4da3bff26cfa0bac.
Report an issue: GitHub.