implement json conversion on StagedAlias

This commit is contained in:
REAndroid 2022-12-29 12:08:01 -05:00
parent 33817b36d8
commit e841b12f03
4 changed files with 83 additions and 8 deletions

View File

@ -21,10 +21,13 @@
import com.reandroid.lib.arsc.io.BlockReader; import com.reandroid.lib.arsc.io.BlockReader;
import com.reandroid.lib.arsc.item.IntegerItem; import com.reandroid.lib.arsc.item.IntegerItem;
import com.reandroid.lib.arsc.value.StagedAliasEntry; import com.reandroid.lib.arsc.value.StagedAliasEntry;
import com.reandroid.lib.json.JSONArray;
import com.reandroid.lib.json.JSONConvert;
import java.io.IOException; import java.io.IOException;
public class StagedAliasEntryArray extends BlockArray<StagedAliasEntry> implements BlockLoad { public class StagedAliasEntryArray extends BlockArray<StagedAliasEntry>
implements BlockLoad, JSONConvert<JSONArray> {
private final IntegerItem count; private final IntegerItem count;
public StagedAliasEntryArray(IntegerItem count){ public StagedAliasEntryArray(IntegerItem count){
super(); super();
@ -57,4 +60,29 @@
private void updateCount(){ private void updateCount(){
this.count.set(childesCount()); this.count.set(childesCount());
} }
@Override
public JSONArray toJson() {
StagedAliasEntry[] childes=getChildes();
if(childes==null||childes.length==0){
return null;
}
JSONArray jsonArray=new JSONArray();
for(int i=0;i<childes.length;i++){
jsonArray.put(i, childes[i].toJson());
}
return jsonArray;
}
@Override
public void fromJson(JSONArray json) {
clearChildes();
if(json==null){
return;
}
int length = json.length();
setChildesCount(length);
for(int i=0;i<length;i++){
get(i).fromJson(json.getJSONObject(i));
}
}
} }

View File

@ -33,6 +33,7 @@ package com.reandroid.lib.arsc.chunk;
import com.reandroid.lib.arsc.pool.TypeStringPool; import com.reandroid.lib.arsc.pool.TypeStringPool;
import com.reandroid.lib.arsc.value.EntryBlock; import com.reandroid.lib.arsc.value.EntryBlock;
import com.reandroid.lib.arsc.value.LibraryInfo; import com.reandroid.lib.arsc.value.LibraryInfo;
import com.reandroid.lib.json.JSONArray;
import com.reandroid.lib.json.JSONConvert; import com.reandroid.lib.json.JSONConvert;
import com.reandroid.lib.json.JSONObject; import com.reandroid.lib.json.JSONObject;
@ -289,11 +290,11 @@ package com.reandroid.lib.arsc.chunk;
mSpecStringPoolCount.set(mSpecStringPool.countStrings()); mSpecStringPoolCount.set(mSpecStringPool.countStrings());
} }
private void refreshTypeIdOffset(){ private void refreshTypeIdOffset(){
int smallestId=getSpecTypePairArray().getSmallestTypeId(); // TODO: find solution
if(smallestId>0){ //int largest=getSpecTypePairArray().getHighestTypeId();
smallestId=smallestId-1; //int count=getTypeStringPool().countStrings();
} //mTypeIdOffset.set(count-largest);
mTypeIdOffset.set(smallestId); mTypeIdOffset.set(0);
} }
public void onEntryAdded(EntryBlock entryBlock){ public void onEntryAdded(EntryBlock entryBlock){
updateEntry(entryBlock); updateEntry(entryBlock);
@ -321,6 +322,12 @@ package com.reandroid.lib.arsc.chunk;
if(libraryInfoArray.childesCount()>0){ if(libraryInfoArray.childesCount()>0){
jsonObject.put(NAME_libraries,libraryInfoArray.toJson()); jsonObject.put(NAME_libraries,libraryInfoArray.toJson());
} }
StagedAlias stagedAlias =
StagedAlias.mergeAll(getStagedAliasList().getChildes());
if(stagedAlias!=null){
jsonObject.put(NAME_staged_aliases,
stagedAlias.getStagedAliasEntryArray().toJson());
}
return jsonObject; return jsonObject;
} }
@Override @Override
@ -330,6 +337,12 @@ package com.reandroid.lib.arsc.chunk;
getSpecTypePairArray().fromJson(json.getJSONArray(NAME_specs)); getSpecTypePairArray().fromJson(json.getJSONArray(NAME_specs));
LibraryInfoArray libraryInfoArray = mLibraryBlock.getLibraryInfoArray(); LibraryInfoArray libraryInfoArray = mLibraryBlock.getLibraryInfoArray();
libraryInfoArray.fromJson(json.optJSONArray(NAME_libraries)); libraryInfoArray.fromJson(json.optJSONArray(NAME_libraries));
if(json.has(NAME_staged_aliases)){
StagedAlias stagedAlias=new StagedAlias();
stagedAlias.getStagedAliasEntryArray()
.fromJson(json.getJSONArray(NAME_staged_aliases));
mStagedAliasList.add(stagedAlias);
}
} }
public void merge(PackageBlock packageBlock){ public void merge(PackageBlock packageBlock){
if(packageBlock==null||packageBlock==this){ if(packageBlock==null||packageBlock==this){
@ -376,4 +389,5 @@ package com.reandroid.lib.arsc.chunk;
public static final String JSON_FILE_NAME = "package.json"; public static final String JSON_FILE_NAME = "package.json";
private static final String NAME_specs="specs"; private static final String NAME_specs="specs";
private static final String NAME_libraries="libraries"; private static final String NAME_libraries="libraries";
private static final String NAME_staged_aliases="staged_aliases";
} }

View File

@ -30,7 +30,7 @@
stagedAliasEntryArray = new StagedAliasEntryArray(count); stagedAliasEntryArray = new StagedAliasEntryArray(count);
addChild(stagedAliasEntryArray); addChild(stagedAliasEntryArray);
} }
public void addStagedAliasEntries(StagedAlias stagedAlias){ public void merge(StagedAlias stagedAlias){
if(stagedAlias==null||stagedAlias==this){ if(stagedAlias==null||stagedAlias==this){
return; return;
} }
@ -58,4 +58,21 @@
return getClass().getSimpleName()+ return getClass().getSimpleName()+
": count="+getStagedAliasEntryCount(); ": count="+getStagedAliasEntryCount();
} }
public static StagedAlias mergeAll(Collection<StagedAlias> stagedAliasList){
if(stagedAliasList.size()==0){
return null;
}
StagedAlias result=new StagedAlias();
for(StagedAlias stagedAlias:stagedAliasList){
if(stagedAlias.isNull()){
continue;
}
result.merge(stagedAlias);
}
if(!result.isNull()){
result.refresh();
return result;
}
return null;
}
} }

