Fix VerifyError in rebuilt APKs by enforcing consistent API level limits during decode/build #23
+64
−8
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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
SmaliConstants.MAX_SUPPORTED_API_LEVEL: Centralizes the API 29 limit referenced by issue [BUG] dex version changed after compilation. iBotPeaches/Apktool#3641SmaliDecoder.decode(): Applies API level limit during disassembly by detecting original API level, capping at 29, and reloading the dex container with limited opcodesSmaliBuilder: Uses shared constant instead of hardcoded valueThis 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.