org.jf.dexlib2.ValueType Java Examples

The following examples show how to use org.jf.dexlib2.ValueType. You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: EncodedValueRewriter.java    From ZjDroid with Apache License 2.0 6 votes vote down vote up
@Nonnull @Override public EncodedValue rewrite(@Nonnull EncodedValue encodedValue) {
    switch (encodedValue.getValueType()) {
        case ValueType.TYPE:
            return new RewrittenTypeEncodedValue((TypeEncodedValue)encodedValue);
        case ValueType.FIELD:
            return new RewrittenFieldEncodedValue((FieldEncodedValue)encodedValue);
        case ValueType.METHOD:
            return new RewrittenMethodEncodedValue((MethodEncodedValue)encodedValue);
        case ValueType.ENUM:
            return new RewrittenEnumEncodedValue((EnumEncodedValue)encodedValue);
        case ValueType.ARRAY:
            return new RewrittenArrayEncodedValue((ArrayEncodedValue)encodedValue);
        case ValueType.ANNOTATION:
            return new RewrittenAnnotationEncodedValue((AnnotationEncodedValue)encodedValue);
        default:
            return encodedValue;
    }
}
 
Example #2
Source File: EncodedValueUtils.java    From ZjDroid with Apache License 2.0 6 votes vote down vote up
public static boolean isDefaultValue(EncodedValue encodedValue) {
    switch (encodedValue.getValueType()) {
        case ValueType.BOOLEAN:
            return !((BooleanEncodedValue)encodedValue).getValue();
        case ValueType.BYTE:
            return ((ByteEncodedValue)encodedValue).getValue() == 0;
        case ValueType.CHAR:
            return ((CharEncodedValue)encodedValue).getValue() == 0;
        case ValueType.DOUBLE:
            return ((DoubleEncodedValue)encodedValue).getValue() == 0;
        case ValueType.FLOAT:
            return ((FloatEncodedValue)encodedValue).getValue() == 0;
        case ValueType.INT:
            return ((IntEncodedValue)encodedValue).getValue() == 0;
        case ValueType.LONG:
            return ((LongEncodedValue)encodedValue).getValue() == 0;
        case ValueType.NULL:
            return true;
        case ValueType.SHORT:
            return ((ShortEncodedValue)encodedValue).getValue() == 0;
    }
    return false;
}
 
Example #3
Source File: DexEncodedValueUtils.java    From SimpleSmali with Apache License 2.0 6 votes vote down vote up
public static boolean isDefaultValue(EncodedValue encodedValue) {
    switch (encodedValue.getValueType()) {
        case ValueType.BOOLEAN:
            return !((BooleanEncodedValue) encodedValue).getValue();
        case ValueType.BYTE:
            return ((ByteEncodedValue) encodedValue).getValue() == 0;
        case ValueType.CHAR:
            return ((CharEncodedValue) encodedValue).getValue() == 0;
        case ValueType.DOUBLE:
            return ((DoubleEncodedValue) encodedValue).getValue() == 0;
        case ValueType.FLOAT:
            return ((FloatEncodedValue) encodedValue).getValue() == 0;
        case ValueType.INT:
            return ((IntEncodedValue) encodedValue).getValue() == 0;
        case ValueType.LONG:
            return ((LongEncodedValue) encodedValue).getValue() == 0;
        case ValueType.NULL:
            return true;
        case ValueType.SHORT:
            return ((ShortEncodedValue) encodedValue).getValue() == 0;
    }
    return false;
}
 
Example #4
Source File: EncodedValueUtils.java    From HeyGirl with Apache License 2.0 6 votes vote down vote up
public static boolean isDefaultValue(EncodedValue encodedValue) {
    switch (encodedValue.getValueType()) {
        case ValueType.BOOLEAN:
            return !((BooleanEncodedValue)encodedValue).getValue();
        case ValueType.BYTE:
            return ((ByteEncodedValue)encodedValue).getValue() == 0;
        case ValueType.CHAR:
            return ((CharEncodedValue)encodedValue).getValue() == 0;
        case ValueType.DOUBLE:
            return ((DoubleEncodedValue)encodedValue).getValue() == 0;
        case ValueType.FLOAT:
            return ((FloatEncodedValue)encodedValue).getValue() == 0;
        case ValueType.INT:
            return ((IntEncodedValue)encodedValue).getValue() == 0;
        case ValueType.LONG:
            return ((LongEncodedValue)encodedValue).getValue() == 0;
        case ValueType.NULL:
            return true;
        case ValueType.SHORT:
            return ((ShortEncodedValue)encodedValue).getValue() == 0;
    }
    return false;
}
 
