}
if (multiDex && numThreads != 1) {
- System.out.println(NUM_THREADS_OPTION + "is ignored when used with "
+ System.out.println(NUM_THREADS_OPTION + " is ignored when used with "
+ MULTI_DEX_OPTION);
+ numThreads = 1;
}
if (multiDex && incremental) {
ConstantPool constantPool = cf.getConstantPool();
int constantPoolSize = constantPool.size();
- synchronized (dexFile) {
- for (int i = 0; i < constantPoolSize; i++) {
- Constant constant = constantPool.getOrNull(i);
- if (constant instanceof CstMethodRef) {
- methodIdsSection.intern((CstBaseMethodRef) constant);
- } else if (constant instanceof CstInterfaceMethodRef) {
- methodIdsSection.intern(((CstInterfaceMethodRef) constant).toMethodRef());
- } else if (constant instanceof CstFieldRef) {
- fieldIdsSection.intern((CstFieldRef) constant);
- } else if (constant instanceof CstEnumRef) {
- fieldIdsSection.intern(((CstEnumRef) constant).getFieldRef());
- } else if (constant instanceof CstType) {
- typeIdsSection.intern((CstType) constant);
- }
+ for (int i = 0; i < constantPoolSize; i++) {
+ Constant constant = constantPool.getOrNull(i);
+ if (constant instanceof CstMethodRef) {
+ methodIdsSection.intern((CstBaseMethodRef) constant);
+ } else if (constant instanceof CstInterfaceMethodRef) {
+ methodIdsSection.intern(((CstInterfaceMethodRef) constant).toMethodRef());
+ } else if (constant instanceof CstFieldRef) {
+ fieldIdsSection.intern((CstFieldRef) constant);
+ } else if (constant instanceof CstEnumRef) {
+ fieldIdsSection.intern(((CstEnumRef) constant).getFieldRef());
+ } else if (constant instanceof CstType) {
+ typeIdsSection.intern((CstType) constant);
}
}
if (annotations.size() != 0) {
out.addFieldAnnotations(field, annotations);
}
- synchronized (fieldIdsSection) {
- fieldIdsSection.intern(field);
- }
+ fieldIdsSection.intern(field);
} catch (RuntimeException ex) {
String msg = "...while processing " + one.getName().toHuman() +
" " + one.getDescriptor().toHuman();
if (list.size() != 0) {
out.addParameterAnnotations(meth, list);
}
- synchronized (methodIds) {
- methodIds.intern(meth);
- }
+ methodIds.intern(meth);
} catch (RuntimeException ex) {
String msg = "...while processing " + one.getName().toHuman() +
" " + one.getDescriptor().toHuman();
import com.android.dx.rop.cst.CstFieldRef;
import com.android.dx.util.AnnotatedOutput;
import com.android.dx.util.Hex;
+
import java.util.Collection;
import java.util.TreeMap;
* @param field {@code non-null;} the reference to intern
* @return {@code non-null;} the interned reference
*/
- public FieldIdItem intern(CstFieldRef field) {
+ public synchronized FieldIdItem intern(CstFieldRef field) {
if (field == null) {
throw new NullPointerException("field == null");
}
import com.android.dx.rop.cst.CstBaseMethodRef;
import com.android.dx.util.AnnotatedOutput;
import com.android.dx.util.Hex;
+
import java.util.Collection;
import java.util.TreeMap;
* @param method {@code non-null;} the reference to intern
* @return {@code non-null;} the interned reference
*/
- public MethodIdItem intern(CstBaseMethodRef method) {
+ public synchronized MethodIdItem intern(CstBaseMethodRef method) {
if (method == null) {
throw new NullPointerException("method == null");
}
* @param type {@code non-null;} the type to intern
* @return {@code non-null;} the interned reference
*/
- public TypeIdItem intern(CstType type) {
+ public synchronized TypeIdItem intern(CstType type) {
if (type == null) {
throw new NullPointerException("type == null");
}
import com.android.dex.SizeOf;
import com.android.dex.TableOfContents;
import com.android.dex.TypeList;
+
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
+ contents.methodIds.size * SizeOf.MEMBER_ID_ITEM
+ contents.classDefs.size * SizeOf.CLASS_DEF_ITEM;
mapList = SizeOf.UINT + (contents.sections.length * SizeOf.MAP_ITEM);
- typeList += contents.typeLists.byteCount;
+ typeList += fourByteAlign(contents.typeLists.byteCount); // We count each dex's
+ // typelists section as realigned on 4 bytes, because each typelist of each dex's
+ // typelists section is aligned on 4 bytes. If we didn't, there is a case where each
+ // size of both dex's typelists section is a multiple of 2 but not a multiple of 4,
+ // and the sum of both sizes is a multiple of 4 but would not be sufficient to write
+ // each typelist aligned on 4 bytes.
stringData += contents.stringDatas.byteCount;
annotationsDirectory += contents.annotationsDirectories.byteCount;
annotationsSet += contents.annotationSets.byteCount;
* Pre-created .odex absent or stale. Look inside the jar for a
* "classes.dex".
*/
- if ((entry = dexZipFindEntry(&archive, kDexInJarName)) != NULL) {
+ entry = dexZipFindEntry(&archive, kDexInJarName);
+ if (entry != NULL) {
bool newFile = false;
/*