Skip to content

Commit 22a5816

Browse files
committed
Detect incompatible apk for merging
1 parent 4fa8e67 commit 22a5816

File tree

2 files changed

+60
-5
lines changed

2 files changed

+60
-5
lines changed

src/main/java/com/reandroid/apk/ApkBundle.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ public ApkBundle(){
3333
}
3434

3535
public ApkModule mergeModules() throws IOException {
36+
return mergeModules(false);
37+
}
38+
public ApkModule mergeModules(boolean force) throws IOException {
3639
List<ApkModule> moduleList=getApkModuleList();
3740
if(moduleList.size()==0){
3841
throw new FileNotFoundException("Nothing to merge, empty modules");
@@ -45,7 +48,7 @@ public ApkModule mergeModules() throws IOException {
4548
if(base == null){
4649
base = getLargestTableModule();
4750
}
48-
result.merge(base);
51+
result.merge(base, force);
4952
ApkSignatureBlock signatureBlock = null;
5053
for(ApkModule module:moduleList){
5154
ApkSignatureBlock asb = module.getApkSignatureBlock();
@@ -58,7 +61,7 @@ public ApkModule mergeModules() throws IOException {
5861
if(signatureBlock == null){
5962
signatureBlock = asb;
6063
}
61-
result.merge(module);
64+
result.merge(module, force);
6265
}
6366

6467
result.setApkSignatureBlock(signatureBlock);

src/main/java/com/reandroid/apk/ApkModule.java

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,16 @@ private List<Entry> filterResFileEntries(TableString tableString, int resourceId
661661
});
662662
return CollectionUtil.toList(itr);
663663
}
664+
public int getVersionCode() {
665+
AndroidManifestBlock manifestBlock = getAndroidManifest();
666+
if(manifestBlock != null) {
667+
Integer versionCode = manifestBlock.getVersionCode();
668+
if(versionCode != null) {
669+
return versionCode;
670+
}
671+
}
672+
return 0;
673+
}
664674
public String getPackageName(){
665675
if(hasAndroidManifest()){
666676
return getAndroidManifest().getPackageName();
@@ -1141,20 +1151,62 @@ public void setLoadDefaultFramework(boolean loadDefaultFramework) {
11411151
}
11421152

11431153
public void merge(ApkModule module) throws IOException {
1144-
if(module==null||module==this){
1154+
merge(module, false);
1155+
}
1156+
public void merge(ApkModule module, boolean force) throws IOException {
1157+
if(module == null || module == this){
11451158
return;
11461159
}
1147-
logMessage("Merging: "+module.getModuleName());
1160+
logMessage("Merging: " + module.getModuleName());
1161+
validateMerge(module, force);
11481162
mergeDexFiles(module);
11491163
mergeTable(module);
11501164
mergeFiles(module);
11511165
getUncompressedFiles().merge(module.getUncompressedFiles());
11521166
}
1167+
private void validateMerge(ApkModule apkModule, boolean force) throws IOException{
1168+
if(!hasTableBlock()) {
1169+
return;
1170+
}
1171+
String packageName = getPackageName();
1172+
int code = getVersionCode();
1173+
if(packageName == null || code == 0) {
1174+
return;
1175+
}
1176+
String packageName2 = apkModule.getPackageName();
1177+
int code2 = apkModule.getVersionCode();
1178+
if(packageName2 == null || code2 == 0) {
1179+
return;
1180+
}
1181+
if(!packageName.equals(packageName2)) {
1182+
return;
1183+
}
1184+
if(code == code2) {
1185+
return;
1186+
}
1187+
StringBuilder builder = new StringBuilder();
1188+
if(!force) {
1189+
builder.append("WARN: ");
1190+
}
1191+
builder.append("Incompatible to merge: {");
1192+
builder.append(packageName);
1193+
builder.append(", ");
1194+
builder.append(code);
1195+
builder.append("}, with {");
1196+
builder.append(packageName2);
1197+
builder.append(", ");
1198+
builder.append(code2);
1199+
builder.append("}");
1200+
String msg = builder.toString();
1201+
if(force) {
1202+
throw new IOException(msg);
1203+
}
1204+
logMessage(msg);
1205+
}
11531206
private void mergeTable(ApkModule module) {
11541207
if(!module.hasTableBlock()){
11551208
return;
11561209
}
1157-
logMessage("Merging resource table: "+module.getModuleName());
11581210
TableBlock exist;
11591211
if(!hasTableBlock()){
11601212
exist=new TableBlock();

0 commit comments

Comments
 (0)