Example #5
Source File: BuilderContext.java    From ZjDroid with Apache License 2.0 5 votes vote down vote up
@Nonnull private BuilderEncodedValue internEncodedValue(@Nonnull EncodedValue encodedValue) {
    switch (encodedValue.getValueType()) {
        case ValueType.ANNOTATION:
            return internAnnotationEncodedValue((AnnotationEncodedValue)encodedValue);
        case ValueType.ARRAY:
            return internArrayEncodedValue((ArrayEncodedValue)encodedValue);
        case ValueType.BOOLEAN:
            boolean value = ((BooleanEncodedValue)encodedValue).getValue();
            return value?BuilderBooleanEncodedValue.TRUE_VALUE:BuilderBooleanEncodedValue.FALSE_VALUE;
        case ValueType.BYTE:
            return new BuilderByteEncodedValue(((ByteEncodedValue)encodedValue).getValue());
        case ValueType.CHAR:
            return new BuilderCharEncodedValue(((CharEncodedValue)encodedValue).getValue());
        case ValueType.DOUBLE:
            return new BuilderDoubleEncodedValue(((DoubleEncodedValue)encodedValue).getValue());
        case ValueType.ENUM:
            return internEnumEncodedValue((EnumEncodedValue)encodedValue);
        case ValueType.FIELD:
            return internFieldEncodedValue((FieldEncodedValue)encodedValue);
        case ValueType.FLOAT:
            return new BuilderFloatEncodedValue(((FloatEncodedValue)encodedValue).getValue());
        case ValueType.INT:
            return new BuilderIntEncodedValue(((IntEncodedValue)encodedValue).getValue());
        case ValueType.LONG:
            return new BuilderLongEncodedValue(((LongEncodedValue)encodedValue).getValue());
        case ValueType.METHOD:
            return internMethodEncodedValue((MethodEncodedValue)encodedValue);
        case ValueType.NULL:
            return BuilderNullEncodedValue.INSTANCE;
        case ValueType.SHORT:
            return new BuilderShortEncodedValue(((ShortEncodedValue)encodedValue).getValue());
        case ValueType.STRING:
            return internStringEncodedValue((StringEncodedValue)encodedValue);
        case ValueType.TYPE:
            return internTypeEncodedValue((TypeEncodedValue)encodedValue);
        default:
            throw new ExceptionWithContext("Unexpected encoded value type: %d", encodedValue.getValueType());
    }
}
 
