-
-
Notifications
You must be signed in to change notification settings - Fork 3.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
array parsing in resources #1994
Comments
Can you please give me a quick link to the location where the Snapshot builds can be obtained from @azt59? I had recently lost the link and had just remembered about asking around for it again. Thanks a bunch! :-) ~Ibuprophen |
I build it by this instructions https://ibotpeaches.github.io/Apktool/build/ |
This case is present too in 2.3.4 version, arrays is parsed as styles tags |
Confirmed. |
Hi! I have just ran into the same issue, I spent some times trying to implement a fix and found this solution: diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java
index 0c2de96d..df07f7c8 100644
--- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java
+++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/ResTypeSpec.java
@@ -24,6 +24,11 @@ import java.util.*;
* @author Ryszard Wiśniewski <brut.alll@gmail.com>
*/
public final class ResTypeSpec {
+
+ public static final String RES_TYPE_NAME_ARRAY = "array";
+ public static final String RES_TYPE_NAME_PLURALS = "plurals";
+ public static final String RES_TYPE_NAME_STYLES = "style";
+
private final String mName;
private final Map<String, ResResSpec> mResSpecs = new LinkedHashMap<String, ResResSpec>();
diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java
index ee21befd..fae59dbc 100644
--- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java
+++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/data/value/ResValueFactory.java
@@ -19,6 +19,7 @@ package brut.androlib.res.data.value;
import android.util.TypedValue;
import brut.androlib.AndrolibException;
import brut.androlib.res.data.ResPackage;
+import brut.androlib.res.data.ResTypeSpec;
import brut.util.Duo;
/**
@@ -83,7 +84,7 @@ public class ResValueFactory {
return new ResStringValue(value, rawValue);
}
- public ResBagValue bagFactory(int parent, Duo<Integer, ResScalarValue>[] items) throws AndrolibException {
+ public ResBagValue bagFactory(int parent, Duo<Integer, ResScalarValue>[] items, ResTypeSpec resTypeSpec) throws AndrolibException {
ResReferenceValue parentVal = newReference(parent, null);
if (items.length == 0) {
@@ -93,14 +94,25 @@ public class ResValueFactory {
if (key == ResAttr.BAG_KEY_ATTR_TYPE) {
return ResAttr.factory(parentVal, items, this, mPackage);
}
- // Android O Preview added an unknown enum for ResTable_map. This is hardcoded as 0 for now.
- if (key == ResArrayValue.BAG_KEY_ARRAY_START || key == 0) {
+
+ String resTypeName = resTypeSpec.getName();
+
+ // Android O Preview added an unknown enum for c. This is hardcoded as 0 for now.
+ if (ResTypeSpec.RES_TYPE_NAME_ARRAY.equals(resTypeName)
+ || key == ResArrayValue.BAG_KEY_ARRAY_START || key == 0) {
return new ResArrayValue(parentVal, items);
}
- if (key >= ResPluralsValue.BAG_KEY_PLURALS_START && key <= ResPluralsValue.BAG_KEY_PLURALS_END) {
+
+ if (ResTypeSpec.RES_TYPE_NAME_PLURALS.equals(resTypeName) ||
+ (key >= ResPluralsValue.BAG_KEY_PLURALS_START && key <= ResPluralsValue.BAG_KEY_PLURALS_END)) {
return new ResPluralsValue(parentVal, items);
}
- return new ResStyleValue(parentVal, items, this);
+
+ if (ResTypeSpec.RES_TYPE_NAME_STYLES.equals(resTypeName)) {
+ return new ResStyleValue(parentVal, items, this);
+ }
+
+ throw new AndrolibException("unsupported res type name for bags. Found: " + resTypeName);
}
public ResReferenceValue newReference(int resID, String rawValue) {
diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java
index 290a6615..86efecff 100644
--- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java
+++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ARSCDecoder.java
@@ -347,7 +347,7 @@ public class ARSCDecoder {
}
}
- return factory.bagFactory(parent, items);
+ return factory.bagFactory(parent, items, mTypeSpec);
}
private ResIntBasedValue readValue() throws IOException, AndrolibException {
Instead of using the id of the first item within the bag, I use the name of the res type spec to choose the res bag value to create. The "names" have been found from the aapt2 source code: I kept the previous checks, but we might remove them and use only the check on the names. Please, feel free to tell me what you think of the solution :) I might submit an MR in the coming days if it's OK for you! |
@vbarthel-fr That sounds excellent! Thanks for digging into that. I always knew trusting the first value inside the bag was a bad idea. Your solution looks good. Feel free to put it up for review |
@iBotPeaches Thanks :) Before I submit a pull request, have you any preferences regarding keeping the previous checks? I might not have enough hindsight and experience with the arsc format to fully understand the consequences of those changes! |
Here is my first attempt: #2000 :) |
Information
apktool version 2.4.0-29355f-SNAPSHOT
Error with parsing resources.
I am use this apk
after decode in file res/values/arrays.xml contains the following code
public.xml code
im try to list files of this apk via aapt.exe and fount this:
And aapt2.exe(Android Asset Packaging Tool (aapt) 2:19) print this
Your program does not correctly identify the array and its contents.
The text was updated successfully, but these errors were encountered: