Skip to content

Conversation

@IgorEisberg
Copy link
Collaborator

@IgorEisberg IgorEisberg commented Dec 9, 2025

  • Strict entry spec naming ensures that invalid entry names (incl. attempts of directory traversal) are replaced.
  • Inject generic entries for missing resources to ensure that stripped APKs can be recompiled without any changes. Most often: missing attributes or missing ID resources for enum/flag attribute items.
  • Fill in stripped attr formats according to actual usage to ensure that stripped APKs can be recompiled without any changes.
  • Default resolve mode changed to KEEP (instead of REMOVE), otherwise stripped APKs can't be recompiled. DUMMY mode can still be used to include unused dummy resources (rarely useful). REMOVE mode can still be used to ignore missing resources altogether (rarely useful). Output for non-stripped APKs is already identical between all of the modes.
  • The rest is just style and micro-optimization.

* Strict entry spec naming ensures that invalid entry names (incl. attempts of directory traversal) are replaced.
* Inject generic entries for missing resources to ensure that stripped APKs can be recompiled without any changes.
  Normally missing attributes or missing ID resources for enum/flag attribute items.
* Default resolve mode changed to KEEP (instead of REMOVE), otherwise stripped APKs can't be recompiled.
  DUMMY mode can still be used to include unused dummy resources (rarely useful).
  REMOVE mode can still be used to ignore missing resources altogether (rarely useful).
  Output for non-stripped APKs is already identical between all of the modes.
* The rest is just style and micro-optimization.
@TechnoIndian555
Copy link

  • Strict entry spec naming ensures that invalid entry names (incl. attempts of directory traversal) are replaced.
  • Inject generic entries for missing resources to ensure that stripped APKs can be recompiled without any changes. Normally, missing attributes or missing ID resources for enum/flag attribute items.
  • Default resolve mode changed to KEEP (instead of REMOVE), otherwise stripped APKs can't be recompiled. DUMMY mode can still be used to include unused dummy resources (rarely useful). REMOVE mode can still be used to ignore missing resources altogether (rarely useful). Output for non-stripped APKs is already identical between all of the modes.
  • The rest is just style and micro-optimization.

Brother, okay, I was right, there was a problem. Actually, I have limited resources because I don't have a PC, and I had to repeatedly build and recheck the jar on my phone. That's why you were able to do it in 1-2 days, but it took me 7-8 days, and I don't know how many builds I did. At one point, I thought of giving up, but then I thought I should at least send you what I've done so you get an idea of ​​the problem, because nowadays most APKs are obfuscated, so this change was important. By the way, you could have created an independent aapt tool like ARSCLib, but it's good to see that you're still based on Google's official AOSP aapt. 😎

I have a humble request: could you please add "aapt2" for Android as well?

Source

https://github.com/Maximoff/binaries/blob/main/bin/arm64-v8a/sdk35/aapt2

OR

https://github.com/TechnoIndian/aapt2/releases/download/main/aapt2-arm64-v8a

@IgorEisberg
Copy link
Collaborator Author

  • Strict entry spec naming ensures that invalid entry names (incl. attempts of directory traversal) are replaced.
  • Inject generic entries for missing resources to ensure that stripped APKs can be recompiled without any changes. Normally, missing attributes or missing ID resources for enum/flag attribute items.
  • Default resolve mode changed to KEEP (instead of REMOVE), otherwise stripped APKs can't be recompiled. DUMMY mode can still be used to include unused dummy resources (rarely useful). REMOVE mode can still be used to ignore missing resources altogether (rarely useful). Output for non-stripped APKs is already identical between all of the modes.
  • The rest is just style and micro-optimization.

Brother, okay, I was right, there was a problem. Actually, I have limited resources because I don't have a PC, and I had to repeatedly build and recheck the jar on my phone. That's why you were able to do it in 1-2 days, but it took me 7-8 days, and I don't know how many builds I did. At one point, I thought of giving up, but then I thought I should at least send you what I've done so you get an idea of ​​the problem, because nowadays most APKs are obfuscated, so this change was important. By the way, you could have created an independent aapt tool like ARSCLib, but it's good to see that you're still based on Google's official AOSP aapt. 😎

I have a humble request: could you please add "aapt2" for Android as well?