Example #6
Source File: BuilderContext.java    From HeyGirl with Apache License 2.0 5 votes vote down vote up
@Nonnull private BuilderEncodedValue internEncodedValue(@Nonnull EncodedValue encodedValue) {
    switch (encodedValue.getValueType()) {
        case ValueType.ANNOTATION:
            return internAnnotationEncodedValue((AnnotationEncodedValue)encodedValue);
        case ValueType.ARRAY:
            return internArrayEncodedValue((ArrayEncodedValue)encodedValue);
        case ValueType.BOOLEAN:
            boolean value = ((BooleanEncodedValue)encodedValue).getValue();
            return value?BuilderBooleanEncodedValue.TRUE_VALUE:BuilderBooleanEncodedValue.FALSE_VALUE;
        case ValueType.BYTE:
            return new BuilderByteEncodedValue(((ByteEncodedValue)encodedValue).getValue());
        case ValueType.CHAR:
            return new BuilderCharEncodedValue(((CharEncodedValue)encodedValue).getValue());
        case ValueType.DOUBLE:
            return new BuilderDoubleEncodedValue(((DoubleEncodedValue)encodedValue).getValue());
        case ValueType.ENUM:
            return internEnumEncodedValue((EnumEncodedValue)encodedValue);
        case ValueType.FIELD:
            return internFieldEncodedValue((FieldEncodedValue)encodedValue);
        case ValueType.FLOAT:
            return new BuilderFloatEncodedValue(((FloatEncodedValue)encodedValue).getValue());
        case ValueType.INT:
            return new BuilderIntEncodedValue(((IntEncodedValue)encodedValue).getValue());
        case ValueType.LONG:
            return new BuilderLongEncodedValue(((LongEncodedValue)encodedValue).getValue());
        case ValueType.METHOD:
            return internMethodEncodedValue((MethodEncodedValue)encodedValue);
        case ValueType.NULL:
            return BuilderNullEncodedValue.INSTANCE;
        case ValueType.SHORT:
            return new BuilderShortEncodedValue(((ShortEncodedValue)encodedValue).getValue());
        case ValueType.STRING:
            return internStringEncodedValue((StringEncodedValue)encodedValue);
        case ValueType.TYPE:
            return internTypeEncodedValue((TypeEncodedValue)encodedValue);
        default:
            throw new ExceptionWithContext("Unexpected encoded value type: %d", encodedValue.getValueType());
    }
}
 
Example #7
Source File: BuilderContext.java    From zjdroid with Apache License 2.0 5 votes vote down vote up
@Nonnull private BuilderEncodedValue internEncodedValue(@Nonnull EncodedValue encodedValue) {
    switch (encodedValue.getValueType()) {
        case ValueType.ANNOTATION:
            return internAnnotationEncodedValue((AnnotationEncodedValue)encodedValue);
        case ValueType.ARRAY:
            return internArrayEncodedValue((ArrayEncodedValue)encodedValue);
        case ValueType.BOOLEAN:
            boolean value = ((BooleanEncodedValue)encodedValue).getValue();
            return value?BuilderBooleanEncodedValue.TRUE_VALUE:BuilderBooleanEncodedValue.FALSE_VALUE;
        case ValueType.BYTE:
            return new BuilderByteEncodedValue(((ByteEncodedValue)encodedValue).getValue());
        case ValueType.CHAR:
            return new BuilderCharEncodedValue(((CharEncodedValue)encodedValue).getValue());
        case ValueType.DOUBLE:
            return new BuilderDoubleEncodedValue(((DoubleEncodedValue)encodedValue).getValue());
        case ValueType.ENUM:
            return internEnumEncodedValue((EnumEncodedValue)encodedValue);
        case ValueType.FIELD:
            return internFieldEncodedValue((FieldEncodedValue)encodedValue);
        case ValueType.FLOAT:
            return new BuilderFloatEncodedValue(((FloatEncodedValue)encodedValue).getValue());
        case ValueType.INT:
            return new BuilderIntEncodedValue(((IntEncodedValue)encodedValue).getValue());
        case ValueType.LONG:
            return new BuilderLongEncodedValue(((LongEncodedValue)encodedValue).getValue());
        case ValueType.METHOD:
            return internMethodEncodedValue((MethodEncodedValue)encodedValue);
        case ValueType.NULL:
            return BuilderNullEncodedValue.INSTANCE;
        case ValueType.SHORT:
            return new BuilderShortEncodedValue(((ShortEncodedValue)encodedValue).getValue());
        case ValueType.STRING:
            return internStringEncodedValue((StringEncodedValue)encodedValue);
        case ValueType.TYPE:
            return internTypeEncodedValue((TypeEncodedValue)encodedValue);
        default:
            throw new ExceptionWithContext("Unexpected encoded value type: %d", encodedValue.getValueType());
    }
}
 
Example #8
Source File: EncodedValueWriter.java    From zjdroid with Apache License 2.0 5 votes vote down vote up
public void writeArray(Collection<? extends EncodedValue> elements) throws IOException {
    writer.writeEncodedValueHeader(ValueType.ARRAY, 0);
    writer.writeUleb128(elements.size());
    for (EncodedValue element: elements) {
        writeEncodedValue(element);
    }
}
 
