Skip to content

Commit 5dfe633

Browse files
committed
Generate test apk with multi-container dex file V041
1 parent b74967d commit 5dfe633

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

src/test/java/com/reandroid/apk/ApkModuleTest.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import com.reandroid.arsc.chunk.xml.ResXmlAttribute;
1313
import com.reandroid.arsc.chunk.xml.ResXmlDocument;
1414
import com.reandroid.arsc.chunk.xml.ResXmlElement;
15+
import com.reandroid.arsc.coder.CoderDimension;
1516
import com.reandroid.arsc.coder.EncodeResult;
1617
import com.reandroid.arsc.coder.ValueCoder;
1718
import com.reandroid.arsc.io.BlockReader;
@@ -40,6 +41,9 @@
4041

4142
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
4243
public class ApkModuleTest {
44+
45+
public static final boolean TEST_WITH_MULTI_LAYOUT_DEX_V041 = true;
46+
4347
private static ApkModule last_apkModule;
4448
@Test
4549
public void a_testApkModule() throws IOException {
@@ -91,7 +95,10 @@ public ApkModule createApkModule() throws IOException {
9195
String appClass = manifestBlock.getApplicationClassName();
9296
String mainActivity = manifestBlock.getMainActivityClassName();
9397

94-
DexFile dexFile = SampleDexFileCreator.createApplicationClass(appClass, mainActivity, mainActivityLayoutId);
98+
DexFile dexFile = SampleDexFileCreator.createApplicationClass(
99+
TEST_WITH_MULTI_LAYOUT_DEX_V041,
100+
appClass, mainActivity, mainActivityLayoutId);
101+
95102
byte[] bytes = dexFile.getBytes();
96103
apkModule.add(new ByteInputSource(bytes, "classes.dex"));
97104
apkModule.getUncompressedFiles().addPath(apkModule.getZipEntryMap());
@@ -120,6 +127,9 @@ private int createMainActivityContentViewXml(ApkModule apkModule){
120127
attribute = root.getOrCreateAndroidAttribute("orientation", 0x010100c4);
121128
attribute.setTypeAndData(ValueType.DEC, 1); // vertical
122129

130+
attribute = root.getOrCreateAndroidAttribute("padding", 0x010100d5);
131+
attribute.setValue(CoderDimension.INS.encode("20.0dp"));
132+
123133
ResXmlElement textView = root.newElement("TextView");
124134
attribute = textView.getOrCreateAndroidAttribute("layout_width", 0x010100f4);
125135
attribute.setTypeAndData(ValueType.DEC, -1); // wrap_content
@@ -462,13 +472,17 @@ private AndroidManifestBlock createManifest() throws IOException {
462472

463473
manifestBlock.setCompileSdkVersion(frameworkApk.getVersionCode());
464474
manifestBlock.setCompileSdkVersionCodename(frameworkApk.getVersionName());
465-
manifestBlock.setCompileSdk(AndroidApiLevel.O);
475+
AndroidApiLevel apiLevel = AndroidApiLevel.O;
476+
if (TEST_WITH_MULTI_LAYOUT_DEX_V041) {
477+
apiLevel = AndroidApiLevel.VANILLA_ICE_CREAM;
478+
}
479+
manifestBlock.setCompileSdk(apiLevel);
466480

467481
manifestBlock.setPlatformBuildVersionCode(frameworkApk.getVersionCode());
468482
manifestBlock.setPlatformBuildVersionName(frameworkApk.getVersionName());
469-
manifestBlock.setPlatformBuild(AndroidApiLevel.O);
470-
manifestBlock.setMinSdkVersion(AndroidApiLevel.O.getApi());
471-
manifestBlock.setTargetSdkVersion(AndroidApiLevel.O.getApi());
483+
manifestBlock.setPlatformBuild(apiLevel);
484+
manifestBlock.setMinSdkVersion(apiLevel.getApi());
485+
manifestBlock.setTargetSdkVersion(apiLevel.getApi());
472486

473487
manifestBlock.addUsesPermission("android.permission.INTERNET");
474488
manifestBlock.addUsesPermission("android.permission.READ_EXTERNAL_STORAGE");

src/test/java/com/reandroid/dex/SampleDexFileCreator.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,17 @@
1111
public class SampleDexFileCreator {
1212

1313
public static DexFile createApplicationClass(String appSourceName, String activitySourceName, int contentViewResourceId) throws IOException {
14+
return createApplicationClass(false, appSourceName, activitySourceName, contentViewResourceId);
15+
}
16+
public static DexFile createApplicationClass(boolean multiContainerDex, String appSourceName, String activitySourceName, int contentViewResourceId) throws IOException {
1417
DexFile dexFile = DexFile.createDefault();
1518
createApplicationClass(dexFile, appSourceName);
16-
createActivityClass(dexFile, activitySourceName, contentViewResourceId);
19+
int i = 0;
20+
if (multiContainerDex) {
21+
dexFile.setVersion(41);
22+
i = 1;
23+
}
24+
createActivityClass(dexFile.getOrCreateAt(i), activitySourceName, contentViewResourceId);
1725
dexFile.clearUnused();
1826
dexFile.clearEmptySections();
1927
dexFile.refreshFull();
@@ -31,8 +39,9 @@ private static void createApplicationClass(DexFile dexFile, String classSourceNa
3139

3240
createConstructor(dexClass);
3341
}
34-
private static void createActivityClass(DexFile dexFile, String activitySourceName, int contentViewResourceId) throws IOException {
35-
DexClass dexClass = dexFile.getOrCreateFirst().getOrCreateClass(TypeKey.parse(activitySourceName));
42+
private static void createActivityClass(DexLayout dexLayout, String activitySourceName, int contentViewResourceId) throws IOException {
43+
44+
DexClass dexClass = dexLayout.getOrCreateClass(TypeKey.parse(activitySourceName));
3645
dexClass.addAccessFlag(AccessFlag.PUBLIC);
3746
dexClass.setSuperClass(TypeKey.create("Landroid/app/Activity;"));
3847

0 commit comments

Comments
 (0)