Skip to content

Commit 0a8a463

Browse files
committed
Sreamline decoding AndroidManifest.xml
1 parent 2610033 commit 0a8a463

File tree

1 file changed

+21
-57
lines changed

1 file changed

+21
-57
lines changed

brut.apktool/apktool-lib/src/main/java/brut/androlib/res/ResourcesDecoder.java

Lines changed: 21 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434

3535
import java.io.File;
3636
import java.io.IOException;
37+
import java.io.InputStream;
3738
import java.io.OutputStream;
3839
import java.util.Arrays;
3940
import java.util.HashMap;
@@ -104,16 +105,24 @@ public void decodeManifest(File outDir) throws AndrolibException {
104105
if (hasManifest()) {
105106
if (mConfig.decodeResources == Config.DECODE_RESOURCES_FULL ||
106107
mConfig.forceDecodeManifest == Config.FORCE_DECODE_MANIFEST_FULL) {
108+
ResTable resTable = getResTable();
109+
decodeManifest(resTable, mApkFile, outDir);
107110
if (hasResources()) {
108-
decodeManifestWithResources(getResTable(), mApkFile, outDir);
109111
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+
110123
// update apk info
111124
mApkInfo.packageInfo.forcedPackageId = String.valueOf(mResTable.getPackageId());
112125
}
113-
} else {
114-
// if there's no resources.arsc, decode the manifest without looking
115-
// up attribute references
116-
decodeManifest(getResTable(), mApkFile, outDir);
117126
}
118127
}
119128
else {
@@ -130,60 +139,27 @@ public void decodeManifest(File outDir) throws AndrolibException {
130139
private void decodeManifest(ResTable resTable, ExtFile apkFile, File outDir)
131140
throws AndrolibException {
132141

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();
139144
attrDecoder.setResTable(resTable);
145+
axmlParser.setAttrDecoder(attrDecoder);
140146

147+
XmlPullStreamDecoder fileDecoder = new XmlPullStreamDecoder(axmlParser, getResXmlSerializer());
141148
Directory inApk, out;
142149
try {
143150
inApk = apkFile.getDirectory();
144151
out = new FileDirectory(outDir);
145152

146153
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);
148157

149158
} catch (DirectoryException ex) {
150159
throw new AndrolibException(ex);
151160
}
152161
}
153162

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-
187163
private void adjustPackageManifest(ResTable resTable, String filePath)
188164
throws AndrolibException {
189165

@@ -208,18 +184,6 @@ private void adjustPackageManifest(ResTable resTable, String filePath)
208184
}
209185
}
210186

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-
223187
private ExtMXSerializer getResXmlSerializer() {
224188
ExtMXSerializer serial = new ExtMXSerializer();
225189
serial.setProperty(ExtXmlSerializer.PROPERTY_SERIALIZER_INDENTATION, " ");

0 commit comments

Comments
 (0)