String Id的生成
131 sections =new Section[] {
132 header,stringIds, typeIds, protoIds, fieldIds, methodIds,
133 classDefs, wordData, typeLists, stringData, byteData,
134 classData, map };
com/android/dx/dex/file/StringIdsSection.java
100 public StringIdItem intern(Stringstring) {
101 return intern(new StringIdItem(new CstString(string)));
102 }
104 /**
105 * Interns an element into this instance.
106 *
107 * @param string {@code non-null;} the string to intern, as a constant
108 * @return {@code non-null;} the interned string
109 */
110 public StringIdItem intern(CstStringstring) {
111 return intern(new StringIdItem(string));
112 }
113
114 /**
115 * Interns an element into this instance.
116 *
117 * @param string {@code non-null;} the string to intern
118 * @return {@code non-null;} the interned string
119 */
120 public StringIdItem intern(StringIdItemstring) {
121 if (string == null) {
122 throw newNullPointerException("string == null");
123 }
124
125 throwIfPrepared();
126
127 CstStringvalue = string.getValue();
128 StringIdItem already = strings.get(value);
129
130 if (already != null) {
131 return already;
132 }
133
134 strings.put(value, string);
135 return string;
136 }
StringData的生成
492 privateByteArrayAnnotatedOutput toDex0(boolean annotate,
493 boolean verbose){
500 classDefs.prepare();
501 classData.prepare();
502 wordData.prepare();
503 byteData.prepare();
504 methodIds.prepare();
505 fieldIds.prepare();
506 protoIds.prepare();
507 typeLists.prepare();
508 typeIds.prepare();
509 stringIds.prepare();
510 stringData.prepare();
511 header.prepare();
Section.java
211 public final voidprepare() {
212 throwIfPrepared();
213 prepare0();
214 prepared = true;
215 }
com/android/dx/dex/file/UniformItemSection.java
69 protected final void prepare0(){
70 DexFile file = getFile();
71
72 orderItems();
73
74 for (Item one : items()) {
75 one.addContents(file);
76 }
77 }
com/android/dx/dex/file/StringIdItem.java
86 public void addContents(DexFilefile) {
87 if (data == null) {
88 // The string data hasn't yet beenadded, so add it.
89 MixedItemSection stringData =file.getStringData();
90 data = new StringDataItem(value);
91 stringData.add(data);
92 }
93 }
com/android/dx/dex/file/StringDataItem.java
37 public StringDataItem(CstString value) {
38 super(1, writeSize(value));
39
40 this.value = value;
41 }
42
43 /**
44 * Gets the write size for a given value.
45 *
46 *@param value {@code non-null;} the string value
47 * @return {@code >= 2}; the write size, in bytes
48 */
49 private static int writeSize(CstStringvalue) {
50 int utf16Size = value.getUtf16Size();
51
52 // The +1 is for the '\0' terminationbyte.
53 returnLeb128.unsignedLeb128Size(utf16Size)
54 + value.getUtf8Size() + 1;
55 }