Search in sources :

Example 1 with ByteArrayAnnotatedOutput

use of com.taobao.android.dx.util.ByteArrayAnnotatedOutput in project atlas by alibaba.

the class ClassDataItem method place0.

/** {@inheritDoc} */
@Override
protected void place0(Section addedTo, int offset) {
    // Encode the data and note the size.
    ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput();
    encodeOutput(addedTo.getFile(), out);
    encodedForm = out.toByteArray();
    setWriteSize(encodedForm.length);
}
Also used : ByteArrayAnnotatedOutput(com.taobao.android.dx.util.ByteArrayAnnotatedOutput)

Example 2 with ByteArrayAnnotatedOutput

use of com.taobao.android.dx.util.ByteArrayAnnotatedOutput in project atlas by alibaba.

the class AnnotationItem method place0.

/** {@inheritDoc} */
@Override
protected void place0(Section addedTo, int offset) {
    // Encode the data and note the size.
    ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput();
    ValueEncoder encoder = new ValueEncoder(addedTo.getFile(), out);
    encoder.writeAnnotation(annotation, false);
    encodedForm = out.toByteArray();
    // Add one for the visibility byte in front of the encoded annotation.
    setWriteSize(encodedForm.length + 1);
}
Also used : ByteArrayAnnotatedOutput(com.taobao.android.dx.util.ByteArrayAnnotatedOutput)

Example 3 with ByteArrayAnnotatedOutput

use of com.taobao.android.dx.util.ByteArrayAnnotatedOutput in project atlas by alibaba.

the class IndexMap method adjustEncodedArray.

public EncodedValue adjustEncodedArray(EncodedValue encodedArray) {
    ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput(32);
    new EncodedValueTransformer(out).transformArray(new EncodedValueReader(encodedArray, ENCODED_ARRAY));
    return new EncodedValue(out.toByteArray());
}
Also used : EncodedValue(com.taobao.android.dex.EncodedValue) EncodedValueReader(com.taobao.android.dex.EncodedValueReader) ByteArrayAnnotatedOutput(com.taobao.android.dx.util.ByteArrayAnnotatedOutput)

Example 4 with ByteArrayAnnotatedOutput

use of com.taobao.android.dx.util.ByteArrayAnnotatedOutput in project atlas by alibaba.

the class DexFile method toDex.

/**
     * Returns the contents of this instance as a {@code .dex} file,
     * in {@code byte[]} form.
     *
     * @param humanOut {@code null-ok;} where to write human-oriented output to
     * @param verbose whether to be verbose when writing human-oriented output
     * @return {@code non-null;} a {@code .dex} file for this instance
     */
public byte[] toDex(Writer humanOut, boolean verbose) throws IOException {
    boolean annotate = (humanOut != null);
    ByteArrayAnnotatedOutput result = toDex0(annotate, verbose);
    if (annotate) {
        result.writeAnnotationsTo(humanOut);
    }
    return result.getArray();
}
Also used : ByteArrayAnnotatedOutput(com.taobao.android.dx.util.ByteArrayAnnotatedOutput)

Example 5 with ByteArrayAnnotatedOutput

use of com.taobao.android.dx.util.ByteArrayAnnotatedOutput in project atlas by alibaba.

the class DexFile method toDex0.

/**
     * Returns the contents of this instance as a {@code .dex} file,
     * in a {@link ByteArrayAnnotatedOutput} instance.
     *
     * @param annotate whether or not to keep annotations
     * @param verbose if annotating, whether to be verbose
     * @return {@code non-null;} a {@code .dex} file for this instance
     */
private ByteArrayAnnotatedOutput toDex0(boolean annotate, boolean verbose) {
    /*
         * The following is ordered so that the prepare() calls which
         * add items happen before the calls to the sections that get
         * added to.
         */
    classDefs.prepare();
    classData.prepare();
    wordData.prepare();
    byteData.prepare();
    methodIds.prepare();
    fieldIds.prepare();
    protoIds.prepare();
    typeLists.prepare();
    typeIds.prepare();
    stringIds.prepare();
    stringData.prepare();
    header.prepare();
    // Place the sections within the file.
    int count = sections.length;
    int offset = 0;
    for (int i = 0; i < count; i++) {
        Section one = sections[i];
        int placedAt = one.setFileOffset(offset);
        if (placedAt < offset) {
            throw new RuntimeException("bogus placement for section " + i);
        }
        try {
            if (one == map) {
                /*
                     * Inform the map of all the sections, and add it
                     * to the file. This can only be done after all
                     * the other items have been sorted and placed.
                     */
                MapItem.addMap(sections, map);
                map.prepare();
            }
            if (one instanceof MixedItemSection) {
                /*
                     * Place the items of a MixedItemSection that just
                     * got placed.
                     */
                ((MixedItemSection) one).placeItems();
            }
            offset = placedAt + one.writeSize();
        } catch (RuntimeException ex) {
            throw ExceptionWithContext.withContext(ex, "...while writing section " + i);
        }
    }
    // Write out all the sections.
    fileSize = offset;
    byte[] barr = new byte[fileSize];
    ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput(barr);
    if (annotate) {
        out.enableAnnotations(dumpWidth, verbose);
    }
    for (int i = 0; i < count; i++) {
        try {
            Section one = sections[i];
            int zeroCount = one.getFileOffset() - out.getCursor();
            if (zeroCount < 0) {
                throw new ExceptionWithContext("excess write of " + (-zeroCount));
            }
            out.writeZeroes(one.getFileOffset() - out.getCursor());
            one.writeTo(out);
        } catch (RuntimeException ex) {
            ExceptionWithContext ec;
            if (ex instanceof ExceptionWithContext) {
                ec = (ExceptionWithContext) ex;
            } else {
                ec = new ExceptionWithContext(ex);
            }
            ec.addContext("...while writing section " + i);
            throw ec;
        }
    }
    if (out.getCursor() != fileSize) {
        throw new RuntimeException("foreshortened write");
    }
    // Perform final bookkeeping.
    calcSignature(barr);
    calcChecksum(barr);
    if (annotate) {
        wordData.writeIndexAnnotation(out, ItemType.TYPE_CODE_ITEM, "\nmethod code index:\n\n");
        getStatistics().writeAnnotation(out);
        out.finishAnnotating();
    }
    return out;
}
Also used : ExceptionWithContext(com.taobao.android.dex.util.ExceptionWithContext) ByteArrayAnnotatedOutput(com.taobao.android.dx.util.ByteArrayAnnotatedOutput)

Aggregations

ByteArrayAnnotatedOutput (com.taobao.android.dx.util.ByteArrayAnnotatedOutput)10 EncodedValue (com.taobao.android.dex.EncodedValue)3 EncodedValueReader (com.taobao.android.dex.EncodedValueReader)2 Annotation (com.taobao.android.dex.Annotation)1 ExceptionWithContext (com.taobao.android.dex.util.ExceptionWithContext)1 CatchHandlerList (com.taobao.android.dx.dex.code.CatchHandlerList)1 Map (java.util.Map)1 TreeMap (java.util.TreeMap)1