1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* 2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License. 6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at 7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and 14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License. 15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage com.android.dx.dex.file; 18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.Annotation; 20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.AnnotationVisibility; 21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.annotation.NameValuePair; 22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.Constant; 23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstAnnotation; 24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstArray; 25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.rop.cst.CstUtf8; 26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.ByteArrayAnnotatedOutput; 27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport com.android.dx.util.AnnotatedOutput; 28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Arrays; 30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Comparator; 31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/** 33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Single annotation, which consists of a type and a set of name-value 34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * element pairs. 35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic final class AnnotationItem extends OffsettedItem { 37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** annotation visibility constant: visible at build time only */ 38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final int VISIBILITY_BUILD = 0; 39de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** annotation visibility constant: visible at runtime */ 41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final int VISIBILITY_RUNTIME = 1; 42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** annotation visibility constant: visible at runtime only to system */ 44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final int VISIBILITY_SYSTEM = 2; 45de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** the required alignment for instances of this class */ 47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final int ALIGNMENT = 1; 48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 4999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} unique instance of {@link #TypeIdSorter} */ 50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static final TypeIdSorter TYPE_ID_SORTER = new TypeIdSorter(); 51de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 5299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project /** {@code non-null;} the annotation to represent */ 53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private final Annotation annotation; 54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 5699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null-ok;} type reference for the annotation type; set during 57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link #addContents} 58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private TypeIdItem type; 60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 6299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * {@code null-ok;} encoded form, ready for writing to a file; set during 63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * {@link #place0} 64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private byte[] encodedForm; 66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Comparator that sorts (outer) instances by type id index. 69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project private static class TypeIdSorter implements Comparator<AnnotationItem> { 71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int compare(AnnotationItem item1, AnnotationItem item2) { 73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int index1 = item1.type.getIndex(); 74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project int index2 = item2.type.getIndex(); 75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (index1 < index2) { 77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return -1; 78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else if (index1 > index2) { 79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 1; 80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return 0; 83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Sorts an array of instances, in place, by type id index, 88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * ignoring all other aspects of the elements. This is only valid 89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to use after type id indices are known. 90de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 9199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param array {@code non-null;} array to sort 92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public static void sortByTypeIdIndex(AnnotationItem[] array) { 94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Arrays.sort(array, TYPE_ID_SORTER); 95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Constructs an instance. 99de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 10099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param annotation {@code non-null;} annotation to represent 101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public AnnotationItem(Annotation annotation) { 103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The write size isn't known up-front because (the variable-lengthed) 105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * leb128 type is used to represent some things. 106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project super(ALIGNMENT, -1); 108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (annotation == null) { 110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new NullPointerException("annotation == null"); 111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.annotation = annotation; 114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.type = null; 115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project this.encodedForm = null; 116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public ItemType itemType() { 121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return ItemType.TYPE_ANNOTATION_ITEM; 122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public int hashCode() { 127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return annotation.hashCode(); 128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected int compareTo0(OffsettedItem other) { 133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AnnotationItem otherAnnotation = (AnnotationItem) other; 134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return annotation.compareTo(otherAnnotation.annotation); 136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public String toHuman() { 141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project return annotation.toHuman(); 142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void addContents(DexFile file) { 146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project type = file.getTypeIds().intern(annotation.getType()); 147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ValueEncoder.addContents(file, annotation); 148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected void place0(Section addedTo, int offset) { 153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Encode the data and note the size. 154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ByteArrayAnnotatedOutput out = new ByteArrayAnnotatedOutput(); 156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ValueEncoder encoder = new ValueEncoder(addedTo.getFile(), out); 157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project encoder.writeAnnotation(annotation, false); 159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project encodedForm = out.toByteArray(); 160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // Add one for the visibility byte in front of the encoded annotation. 162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project setWriteSize(encodedForm.length + 1); 163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** 166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Write a (listing file) annotation for this instance to the given 167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * output, that consumes no bytes of output. This is for annotating 168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a reference to this instance at the point of the reference. 169de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro * 17099409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param out {@code non-null;} where to output to 17199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project * @param prefix {@code non-null;} prefix for each line of output 172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project public void annotateTo(AnnotatedOutput out, String prefix) { 174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(0, prefix + "visibility: " + 175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project annotation.getVisibility().toHuman()); 176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(0, prefix + "type: " + annotation.getType().toHuman()); 177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project for (NameValuePair pair : annotation.getNameValuePairs()) { 179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project CstUtf8 name = pair.getName(); 180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project Constant value = pair.getValue(); 181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(0, prefix + name.toHuman() + ": " + 183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ValueEncoder.constantToHuman(value)); 184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /** {@inheritDoc} */ 188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project @Override 189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project protected void writeTo0(DexFile file, AnnotatedOutput out) { 190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project boolean annotates = out.annotates(); 191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project AnnotationVisibility visibility = annotation.getVisibility(); 192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (annotates) { 194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(0, offsetString() + " annotation"); 195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.annotate(1, " visibility: VISBILITY_" + visibility); 196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project 198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project switch (visibility) { 199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case BUILD: out.writeByte(VISIBILITY_BUILD); break; 200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case RUNTIME: out.writeByte(VISIBILITY_RUNTIME); break; 201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project case SYSTEM: out.writeByte(VISIBILITY_SYSTEM); break; 202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project default: { 203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project // EMBEDDED shouldn't appear at the top level. 204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project throw new RuntimeException("shouldn't happen"); 205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 207de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro 208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project if (annotates) { 209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project /* 210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The output is to be annotated, so redo the work previously 211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * done by place0(), except this time annotations will actually 212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * get emitted. 213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */ 214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project ValueEncoder encoder = new ValueEncoder(file, out); 215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project encoder.writeAnnotation(annotation, true); 216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } else { 217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project out.write(encodedForm); 218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project } 220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project} 221