Skip to content

Conversation

Copy link

Copilot AI commented Dec 23, 2025

APKs with API level > 29 fail verification after rebuild with errors like VerifyError: register v4 has type BooleanConstant but expected Reference: java.lang.String. Root cause: baksmali disassembles using original API level (e.g., 34) while smali reassembles limited to API 29, creating opcode incompatibilities.

Changes

  • Added SmaliConstants.MAX_SUPPORTED_API_LEVEL: Centralizes the API 29 limit referenced by issue [BUG] dex version changed after compilation. iBotPeaches/Apktool#3641
  • Modified SmaliDecoder.decode(): Applies API level limit during disassembly by detecting original API level, capping at 29, and reloading the dex container with limited opcodes
  • Updated SmaliBuilder: Uses shared constant instead of hardcoded value
// Before: baksmali uses API 34, smali uses API 29 → verification errors
DexFileFactory.loadDexContainer(mApkFile, null);  // Uses original opcodes

// After: both use API 29 → consistent bytecode
int limitedApiLevel = Math.min(originalApiLevel, SmaliConstants.MAX_SUPPORTED_API_LEVEL);
DexFileFactory.loadDexContainer(mApkFile, Opcodes.forApi(limitedApiLevel));

This ensures baksmali and smali operate at the same API level, eliminating verification failures in rebuilt APKs.

Original prompt

FATAL EXCEPTION: main
Process: com.wssyncmldm, PID: 30263
java.lang.VerifyError: Verifier rejected class com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFragment: void com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFragment.initializeDefaultValues() failed to verify: void com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFragment.initializeDefaultValues(): [0x141] register v4 has type BooleanConstant but expected Reference: java.lang.String (declaration of 'com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFragment' appears in /data/app/~~0bjm2CBSNVGnH9dpepdbhw==/com.wssyncmldm-3mwLgt17kJOTXdkCXZkZMQ==/base.apk)
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at androidx.fragment.app.Fragment.instantiate(Unknown Source:17)
at androidx.fragment.app.T.a(Unknown Source:7)
at androidx.preference.z.onPreferenceTreeClick(Unknown Source:59)
at androidx.preference.Preference.v(Unknown Source:33)
at androidx.preference.l.onClick(Unknown Source:23)
at android.view.View.performClick(Unknown Source:18)
at android.view.View.performClickInternal(Unknown Source:3)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(Unknown Source:8)
at android.os.Handler.handleCallback(Unknown Source:2)
at android.os.Handler.dispatchMessage(Unknown Source:4)
at android.os.Looper.loopOnce(Unknown Source:210)
at android.os.Looper.loop(Unknown Source:34)
at android.app.ActivityThread.main(Unknown Source:109)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Unknown Source:9)
at com.android.internal.os.ZygoteInit.main(Unknown Source:280)FATAL EXCEPTION: main
Process: com.wssyncmldm, PID: 11775
java.lang.NoSuchMethodError: No virtual method setText(Ljava/lang/String;)V in class Landroidx/preference/EditTextPreference; or its super classes (declaration of 'androidx.preference.EditTextPreference' appears in /data/app/~~u6ycZKQ-GNM0P9CCHFStMA==/com.wssyncmldm-AefxhnvoNOtypwqJ7iAtSQ==/base.apk)
at com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFragment.syncPreferencesWithValues(Unknown Source:31)
at com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFragment.onCreatePreferences(Unknown Source:11)
at androidx.preference.z.onCreate(Unknown Source:124)
at com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFragment.onCreate(Unknown Source:0)
at androidx.fragment.app.Fragment.performCreate(Unknown Source:21)
at androidx.fragment.app.g0.e(Unknown Source:50)
at androidx.fragment.app.g0.k(Unknown Source:179)
at androidx.fragment.app.Z.z(Unknown Source:996)
at androidx.fragment.app.Z.P(Unknown Source:81)
at androidx.fragment.app.Z.x(Unknown Source:78)
at androidx.fragment.app.m.run(Unknown Source:10)
at android.os.Handler.handleCallback(Unknown Source:2)
at android.os.Handler.dispatchMessage(Unknown Source:4)
at android.os.Looper.loopOnce(Unknown Source:210)
at android.os.Looper.loop(Unknown Source:34)
at android.app.ActivityThread.main(Unknown Source:109)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Unknown Source:9)
at com.android.internal.os.ZygoteInit.main(Unknown Source:280)FATAL EXCEPTION: main
Process: com.wssyncmldm, PID: 11911
java.lang.NoSuchMethodError: No virtual method setText(Ljava/lang/String;)V in class Landroidx/preference/EditTextPreference; or its super classes (declaration of 'androidx.preference.EditTextPreference' appears in /data/app/~~u6ycZKQ-GNM0P9CCHFStMA==/com.wssyncmldm-AefxhnvoNOtypwqJ7iAtSQ==/base.apk)
at com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFragment.syncPreferencesWithValues(Unknown Source:31)
at com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFragment.onCreatePreferences(Unknown Source:11)
at androidx.preference.z.onCreate(Unknown Source:124)
at com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFragment.onCreate(Unknown Source:0)
at androidx.fragment.app.Fragment.performCreate(Unknown Source:21)
at androidx.fragment.app.g0.e(Unknown Source:50)
at androidx.fragment.app.g0.k(Unknown Source:179)
at androidx.fragment.app.Z.z(Unknown Source:996)
at androidx.fragment.app.Z.P(Unknown Source:81)
at androidx.fragment.app.Z.x(Unknown Source:78)
at androidx.fragment.app.m.run(Unknown Source:10)
at android.os.Handler.handleCallback(Unknown Source:2)
at android.os.Handler.dispatchMessage(Unknown Source:4)
at android.os.Looper.loopOnce(Unknown Source:210)
at android.os.Looper.loop(Unknown Source:34)
at android.app.ActivityThread.main(Unknown Source:109)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(Unknown Source:9)
at com.android.internal.os.ZygoteInit.main(Unknown Source:280)FATAL EXCEPTION: main
Process: com.wssyncmldm, PID: 28169
java.lang.VerifyError: Verifier rejected class com.idm.fotaagent.enabler.ui.admin.mock.MockDeviceFra...


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

Copilot AI and others added 2 commits December 23, 2025 09:33
Apply same API level 29 limit during baksmali disassembly as during smali assembly to prevent verification errors. This ensures opcodes are consistent between decompilation and recompilation.

Co-authored-by: Eduardob3677 <212653915+Eduardob3677@users.noreply.github.com>
- Create SmaliConstants class with MAX_SUPPORTED_API_LEVEL constant
- Use constant in both SmaliBuilder and SmaliDecoder
- Improve exception handling to catch specific IOException
- Add check for empty dex entries list
- Update comments for clarity

Co-authored-by: Eduardob3677 <212653915+Eduardob3677@users.noreply.github.com>
Copilot AI changed the title [WIP] Fix VerifyError in MockDeviceFragment initialization Fix VerifyError in rebuilt APKs by enforcing consistent API level limits during decode/build Dec 23, 2025
Copilot AI requested a review from Eduardob3677 December 23, 2025 09:41
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.

2 participants