Source

https://github.com/Maximoff/binaries/blob/main/bin/arm64-v8a/sdk35/aapt2

OR

https://github.com/TechnoIndian/aapt2/releases/download/main/aapt2-arm64-v8a

@iBotPeaches manages the aapt2 binaries separately. Can't help with that.

iBotPeaches
iBotPeaches previously approved these changes Dec 9, 2025
Copy link
Owner

@iBotPeaches iBotPeaches left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Before we cut v3, I want to test out the CVE apks I got from the traversal problems to be sure thats still good.

@TechnoIndian555
Copy link

TechnoIndian555 commented Dec 10, 2025

  • Strict entry spec naming ensures that invalid entry names (incl. attempts of directory traversal) are replaced.
  • Inject generic entries for missing resources to ensure that stripped APKs can be recompiled without any changes. Normally, missing attributes or missing ID resources for enum/flag attribute items.
  • Default resolve mode changed to KEEP (instead of REMOVE), otherwise stripped APKs can't be recompiled. DUMMY mode can still be used to include unused dummy resources (rarely useful). REMOVE mode can still be used to ignore missing resources altogether (rarely useful). Output for non-stripped APKs is already identical between all of the modes.
  • The rest is just style and micro-optimization.

Haha, I tried forking your repo, and it's mostly working on all those obfuscated APKs where attributes were missing. But did you forget to include the missing format (or rather, the format that was forcefully added to the resource files) in the already existing attributes?

PACKAGE NAME - com.whatsapp

APK LINK - Whatsapp

Decompile Logs

~ $ java -jar apktool-fix.jar d com.whatsapp.apk -f -s
I: Using Apktool 3.0.0-dirty on com.whatsapp.apk with 8 threads
I: Copying raw classes.dex file...
I: Copying raw classes2.dex file...
I: Copying raw classes3.dex file...
I: Copying raw classes4.dex file...
I: Copying raw classes5.dex file...
I: Copying raw classes6.dex file...
I: Copying raw classes7.dex file...
I: Copying raw classes8.dex file...
I: Loading resource table...
I: Decoding value resources...
I: Loading resource table from file: /data/data/com.termux/files/home/.local/share/apktool/framework/1.apk
I: Decoding file resources...
I: Generating values XMLs...
I: Decoding AndroidManifest.xml with resources...
I: Copying original files...
I: Copying assets...
I: Copying lib...
I: Copying unknown files...

Recompile Logs

~ $ java -jar apktool-fix.jar b com.whatsapp -f --aapt ./aapt2
I: Using Apktool 3.0.0-dirty on com.whatsapp.apk with 8 threads
I: Copying raw classes.dex file...
I: Copying raw classes2.dex file...
I: Copying raw classes3.dex file...
I: Copying raw classes4.dex file...
I: Copying raw classes5.dex file...
I: Copying raw classes6.dex file...
I: Copying raw classes7.dex file...
I: Copying raw classes8.dex file...
I: Building resources with aapt2...
W: /data/data/com.termux/files/home/com.whatsapp/res/drawable/mtrl_switch_thumb.xml:6: error: 'true' is incompatible with attribute APKTOOL_RENAMED_0x7f040b6b (attr) color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0264.xml:6: error: '1' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0265.xml:7: error: '0' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0272.xml:2: error: '1' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0308.xml:5: error: '0' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0352.xml:13: error: '2' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e036b.xml:10: error: '2' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e03fa.xml:5: error: '1' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0424.xml:5: error: '0' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e05b8.xml:9: error: '2' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e05ba.xml:9: error: '2' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e060d.xml:7: error: '1' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e07b1.xml:13: error: '2' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e085c.xml:11: error: '2' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0982.xml:19: error: '2' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e09c1.xml:4: error: '1' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0b12.xml:9: error: '2' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0c21.xml:4: error: '1' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0c36.xml:35: error: '1' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
W: /data/data/com.termux/files/home/com.whatsapp/res/layout/APKTOOL_RENAMED_0x7f0e0cc0.xml:15: error: '2' is incompatible with attribute APKTOOL_RENAMED_0x7f04085d (attr) reference|color.
Exception in thread "main" brut.androlib.exceptions.AndrolibException: brut.common.BrutException: Execution failed (exit code = 1): [./aapt2, link, -o, /data/data/com.termux/files/usr/tmp/APKTOOL8759706718132590351.tmp, --manifest, /data/data/com.termux/files/home/com.whatsapp/AndroidManifest.xml, --min-sdk-version, 21, --target-sdk-version, 35, --version-code, 253674010, --version-name, 2.25.36.74, --package-id, 127, --no-auto-version, --no-version-vectors, --no-version-transitions, --no-resource-deduping, --no-compile-sdk-metadata, --warn-manifest-validation, -I, /data/data/com.termux/files/home/.local/share/apktool/framework/1.apk, /data/data/com.termux/files/home/com.whatsapp/build/resources.zip]
        at brut.androlib.res.AaptInvoker.invoke(SourceFile:192)
        at brut.androlib.ApkBuilder.buildResources(SourceFile:320)
        at brut.apktool.Main.main(SourceFile:95)
Caused by: brut.common.BrutException: Execution failed (exit code = 1): [./aapt2, link, -o, /data/data/com.termux/files/usr/tmp/APKTOOL8759706718132590351.tmp, --manifest, /data/data/com.termux/files/home/com.whatsapp/AndroidManifest.xml, --min-sdk-version, 21, --target-sdk-version, 35, --version-code, 253674010, --version-name, 2.25.36.74, --package-id, 127, --no-auto-version, --no-version-vectors, --no-version-transitions, --no-resource-deduping, --no-compile-sdk-metadata, --warn-manifest-validation, -I, /data/data/com.termux/files/home/.local/share/apktool/framework/1.apk, /data/data/com.termux/files/home/com.whatsapp/build/resources.zip]
        at brut.util.OS.exec(SourceFile:148)
        at brut.androlib.res.AaptInvoker.invoke(SourceFile:188)
        ... 2 more

IMG_20251210_055129

IMG_20251210_055853


IMG_20251210_055356

IMG_20251210_055641

@IgorEisberg
Copy link
Collaborator Author

IgorEisberg commented Dec 10, 2025

Haha, I tried forking your repo, and it's mostly working on all those obfuscated APKs where attributes were missing. But did you forget to include the missing format (or rather, the format that was forcefully added to the resource files) in the already existing attributes?

I didn't forget anything. I tested with the 3 APKs you mentioned: com.musixmatch.android.lyrify, com.orange.mobinilandme, com.kaliranaapp.edu.
Now you're bringing up com.whatsapp with a totally different issue.
Renamed resources are just renamed, not modified.
Out of what data do you expect formats to be forcefully fixed? Thin air? Lucky-guessing?

aapt2 dump resources com.whatsapp.apk

...
    resource 0x7f040b6b attr/(name removed)
      () (attr) type=color
...

aapt2 dump xmltree --file res/ev1.xml com.whatsapp.apk

...
          A: http://schemas.android.com/apk/res-auto:state_with_icon(0x7f040b6b)=true
...

The only proper hack would be to make ResAttribute.mType mutable (i.e. not final) and then translating valueType in BinaryXmlResourceParser.getAttributeValue to ResAttribute.TYPE_* flags and toggling them in ((ResAttribute) nameDefValue).mType. This could allow the APK to be rebuilt but the color format will still be a "valid" format for the attribute (since we can't arbitrarily remove flags).

Android doesn't verify that a value encoded in an binary XML was encoded with a format that's supported by the attribute.
The attr's "format" attribute is only enforced by aapt2 during build-time, so some obfuscators manipulate it in a way that doesn't match with actual usage.
Let the binary XML decoder add missing formats whenever necessary.
No change in output for APKs that weren't obfuscated in this specific way.
@IgorEisberg
Copy link
Collaborator Author

@TechnoIndian555 try the latest commit.

@TechnoIndian555
Copy link

@TechnoIndian555 try the latest commit.

Nice, now it's working successfully 🤗

iBotPeaches
iBotPeaches previously approved these changes Dec 10, 2025
@HassanMirza01
Copy link

@TechnoIndian555 try the latest commit.

Nice, now it's working successfully 🤗

bro can you check this app too? as you said its working but with latest commit, its still missing format, check resource APKTOOL_DUMMY_0x7f040880 and see attrs.xml for it,
https://drive.google.com/file/d/1LYkJZIvByUbTQKKSJW6PuWVqXBM1Fr8q/view?usp=sharing

@IgorEisberg
Copy link
Collaborator Author

@TechnoIndian555 try the latest commit.

Nice, now it's working successfully 🤗

bro can you check this app too? as you said its working but with latest commit, its still missing format, check resource APKTOOL_DUMMY_0x7f040880 and see attrs.xml for it, https://drive.google.com/file/d/1LYkJZIvByUbTQKKSJW6PuWVqXBM1Fr8q/view?usp=sharing

  1. There's no reason to use dummy mode, it causes unnecessary and sometimes unexpected output.
  2. There's no problem with the APK you provided. The format is not missing, injected generic attrs use TYPE_ANY, which means the format attribute is unspecified, and the value format is unrestricted.

@HassanMirza01
Copy link

@TechnoIndian555 try the latest commit.

Nice, now it's working successfully 🤗

bro can you check this app too? as you said its working but with latest commit, its still missing format, check resource APKTOOL_DUMMY_0x7f040880 and see attrs.xml for it, https://drive.google.com/file/d/1LYkJZIvByUbTQKKSJW6PuWVqXBM1Fr8q/view?usp=sharing

  1. There's no reason to use dummy mode, it causes unnecessary and sometimes unexpected output.
  2. There's no problem with the APK you provided. The format is not missing, injected generic attrs use TYPE_ANY, which means the format attribute is unspecified, and the value format is unrestricted.

i use keep res mode but used dummy just to show here or reach exactly at the point i was asking for,
wont there be an issue if format should be float and it assign TYPE_ANY to it?

@IgorEisberg
Copy link
Collaborator Author

IgorEisberg commented Dec 10, 2025

@TechnoIndian555 try the latest commit.

Nice, now it's working successfully 🤗

bro can you check this app too? as you said its working but with latest commit, its still missing format, check resource APKTOOL_DUMMY_0x7f040880 and see attrs.xml for it, https://drive.google.com/file/d/1LYkJZIvByUbTQKKSJW6PuWVqXBM1Fr8q/view?usp=sharing

  1. There's no reason to use dummy mode, it causes unnecessary and sometimes unexpected output.
  2. There's no problem with the APK you provided. The format is not missing, injected generic attrs use TYPE_ANY, which means the format attribute is unspecified, and the value format is unrestricted.

i use keep res mode but used dummy just to show here or reach exactly at the point i was asking for, wont there be an issue if format should be float and it assign TYPE_ANY to it?

In all multi-format cases, a value's type is determined automatically by a predetermined order of priority:
https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/tools/aapt2/ResourceUtils.cpp#621
https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/tools/aapt2/ResourceUtils.cpp#709
The string format is used as a last resort, if the value didn't match any of the other formats, and only if allowed:
https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/tools/aapt2/link/ReferenceLinker.cpp#164

@HassanMirza01
Copy link

@TechnoIndian555 try the latest commit.

Nice, now it's working successfully 🤗

bro can you check this app too? as you said its working but with latest commit, its still missing format, check resource APKTOOL_DUMMY_0x7f040880 and see attrs.xml for it, https://drive.google.com/file/d/1LYkJZIvByUbTQKKSJW6PuWVqXBM1Fr8q/view?usp=sharing

  1. There's no reason to use dummy mode, it causes unnecessary and sometimes unexpected output.
  2. There's no problem with the APK you provided. The format is not missing, injected generic attrs use TYPE_ANY, which means the format attribute is unspecified, and the value format is unrestricted.

i use keep res mode but used dummy just to show here or reach exactly at the point i was asking for, wont there be an issue if format should be float and it assign TYPE_ANY to it?

In all multi-format cases, a value's type is determined automatically by a predetermined order of priority: https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/tools/aapt2/ResourceUtils.cpp#621 https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/tools/aapt2/ResourceUtils.cpp#709 The string format is used as a last resort, if the value didn't match any of the other formats.

understood now, thanks mate for always pointing and explaining stuff ;)

@HassanMirza01
Copy link

@TechnoIndian555 try the latest commit.

Nice, now it's working successfully 🤗

