fix(res): do not rename resources names for building res-map.txt (PR #1035)
fix: do not rename resources names for building res-map.txt allow loading of resources.arsc from android.jar files res-map.txt bases on resources.arsc from API 3, 4, 7-30 (taken from https://github.com/Sable/android-platforms)
This commit is contained in:
@@ -11,6 +11,8 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipFile;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@@ -51,13 +53,29 @@ public class ConvertArscFile {
|
||||
RootNode root = new RootNode(new JadxArgs()); // not really needed
|
||||
rewritesCount = 0;
|
||||
for (Path resFile : inputPaths) {
|
||||
try (InputStream inputStream = new BufferedInputStream(Files.newInputStream(resFile))) {
|
||||
ResTableParser resTableParser = new ResTableParser(root);
|
||||
resTableParser.decode(inputStream);
|
||||
Map<Integer, String> singleResMap = resTableParser.getResStorage().getResourcesNames();
|
||||
mergeResMaps(resMap, singleResMap);
|
||||
LOG.info("{} entries count: {}, after merge: {}", resFile.getFileName(), singleResMap.size(), resMap.size());
|
||||
LOG.info("Processing {}", resFile);
|
||||
ResTableParser resTableParser = new ResTableParser(root, true);
|
||||
if (resFile.getFileName().toString().endsWith(".jar")) {
|
||||
// Load resources.arsc from android.jar
|
||||
try (ZipFile zip = new ZipFile(resFile.toFile())) {
|
||||
ZipEntry entry = zip.getEntry("resources.arsc");
|
||||
if (entry == null) {
|
||||
LOG.error("Failed to load \"resources.arsc\" from {}", resFile);
|
||||
continue;
|
||||
}
|
||||
try (InputStream inputStream = zip.getInputStream(entry)) {
|
||||
resTableParser.decode(inputStream);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// Load resources.arsc from extracted file
|
||||
try (InputStream inputStream = new BufferedInputStream(Files.newInputStream(resFile))) {
|
||||
resTableParser.decode(inputStream);
|
||||
}
|
||||
}
|
||||
Map<Integer, String> singleResMap = resTableParser.getResStorage().getResourcesNames();
|
||||
mergeResMaps(resMap, singleResMap);
|
||||
LOG.info("{} entries count: {}, after merge: {}", resFile.getFileName(), singleResMap.size(), resMap.size());
|
||||
}
|
||||
LOG.info("Output entries count: {}", resMap.size());
|
||||
LOG.info("Total rewrites count: {}", rewritesCount);
|
||||
|
||||
@@ -27,7 +27,7 @@ import jadx.core.xmlgen.entry.ValuesParser;
|
||||
public class ResTableParser extends CommonBinaryParser {
|
||||
private static final Logger LOG = LoggerFactory.getLogger(ResTableParser.class);
|
||||
|
||||
private static final Pattern VALID_RES_KEY_PATTERN = Pattern.compile("[\\w\\d-_.]+");
|
||||
private static final Pattern VALID_RES_KEY_PATTERN = Pattern.compile("\\$+[\\w\\d-_.]+");
|
||||
|
||||
private static final class PackageChunk {
|
||||
private final int id;
|
||||
@@ -59,12 +59,21 @@ public class ResTableParser extends CommonBinaryParser {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* No renaming, pattern checking or name generation. Required for res-map.txt building
|
||||
*/
|
||||
private final boolean useRawResName;
|
||||
private final RootNode root;
|
||||
private final ResourceStorage resStorage = new ResourceStorage();
|
||||
private String[] strings;
|
||||
|
||||
public ResTableParser(RootNode root) {
|
||||
this(root, false);
|
||||
}
|
||||
|
||||
public ResTableParser(RootNode root, boolean useRawResNames) {
|
||||
this.root = root;
|
||||
this.useRawResName = useRawResNames;
|
||||
}
|
||||
|
||||
public void decode(InputStream inputStream) throws IOException {
|
||||
@@ -291,6 +300,9 @@ public class ResTableParser extends CommonBinaryParser {
|
||||
}
|
||||
|
||||
private String getResName(int resRef, String origKeyName) {
|
||||
if (this.useRawResName) {
|
||||
return origKeyName;
|
||||
}
|
||||
String renamedKey = resStorage.getRename(resRef);
|
||||
if (renamedKey != null) {
|
||||
return renamedKey;
|
||||
|
||||
@@ -10686,6 +10686,7 @@
|
||||
010b0009=animator/leanback_setup_fragment_close_exit
|
||||
010b000a=animator/leanback_setup_fragment_open_enter
|
||||
010b000b=animator/leanback_setup_fragment_open_exit
|
||||
010b000c=xml/time_zones_by_country
|
||||
010c0000=interpolator/accelerate_quad
|
||||
010c0001=interpolator/decelerate_quad
|
||||
010c0002=interpolator/accelerate_cubic
|
||||
@@ -10740,6 +10741,23 @@
|
||||
010d0001=mipmap/sym_def_app_icon_foreground
|
||||
010d0002=mipmap/sym_def_app_icon_maskable
|
||||
010d0003=mipmap/sym_def_app_icon_maskable
|
||||
010d0004=bool/config_bypass_keyguard_if_slider_open
|
||||
010d0005=bool/config_automatic_brightness_available
|
||||
010d0006=bool/config_annoy_dianne
|
||||
010d0007=bool/config_unplugTurnsOnScreen
|
||||
010d0008=bool/config_animateScreenLights
|
||||
010d0009=bool/config_deskDockEnablesAccelerometer
|
||||
010d000a=bool/config_carDockEnablesAccelerometer
|
||||
010d000b=bool/config_batterySdCardAccessibility
|
||||
010d000c=bool/config_use_strict_phone_number_comparation
|
||||
010d000d=bool/config_disableMenuKeyInLockScreen
|
||||
010d000e=bool/config_swipeDisambiguation
|
||||
010d000f=bool/config_filterTouchEvents
|
||||
010d0010=bool/config_filterJumpyTouchEvents
|
||||
010d0011=bool/config_bluetooth_sco_off_call
|
||||
010d0012=bool/config_sip_wifi_only
|
||||
010d0013=bool/skip_restoring_network_selection
|
||||
010d0014=bool/lockscreen_isPortrait
|
||||
010e0000=integer/config_shortAnimTime
|
||||
010e0001=integer/config_mediumAnimTime
|
||||
010e0002=integer/config_longAnimTime
|
||||
@@ -11040,6 +11058,7 @@
|
||||
010f000f=xml/sms_short_codes
|
||||
010f0010=xml/storage_list
|
||||
010f0011=xml/time_zones_by_country
|
||||
010f0012=plurals/wifi_available_detailed
|
||||
01100000=raw/loaderror
|
||||
01100001=raw/nodomain
|
||||
01100002=raw/color_fade_frag
|
||||
|
||||
Reference in New Issue
Block a user