Example #9
Source File: EncodedValueWriter.java    From ZjDroid with Apache License 2.0 5 votes vote down vote up
public void writeArray(Collection<? extends EncodedValue> elements) throws IOException {
    writer.writeEncodedValueHeader(ValueType.ARRAY, 0);
    writer.writeUleb128(elements.size());
    for (EncodedValue element: elements) {
        writeEncodedValue(element);
    }
}
 
Example #10
Source File: EncodedValueWriter.java    From HeyGirl with Apache License 2.0 5 votes vote down vote up
public void writeAnnotation(TypeKey annotationType,
                            Collection<? extends AnnotationElement> elements) throws IOException {
    writer.writeEncodedValueHeader(ValueType.ANNOTATION, 0);
    writer.writeUleb128(typeSection.getItemIndex(annotationType));
    writer.writeUleb128(elements.size());
    for (AnnotationElement element: elements) {
        writer.writeUleb128(stringSection.getItemIndex(annotationSection.getElementName(element)));
        writeEncodedValue(annotationSection.getElementValue(element));
    }
}
 
Example #11
Source File: ImmutableEncodedValueFactory.java    From ZjDroid with Apache License 2.0 5 votes vote down vote up
@Nonnull
public static ImmutableEncodedValue of(@Nonnull EncodedValue encodedValue) {
    switch (encodedValue.getValueType()) {
        case ValueType.BYTE:
            return ImmutableByteEncodedValue.of((ByteEncodedValue)encodedValue);
        case ValueType.SHORT:
            return ImmutableShortEncodedValue.of((ShortEncodedValue)encodedValue);
        case ValueType.CHAR:
            return ImmutableCharEncodedValue.of((CharEncodedValue)encodedValue);
        case ValueType.INT:
            return ImmutableIntEncodedValue.of((IntEncodedValue)encodedValue);
        case ValueType.LONG:
            return ImmutableLongEncodedValue.of((LongEncodedValue)encodedValue);
        case ValueType.FLOAT:
            return ImmutableFloatEncodedValue.of((FloatEncodedValue)encodedValue);
        case ValueType.DOUBLE:
            return ImmutableDoubleEncodedValue.of((DoubleEncodedValue)encodedValue);
        case ValueType.STRING:
            return ImmutableStringEncodedValue.of((StringEncodedValue)encodedValue);
        case ValueType.TYPE:
            return ImmutableTypeEncodedValue.of((TypeEncodedValue)encodedValue);
        case ValueType.FIELD:
            return ImmutableFieldEncodedValue.of((FieldEncodedValue)encodedValue);
        case ValueType.METHOD:
            return ImmutableMethodEncodedValue.of((MethodEncodedValue)encodedValue);
        case ValueType.ENUM:
            return ImmutableEnumEncodedValue.of((EnumEncodedValue)encodedValue);
        case ValueType.ARRAY:
            return ImmutableArrayEncodedValue.of((ArrayEncodedValue)encodedValue);
        case ValueType.ANNOTATION:
            return ImmutableAnnotationEncodedValue.of((AnnotationEncodedValue)encodedValue);
        case ValueType.NULL:
            return ImmutableNullEncodedValue.INSTANCE;
        case ValueType.BOOLEAN:
            return ImmutableBooleanEncodedValue.of((BooleanEncodedValue)encodedValue);
        default:
            Preconditions.checkArgument(false);
            return null;
    }
}
 
Example #12
Source File: EncodedValueWriter.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public void writeBoolean(boolean value) throws IOException {
    writer.writeEncodedValueHeader(ValueType.BOOLEAN, value ? 1 : 0);
}
 
Example #13
Source File: EncodedValueWriter.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public void writeByte(byte value) throws IOException {
    writer.writeEncodedInt(ValueType.BYTE, value);
}
 
Example #14
Source File: EncodedValueWriter.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public void writeChar(char value) throws IOException {
    writer.writeEncodedUint(ValueType.CHAR, value);
}
 