bro can you check this app too? as you said its working but with latest commit, its still missing format, check resource APKTOOL_DUMMY_0x7f040880 and see attrs.xml for it, https://drive.google.com/file/d/1LYkJZIvByUbTQKKSJW6PuWVqXBM1Fr8q/view?usp=sharing

  1. There's no reason to use dummy mode, it causes unnecessary and sometimes unexpected output.
  2. There's no problem with the APK you provided. The format is not missing, injected generic attrs use TYPE_ANY, which means the format attribute is unspecified, and the value format is unrestricted.

i use keep res mode but used dummy just to show here or reach exactly at the point i was asking for, wont there be an issue if format should be float and it assign TYPE_ANY to it?

In all multi-format cases, a value's type is determined automatically by a predetermined order of priority: https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/tools/aapt2/ResourceUtils.cpp#621 https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/tools/aapt2/ResourceUtils.cpp#709 The string format is used as a last resort, if the value didn't match any of the other formats.

understood now, thanks mate for always pointing and explaining stuff ;)

1 more question, i recompiled that app and rechecked resource type, it still says ANY, not float, does aapt2 pickup above stuff when it read resource on runtime or compile it to predetermined resource type?

@IgorEisberg
Copy link
Collaborator Author

IgorEisberg commented Dec 10, 2025

@TechnoIndian555 try the latest commit.

Nice, now it's working successfully 🤗

bro can you check this app too? as you said its working but with latest commit, its still missing format, check resource APKTOOL_DUMMY_0x7f040880 and see attrs.xml for it, https://drive.google.com/file/d/1LYkJZIvByUbTQKKSJW6PuWVqXBM1Fr8q/view?usp=sharing

  1. There's no reason to use dummy mode, it causes unnecessary and sometimes unexpected output.
  2. There's no problem with the APK you provided. The format is not missing, injected generic attrs use TYPE_ANY, which means the format attribute is unspecified, and the value format is unrestricted.

i use keep res mode but used dummy just to show here or reach exactly at the point i was asking for, wont there be an issue if format should be float and it assign TYPE_ANY to it?

In all multi-format cases, a value's type is determined automatically by a predetermined order of priority: https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/tools/aapt2/ResourceUtils.cpp#621 https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/tools/aapt2/ResourceUtils.cpp#709 The string format is used as a last resort, if the value didn't match any of the other formats.

understood now, thanks mate for always pointing and explaining stuff ;)

1 more question, i recompiled that app and rechecked resource type, it still says ANY, not float, does aapt2 pickup above stuff when it read resource on runtime or compile it to predetermined resource type?

The attr's type/format is ResAttribute.TYPE_ANY ("any" in aapt2 dump resources), which means unrestricted.
Analyze the actual XML file that uses the attr, you'll see that the attribute's value was encoded as TypedValue.TYPE_FLOAT.
Those are different unrelated sets of TYPE_* values. One is a bit field only used by ResAttribute, the other is basically an enum:
https://android.googlesource.com/platform/frameworks/base/+/refs/tags/android-16.0.0_r4/core/java/android/util/TypedValue.java#35

Technically integer format for enum/flags is allowed, but rarely used.
We have to handle this scenario properly. An example from framework-res.apk:

<attr name="numColumns" format="integer" min="0">
    <enum name="auto_fit" value="-1" />
</attr>

We solve this by checking if an attribute value has any matching symbols via nameAttr.hasSymbolsForValue(value).

This commit also improves caching for ResEnum/ResFlags symbols to avoid conversion of raw integer values to symbols more than once.
The caching is done lazily to avoid unnecessary overheads in case certain defined attribute were never used (i.e. never formatted a value).

This commit changes nothing in any known APK, just handles a theoretical edge case.
@IgorEisberg
Copy link
Collaborator Author

I think I covered all cases now. Tested on large scale, everything as designed.
We can wrap up this PR.

@iBotPeaches iBotPeaches merged commit e10a045 into iBotPeaches:main Dec 12, 2025
18 checks passed
@iBotPeaches iBotPeaches added this to the 3.0.0 milestone Dec 12, 2025
iBotPeaches added a commit to iBotPeaches/apktool.org that referenced this pull request Dec 12, 2025
@IgorEisberg IgorEisberg deleted the obfu-fix branch December 12, 2025 11:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants