34
34
35
35
import java .io .File ;
36
36
import java .io .IOException ;
37
+ import java .io .InputStream ;
37
38
import java .io .OutputStream ;
38
39
import java .util .Arrays ;
39
40
import java .util .HashMap ;
@@ -104,16 +105,24 @@ public void decodeManifest(File outDir) throws AndrolibException {
104
105
if (hasManifest ()) {
105
106
if (mConfig .decodeResources == Config .DECODE_RESOURCES_FULL ||
106
107
mConfig .forceDecodeManifest == Config .FORCE_DECODE_MANIFEST_FULL ) {
108
+ ResTable resTable = getResTable ();
109
+ decodeManifest (resTable , mApkFile , outDir );
107
110
if (hasResources ()) {
108
- decodeManifestWithResources (getResTable (), mApkFile , outDir );
109
111
if (!mConfig .analysisMode ) {
112
+ // Remove versionName / versionCode (aapt API 16)
113
+ //
114
+ // check for a mismatch between resources.arsc package and the package listed in AndroidManifest
115
+ // also remove the android::versionCode / versionName from manifest for rebuild
116
+ // this is a required change to prevent aapt warning about conflicting versions
117
+ // it will be passed as a parameter to aapt like "--min-sdk-version" via apktool.yml
118
+ adjustPackageManifest (resTable , outDir .getAbsolutePath () + File .separator + "AndroidManifest.xml" );
119
+
120
+ ResXmlPatcher .removeManifestVersions (new File (
121
+ outDir .getAbsolutePath () + File .separator + "AndroidManifest.xml" ));
122
+
110
123
// update apk info
111
124
mApkInfo .packageInfo .forcedPackageId = String .valueOf (mResTable .getPackageId ());
112
125
}
113
- } else {
114
- // if there's no resources.arsc, decode the manifest without looking
115
- // up attribute references
116
- decodeManifest (getResTable (), mApkFile , outDir );
117
126
}
118
127
}
119
128
else {
@@ -130,60 +139,27 @@ public void decodeManifest(File outDir) throws AndrolibException {
130
139
private void decodeManifest (ResTable resTable , ExtFile apkFile , File outDir )
131
140
throws AndrolibException {
132
141
133
- Duo <ResFileDecoder , AXmlResourceParser > duo = getManifestFileDecoder (false );
134
- ResFileDecoder fileDecoder = duo .m1 ;
135
-
136
- // Set ResAttrDecoder
137
- duo .m2 .setAttrDecoder (new ResAttrDecoder ());
138
- ResAttrDecoder attrDecoder = duo .m2 .getAttrDecoder ();
142
+ AXmlResourceParser axmlParser = new AndroidManifestResourceParser ();
143
+ ResAttrDecoder attrDecoder = new ResAttrDecoder ();
139
144
attrDecoder .setResTable (resTable );
145
+ axmlParser .setAttrDecoder (attrDecoder );
140
146
147
+ XmlPullStreamDecoder fileDecoder = new XmlPullStreamDecoder (axmlParser , getResXmlSerializer ());
141
148
Directory inApk , out ;
142
149
try {
143
150
inApk = apkFile .getDirectory ();
144
151
out = new FileDirectory (outDir );
145
152
146
153
LOGGER .info ("Decoding AndroidManifest.xml with only framework resources..." );
147
- fileDecoder .decodeManifest (inApk , "AndroidManifest.xml" , out , "AndroidManifest.xml" );
154
+ InputStream inputStream = inApk .getFileInput ("AndroidManifest.xml" );
155
+ OutputStream outputStream = out .getFileOutput ("AndroidManifest.xml" );
156
+ fileDecoder .decodeManifest (inputStream , outputStream );
148
157
149
158
} catch (DirectoryException ex ) {
150
159
throw new AndrolibException (ex );
151
160
}
152
161
}
153
162
154
- private void decodeManifestWithResources (ResTable resTable , ExtFile apkFile , File outDir )
155
- throws AndrolibException {
156
-
157
- Duo <ResFileDecoder , AXmlResourceParser > duo = getManifestFileDecoder (true );
158
- ResFileDecoder fileDecoder = duo .m1 ;
159
- ResAttrDecoder attrDecoder = duo .m2 .getAttrDecoder ();
160
- attrDecoder .setResTable (resTable );
161
-
162
- Directory inApk , out ;
163
- try {
164
- inApk = apkFile .getDirectory ();
165
- out = new FileDirectory (outDir );
166
- LOGGER .info ("Decoding AndroidManifest.xml with resources..." );
167
-
168
- fileDecoder .decodeManifest (inApk , "AndroidManifest.xml" , out , "AndroidManifest.xml" );
169
-
170
- // Remove versionName / versionCode (aapt API 16)
171
- if (!mConfig .analysisMode ) {
172
-
173
- // check for a mismatch between resources.arsc package and the package listed in AndroidManifest
174
- // also remove the android::versionCode / versionName from manifest for rebuild
175
- // this is a required change to prevent aapt warning about conflicting versions
176
- // it will be passed as a parameter to aapt like "--min-sdk-version" via apktool.yml
177
- adjustPackageManifest (resTable , outDir .getAbsolutePath () + File .separator + "AndroidManifest.xml" );
178
-
179
- ResXmlPatcher .removeManifestVersions (new File (
180
- outDir .getAbsolutePath () + File .separator + "AndroidManifest.xml" ));
181
- }
182
- } catch (DirectoryException ex ) {
183
- throw new AndrolibException (ex );
184
- }
185
- }
186
-
187
163
private void adjustPackageManifest (ResTable resTable , String filePath )
188
164
throws AndrolibException {
189
165
@@ -208,18 +184,6 @@ private void adjustPackageManifest(ResTable resTable, String filePath)
208
184
}
209
185
}
210
186
211
- private Duo <ResFileDecoder , AXmlResourceParser > getManifestFileDecoder (boolean withResources ) {
212
- ResStreamDecoderContainer decoders = new ResStreamDecoderContainer ();
213
-
214
- AXmlResourceParser axmlParser = new AndroidManifestResourceParser ();
215
- if (withResources ) {
216
- axmlParser .setAttrDecoder (new ResAttrDecoder ());
217
- }
218
- decoders .setDecoder ("xml" , new XmlPullStreamDecoder (axmlParser , getResXmlSerializer ()));
219
-
220
- return new Duo <>(new ResFileDecoder (decoders ), axmlParser );
221
- }
222
-
223
187
private ExtMXSerializer getResXmlSerializer () {
224
188
ExtMXSerializer serial = new ExtMXSerializer ();
225
189
serial .setProperty (ExtXmlSerializer .PROPERTY_SERIALIZER_INDENTATION , " " );
0 commit comments