Example #15
Source File: DexBackedEncodedValue.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
@Nonnull
public static EncodedValue readFrom(@Nonnull DexReader reader) {
    int startOffset = reader.getOffset();

    try {
        int b = reader.readUbyte();
        int valueType = b & 0x1f;
        int valueArg = b >>> 5;

        switch (valueType) {
            case ValueType.BYTE:
                Preconditions.checkValueArg(valueArg, 0);
                return new ImmutableByteEncodedValue((byte)reader.readByte());
            case ValueType.SHORT:
                Preconditions.checkValueArg(valueArg, 1);
                return new ImmutableShortEncodedValue((short)reader.readSizedInt(valueArg + 1));
            case ValueType.CHAR:
                Preconditions.checkValueArg(valueArg, 1);
                return new ImmutableCharEncodedValue((char)reader.readSizedSmallUint(valueArg + 1));
            case ValueType.INT:
                Preconditions.checkValueArg(valueArg, 3);
                return new ImmutableIntEncodedValue(reader.readSizedInt(valueArg + 1));
            case ValueType.LONG:
                Preconditions.checkValueArg(valueArg, 7);
                return new ImmutableLongEncodedValue(reader.readSizedLong(valueArg + 1));
            case ValueType.FLOAT:
                Preconditions.checkValueArg(valueArg, 3);
                return new ImmutableFloatEncodedValue(Float.intBitsToFloat(
                        reader.readSizedRightExtendedInt(valueArg + 1)));
            case ValueType.DOUBLE:
                Preconditions.checkValueArg(valueArg, 7);
                return new ImmutableDoubleEncodedValue(Double.longBitsToDouble(
                        reader.readSizedRightExtendedLong(valueArg + 1)));
            case ValueType.STRING:
                Preconditions.checkValueArg(valueArg, 3);
                return new DexBackedStringEncodedValue(reader, valueArg);
            case ValueType.TYPE:
                Preconditions.checkValueArg(valueArg, 3);
                return new DexBackedTypeEncodedValue(reader, valueArg);
            case ValueType.FIELD:
                Preconditions.checkValueArg(valueArg, 3);
                return new DexBackedFieldEncodedValue(reader, valueArg);
            case ValueType.METHOD:
                Preconditions.checkValueArg(valueArg, 3);
                return new DexBackedMethodEncodedValue(reader, valueArg);
            case ValueType.ENUM:
                Preconditions.checkValueArg(valueArg, 3);
                return new DexBackedEnumEncodedValue(reader, valueArg);
            case ValueType.ARRAY:
                Preconditions.checkValueArg(valueArg, 0);
                return new DexBackedArrayEncodedValue(reader);
            case ValueType.ANNOTATION:
                Preconditions.checkValueArg(valueArg, 0);
                return new DexBackedAnnotationEncodedValue(reader);
            case ValueType.NULL:
                Preconditions.checkValueArg(valueArg, 0);
                return ImmutableNullEncodedValue.INSTANCE;
            case ValueType.BOOLEAN:
                Preconditions.checkValueArg(valueArg, 1);
                return ImmutableBooleanEncodedValue.forBoolean(valueArg == 1);
            default:
                throw new ExceptionWithContext("Invalid encoded_value type: 0x%x", valueType);
        }
    } catch (Exception ex) {
        throw ExceptionWithContext.withContext(ex, "Error while reading encoded value at offset 0x%x", startOffset);
    }
}
 
Example #16
Source File: EncodedValueWriter.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public void writeField(@Nonnull FieldRefKey value) throws IOException {
    writer.writeEncodedUint(ValueType.FIELD, fieldSection.getItemIndex(value));
}
 
Example #17
Source File: EncodedValueWriter.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public void writeLong(long value) throws IOException {
    writer.writeEncodedLong(ValueType.LONG, value);
}
 
Example #18
Source File: DexBackedEncodedValue.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public static void skipFrom(@Nonnull DexReader reader) {
    int startOffset = reader.getOffset();

    try {
        int b = reader.readUbyte();
        int valueType = b & 0x1f;

        switch (valueType) {
            case ValueType.BYTE:
                reader.skipByte();
                break;
            case ValueType.SHORT:
            case ValueType.CHAR:
            case ValueType.INT:
            case ValueType.LONG:
            case ValueType.FLOAT:
            case ValueType.DOUBLE:
            case ValueType.STRING:
            case ValueType.TYPE:
            case ValueType.FIELD:
            case ValueType.METHOD:
            case ValueType.ENUM:
                int valueArg = b >>> 5;
                reader.moveRelative(valueArg+1);
                break;
            case ValueType.ARRAY:
                DexBackedArrayEncodedValue.skipFrom(reader);
                break;
            case ValueType.ANNOTATION:
                DexBackedAnnotationEncodedValue.skipFrom(reader);
                break;
            case ValueType.NULL:
            case ValueType.BOOLEAN:
                break;
            default:
                throw new ExceptionWithContext("Invalid encoded_value type: 0x%x", valueType);
        }
    } catch (Exception ex) {
        throw ExceptionWithContext.withContext(ex, "Error while skipping encoded value at offset 0x%x",
                startOffset);
    }
}
 
Example #19
Source File: EncodedValueWriter.java    From HeyGirl with Apache License 2.0 4 votes vote down vote up
public void writeChar(char value) throws IOException {
    writer.writeEncodedUint(ValueType.CHAR, value);
}
 
Example #20
Source File: EncodedValueWriter.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public void writeMethod(@Nonnull MethodRefKey value) throws IOException {
    writer.writeEncodedUint(ValueType.METHOD, methodSection.getItemIndex(value));
}
 
Example #21
Source File: BaseAnnotationEncodedValue.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public int getValueType() {
    return ValueType.ANNOTATION;
}
 
Example #22
Source File: DexEncodedValueUtils.java    From SimpleSmali with Apache License 2.0 4 votes vote down vote up
public static Object getEncodeValue(EncodedValue encodedValue) {
    switch (encodedValue.getValueType()) {
        case ValueType.BOOLEAN:
            return ((BooleanEncodedValue) encodedValue).getValue();
        case ValueType.BYTE:
            return ((ByteEncodedValue) encodedValue).getValue();
        case ValueType.CHAR:
            return ((CharEncodedValue) encodedValue).getValue();
        case ValueType.DOUBLE:
            return ((DoubleEncodedValue) encodedValue).getValue();
        case ValueType.FLOAT:
            return ((FloatEncodedValue) encodedValue).getValue();
        case ValueType.INT:
            return ((IntEncodedValue) encodedValue).getValue();
        case ValueType.LONG:
            return ((LongEncodedValue) encodedValue).getValue();
        case ValueType.NULL:
            return "null";
        case ValueType.SHORT:
            return ((ShortEncodedValue) encodedValue).getValue();
        case ValueType.STRING:
            return ((StringEncodedValue) encodedValue).getValue();
        case ValueType.TYPE:
            return ((TypeEncodedValue) encodedValue).getValue();
        case ValueType.FIELD:
            return ((FieldEncodedValue) encodedValue).getValue();
        case ValueType.ENUM:
            return ((EnumEncodedValue) encodedValue).getValue();
        case ValueType.METHOD:
            return ((MethodEncodedValue) encodedValue).getValue().getName();
        case ValueType.ARRAY: {
            ArrayList<String> vals = new ArrayList<>();
            StringJoiner joiner = new StringJoiner(",");
            List<? extends EncodedValue> valueS = ((ArrayEncodedValue) encodedValue).getValue();
            for (EncodedValue encodedValue1 : valueS) {
                joiner.add(String.valueOf(getEncodeValue(encodedValue1)));
            }
            return String.format("[%s]", joiner.toString());
        }
        case ValueType.ANNOTATION:
            return ((AnnotationEncodedValue) encodedValue).getType();//FIXME:
    }
   
    return "Unknown";

}
 
Example #23
Source File: EncodedValueWriter.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public void writeNull() throws IOException {
    writer.write(ValueType.NULL);
}
 
Example #24
Source File: EncodedValueWriter.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
public void writeShort(int value) throws IOException {
    writer.writeEncodedInt(ValueType.SHORT, value);
}
 