View File

@ -1,8 +1,10 @@
package com.reandroid.lib.arsc.value; package com.reandroid.lib.arsc.value;
import com.reandroid.lib.arsc.item.ByteArray; import com.reandroid.lib.arsc.item.ByteArray;
import com.reandroid.lib.json.JSONConvert;
import com.reandroid.lib.json.JSONObject;
public class StagedAliasEntry extends ByteArray { public class StagedAliasEntry extends ByteArray implements JSONConvert<JSONObject> {
public StagedAliasEntry(){ public StagedAliasEntry(){
super(8); super(8);
} }
@ -23,4 +25,18 @@ public class StagedAliasEntry extends ByteArray {
return "stagedResId="+String.format("0x%08x",getStagedResId()) return "stagedResId="+String.format("0x%08x",getStagedResId())
+", finalizedResId="+String.format("0x%08x",getFinalizedResId()); +", finalizedResId="+String.format("0x%08x",getFinalizedResId());
} }
@Override
public JSONObject toJson() {
JSONObject jsonObject=new JSONObject();
jsonObject.put(NAME_staged_resource_id, getStagedResId());
jsonObject.put(NAME_finalized_resource_id, getFinalizedResId());
return jsonObject;
}
@Override
public void fromJson(JSONObject json) {
setStagedResId(json.getInt(NAME_staged_resource_id));
setFinalizedResId(json.getInt(NAME_finalized_resource_id));
}
public static final String NAME_staged_resource_id = "staged_resource_id";
public static final String NAME_finalized_resource_id = "finalized_resource_id";
} }