Skip to content

Commit ca07a0a

Browse files
authored
Fix regressions towards apktool.yml generation (#3172)
* fix: prevent blowing out minSdkVersion * fix: correct naming regression with apk name and sdk info * chore: comment for why we double up minSdkVersion * fix: deprecate compressionType * test: assert apktool format isn't regressed
1 parent ab40693 commit ca07a0a

File tree

4 files changed

+112
-17
lines changed

4 files changed

+112
-17
lines changed

brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkDecoder.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,11 @@ public void decode(File outDir) throws AndrolibException, IOException, Directory
132132
}
133133
}
134134
}
135+
136+
// In case we have no resources. We should store the minSdk we pulled from the source opcode api level
135137
ApkInfo apkInfo = resourcesDecoder.getApkInfo();
136138
if (mMinSdkVersion > 0) {
137-
apkInfo.setSdkInfo(getMinSdkInfo());
139+
apkInfo.setSdkInfoField("minSdkVersion", Integer.toString(mMinSdkVersion));
138140
}
139141

140142
copyRawFiles(outDir);
@@ -183,12 +185,6 @@ private void writeApkInfo(ApkInfo apkInfo, File outDir) throws AndrolibException
183185
}
184186
}
185187

186-
private Map<String, String> getMinSdkInfo() {
187-
Map<String, String> sdkInfo = new LinkedHashMap<>();
188-
sdkInfo.put("minSdkVersion", Integer.toString(mMinSdkVersion));
189-
return sdkInfo;
190-
}
191-
192188
private void copySourcesRaw(File outDir, String filename)
193189
throws AndrolibException {
194190
try {

brut.apktool/apktool-lib/src/main/java/brut/androlib/apk/ApkInfo.java

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,10 @@
3535
public class ApkInfo {
3636
public String version;
3737

38-
private String mApkFileName;
38+
private String apkFileName;
3939
public boolean isFrameworkApk;
4040
public UsesFramework usesFramework;
41-
private Map<String, String> mSdkInfo = new LinkedHashMap<>();
41+
private Map<String, String> sdkInfo = new LinkedHashMap<>();
4242
public PackageInfo packageInfo = new PackageInfo();
4343
public VersionInfo versionInfo = new VersionInfo();
4444
public boolean resourcesAreCompressed;
@@ -47,6 +47,9 @@ public class ApkInfo {
4747
public Map<String, String> unknownFiles;
4848
public Collection<String> doNotCompress;
4949

50+
/** @deprecated use {@link #resourcesAreCompressed} */
51+
public boolean compressionType;
52+
5053
public ApkInfo() {
5154
this.version = ApktoolProperties.getVersion();
5255
}
@@ -83,38 +86,42 @@ public String checkTargetSdkVersionBounds() {
8386
}
8487

8588
public String getApkFileName() {
86-
return mApkFileName;
89+
return apkFileName;
8790
}
8891

8992
public void setApkFileName(String apkFileName) {
90-
mApkFileName = apkFileName;
93+
this.apkFileName = apkFileName;
9194
}
9295

9396
public Map<String, String> getSdkInfo() {
94-
return mSdkInfo;
97+
return sdkInfo;
9598
}
9699

97100
public void setSdkInfo(Map<String, String> sdkInfo) {
98-
mSdkInfo = sdkInfo;
101+
this.sdkInfo = sdkInfo;
102+
}
103+
104+
public void setSdkInfoField(String key, String value) {
105+
sdkInfo.put(key, value);
99106
}
100107

101108
public String getMinSdkVersion() {
102-
return mSdkInfo.get("minSdkVersion");
109+
return sdkInfo.get("minSdkVersion");
103110
}
104111

105112
public String getMaxSdkVersion() {
106-
return mSdkInfo.get("maxSdkVersion");
113+
return sdkInfo.get("maxSdkVersion");
107114
}
108115

109116
public String getTargetSdkVersion() {
110-
return mSdkInfo.get("targetSdkVersion");
117+
return sdkInfo.get("targetSdkVersion");
111118
}
112119

113120
public int getMinSdkVersionFromAndroidCodename(String sdkVersion) {
114121
int sdkNumber = mapSdkShorthandToVersion(sdkVersion);
115122

116123
if (sdkNumber == ResConfigFlags.SDK_BASE) {
117-
return Integer.parseInt(mSdkInfo.get("minSdkVersion"));
124+
return Integer.parseInt(sdkInfo.get("minSdkVersion"));
118125
}
119126
return sdkNumber;
120127
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Copyright (C) 2010 Ryszard Wiśniewski <[email protected]>
3+
* Copyright (C) 2010 Connor Tumbleson <[email protected]>
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* https://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
package brut.androlib.yaml;
18+
19+
import brut.androlib.BaseTest;
20+
import brut.androlib.TestUtils;
21+
import brut.androlib.apk.ApkInfo;
22+
import brut.common.BrutException;
23+
import brut.directory.ExtFile;
24+
import brut.util.OS;
25+
import org.junit.BeforeClass;
26+
import org.junit.Test;
27+
import java.io.File;
28+
29+
import static org.junit.Assert.*;
30+
31+
public class ConsistentPropertyTest extends BaseTest {
32+
33+
@BeforeClass
34+
public static void beforeClass() throws Exception {
35+
TestUtils.cleanFrameworkFile();
36+
37+
sTmpDir = new ExtFile(OS.createTempDirectory());
38+
sTestNewDir = new ExtFile(sTmpDir, "yaml");
39+
LOGGER.info("Unpacking yaml files...");
40+
TestUtils.copyResourceDir(ConsistentPropertyTest.class, "decode/yaml/", sTestNewDir);
41+
}
42+
43+
@Test
44+
public void testAssertingAllKnownApkInfoProperties() throws BrutException {
45+
ApkInfo apkInfo = ApkInfo.load(new File(sTestNewDir, "basic"));
46+
47+
assertEquals("2.8.0", apkInfo.version);
48+
assertEquals("basic.apk", apkInfo.getApkFileName());
49+
assertFalse(apkInfo.isFrameworkApk);
50+
assertEquals(1, apkInfo.usesFramework.ids.size());
51+
assertEquals("tag", apkInfo.usesFramework.tag);
52+
assertEquals("4", apkInfo.getMinSdkVersion());
53+
assertEquals("22", apkInfo.getTargetSdkVersion());
54+
assertEquals("30", apkInfo.getMaxSdkVersion());
55+
assertEquals("127", apkInfo.packageInfo.forcedPackageId);
56+
assertEquals("com.test.basic", apkInfo.packageInfo.renameManifestPackage);
57+
assertEquals("71", apkInfo.versionInfo.versionCode);
58+
assertEquals("1.0.70", apkInfo.versionInfo.versionName);
59+
assertFalse(apkInfo.resourcesAreCompressed);
60+
assertFalse(apkInfo.sharedLibrary);
61+
assertTrue(apkInfo.sparseResources);
62+
assertEquals(1, apkInfo.unknownFiles.size());
63+
assertEquals(2, apkInfo.doNotCompress.size());
64+
assertFalse(apkInfo.compressionType);
65+
}
66+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
!!brut.androlib.meta.MetaInfo
2+
apkFileName: basic.apk
3+
compressionType: false
4+
doNotCompress:
5+
- resources.arsc
6+
- png
7+
isFrameworkApk: false
8+
packageInfo:
9+
forcedPackageId: '127'
10+
renameManifestPackage: 'com.test.basic'
11+
sdkInfo:
12+
minSdkVersion: '4'
13+
maxSdkVersion: '30'
14+
targetSdkVersion: '22'
15+
sharedLibrary: false
16+
sparseResources: true
17+
unknownFiles:
18+
hidden.file: 1
19+
usesFramework:
20+
ids:
21+
- 1
22+
tag: 'tag'
23+
version: 2.8.0
24+
versionInfo:
25+
versionCode: '71'
26+
versionName: 1.0.70

0 commit comments

Comments
 (0)