Example #25
Source File: EncodedValueWriter.java    From HeyGirl with Apache License 2.0 4 votes vote down vote up
public void writeField(@Nonnull FieldRefKey value) throws IOException {
    writer.writeEncodedUint(ValueType.FIELD, fieldSection.getItemIndex(value));
}
 
Example #26
Source File: DexBackedEncodedValue.java    From ZjDroid with Apache License 2.0 4 votes vote down vote up
public static void skipFrom(@Nonnull DexReader reader) {
    int startOffset = reader.getOffset();

    try {
        int b = reader.readUbyte();
        int valueType = b & 0x1f;

        switch (valueType) {
            case ValueType.BYTE:
                reader.skipByte();
                break;
            case ValueType.SHORT:
            case ValueType.CHAR:
            case ValueType.INT:
            case ValueType.LONG:
            case ValueType.FLOAT:
            case ValueType.DOUBLE:
            case ValueType.STRING:
            case ValueType.TYPE:
            case ValueType.FIELD:
            case ValueType.METHOD:
            case ValueType.ENUM:
                int valueArg = b >>> 5;
                reader.moveRelative(valueArg+1);
                break;
            case ValueType.ARRAY:
                DexBackedArrayEncodedValue.skipFrom(reader);
                break;
            case ValueType.ANNOTATION:
                DexBackedAnnotationEncodedValue.skipFrom(reader);
                break;
            case ValueType.NULL:
            case ValueType.BOOLEAN:
                break;
            default:
                throw new ExceptionWithContext("Invalid encoded_value type: 0x%x", valueType);
        }
    } catch (Exception ex) {
        throw ExceptionWithContext.withContext(ex, "Error while skipping encoded value at offset 0x%x",
                startOffset);
    }
}
 
Example #27
Source File: DexBackedEncodedValue.java    From ZjDroid with Apache License 2.0 4 votes vote down vote up
@Nonnull
public static EncodedValue readFrom(@Nonnull DexReader reader) {
    int startOffset = reader.getOffset();

    try {
        int b = reader.readUbyte();
        int valueType = b & 0x1f;
        int valueArg = b >>> 5;

        switch (valueType) {
            case ValueType.BYTE:
                Preconditions.checkValueArg(valueArg, 0);
                return new ImmutableByteEncodedValue((byte)reader.readByte());
            case ValueType.SHORT:
                Preconditions.checkValueArg(valueArg, 1);
                return new ImmutableShortEncodedValue((short)reader.readSizedInt(valueArg + 1));
            case ValueType.CHAR:
                Preconditions.checkValueArg(valueArg, 1);
                return new ImmutableCharEncodedValue((char)reader.readSizedSmallUint(valueArg + 1));
            case ValueType.INT:
                Preconditions.checkValueArg(valueArg, 3);
                return new ImmutableIntEncodedValue(reader.readSizedInt(valueArg + 1));
            case ValueType.LONG:
                Preconditions.checkValueArg(valueArg, 7);
                return new ImmutableLongEncodedValue(reader.readSizedLong(valueArg + 1));
            case ValueType.FLOAT:
                Preconditions.checkValueArg(valueArg, 3);
                return new ImmutableFloatEncodedValue(Float.intBitsToFloat(
                        reader.readSizedRightExtendedInt(valueArg + 1)));
            case ValueType.DOUBLE:
                Preconditions.checkValueArg(valueArg, 7);
                return new ImmutableDoubleEncodedValue(Double.longBitsToDouble(
                        reader.readSizedRightExtendedLong(valueArg + 1)));
            case ValueType.STRING:
                Preconditions.checkValueArg(valueArg, 3);
                return new DexBackedStringEncodedValue(reader, valueArg);
            case ValueType.TYPE:
                Preconditions.checkValueArg(valueArg, 3);
                return new DexBackedTypeEncodedValue(reader, valueArg);
            case ValueType.FIELD:
                Preconditions.checkValueArg(valueArg, 3);
                return new DexBackedFieldEncodedValue(reader, valueArg);
            case ValueType.METHOD:
                Preconditions.checkValueArg(valueArg, 3);
                return new DexBackedMethodEncodedValue(reader, valueArg);
            case ValueType.ENUM:
                Preconditions.checkValueArg(valueArg, 3);
                return new DexBackedEnumEncodedValue(reader, valueArg);
            case ValueType.ARRAY:
                Preconditions.checkValueArg(valueArg, 0);
                return new DexBackedArrayEncodedValue(reader);
            case ValueType.ANNOTATION:
                Preconditions.checkValueArg(valueArg, 0);
                return new DexBackedAnnotationEncodedValue(reader);
            case ValueType.NULL:
                Preconditions.checkValueArg(valueArg, 0);
                return ImmutableNullEncodedValue.INSTANCE;
            case ValueType.BOOLEAN:
                Preconditions.checkValueArg(valueArg, 1);
                return ImmutableBooleanEncodedValue.forBoolean(valueArg == 1);
            default:
                throw new ExceptionWithContext("Invalid encoded_value type: 0x%x", valueType);
        }
    } catch (Exception ex) {
        throw ExceptionWithContext.withContext(ex, "Error while reading encoded value at offset 0x%x", startOffset);
    }
}
 
Example #28
Source File: DexBuilder.java    From zjdroid with Apache License 2.0 4 votes vote down vote up
@Override protected void writeEncodedValue(@Nonnull InternalEncodedValueWriter writer,
                                           @Nonnull BuilderEncodedValue encodedValue) throws IOException {
    switch (encodedValue.getValueType()) {
        case ValueType.ANNOTATION:
            BuilderAnnotationEncodedValue annotationEncodedValue = (BuilderAnnotationEncodedValue)encodedValue;
            writer.writeAnnotation(annotationEncodedValue.typeReference, annotationEncodedValue.elements);
            break;
        case ValueType.ARRAY:
            BuilderArrayEncodedValue arrayEncodedValue = (BuilderArrayEncodedValue)encodedValue;
            writer.writeArray(arrayEncodedValue.elements);
            break;
        case ValueType.BOOLEAN:
            writer.writeBoolean(((BooleanEncodedValue)encodedValue).getValue());
            break;
        case ValueType.BYTE:
            writer.writeByte(((ByteEncodedValue)encodedValue).getValue());
            break;
        case ValueType.CHAR:
            writer.writeChar(((CharEncodedValue)encodedValue).getValue());
            break;
        case ValueType.DOUBLE:
            writer.writeDouble(((DoubleEncodedValue)encodedValue).getValue());
            break;
        case ValueType.ENUM:
            writer.writeEnum(((BuilderEnumEncodedValue)encodedValue).getValue());
            break;
        case ValueType.FIELD:
            writer.writeField(((BuilderFieldEncodedValue)encodedValue).fieldReference);
            break;
        case ValueType.FLOAT:
            writer.writeFloat(((FloatEncodedValue)encodedValue).getValue());
            break;
        case ValueType.INT:
            writer.writeInt(((IntEncodedValue)encodedValue).getValue());
            break;
        case ValueType.LONG:
            writer.writeLong(((LongEncodedValue)encodedValue).getValue());
            break;
        case ValueType.METHOD:
            writer.writeMethod(((BuilderMethodEncodedValue)encodedValue).methodReference);
            break;
        case ValueType.NULL:
            writer.writeNull();
            break;
        case ValueType.SHORT:
            writer.writeShort(((ShortEncodedValue)encodedValue).getValue());
            break;
        case ValueType.STRING:
            writer.writeString(((BuilderStringEncodedValue)encodedValue).stringReference);
            break;
        case ValueType.TYPE:
            writer.writeType(((BuilderTypeEncodedValue)encodedValue).typeReference);
            break;
        default:
            throw new ExceptionWithContext("Unrecognized value type: %d", encodedValue.getValueType());
    }
}
 
Example #29
Source File: EncodedValueWriter.java    From HeyGirl with Apache License 2.0 4 votes vote down vote up
public void writeNull() throws IOException {
    writer.write(ValueType.NULL);
}
 
Example #30
Source File: EncodedValueWriter.java    From HeyGirl with Apache License 2.0 4 votes vote down vote up
public void writeLong(long value) throws IOException {
    writer.writeEncodedLong(ValueType.LONG, value);
}