You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

加密填充块损坏异常排查:代码执行顺序是否需调整?

崩溃问题分析与代码顺序调整建议

问题背景

根据提供的崩溃报告和代码片段,崩溃由org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted引发,推测与代码执行顺序相关,现分析并给出调整建议。

崩溃堆栈信息

Codename One revisions: 7dd4e7d08b3442d90959477ee52a5ae8c4361b29
[EDT] 0:0:0,3 - Exception: java.io.IOException - 
org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted
java.io.IOException
at com_codename1_crypto_EncryptedStorage.createInputStream:70
at com_codename1_io_Storage.readObject:263
at com_codename1_io_Preferences.get:84
at com_codename1_io_Preferences.get:252
at com_fluency_fluencymobile_server_ServerImpl.__INIT__:49
at com_fluency_fluencymobile_server_Server.__CLINIT__:14
at com_fluency_fluencymobile_Main.init:51
at com_fluency_fluencymobile_MainStub.run:30
at com_codename1_ui_Display.processSerialCalls:1303
at com_codename1_ui_Display.mainEDTLoop:1097
at com_codename1_ui_RunnableWrapper.run:120
at com_codename1_impl_CodenameOneThread.run:176
at java_lang_Thread.runImpl:153

当前初始化代码

public void init(Object context) {
Preferences.setPreferencesLocation("EncryptedPreferences");
Storage.getInstance().deleteStorageFile(Cookie.STORAGE_NAME);
EncryptedStorage.install("hshdjimnj");
JSONParser.setUseLongs(true);
Display.getInstance().setProperty("AppVersion", "2.1");
NetworkManager.getInstance().updateThreadCount(2);
Util.register("Activity", Activity.class);
Util.register("OfflineCommand", OfflineCommand.class);
Util.register("Appointment", Appointment.class);
theme = UIManager.initNamedTheme("/theme", "Theme");
Dialog.setDefaultBlurBackgroundRadius(10);

问题根源

从堆栈可以看出,崩溃发生在Server类的静态初始化块(__CLINIT__)中,此时ServerImpl的初始化代码调用了Preferences.get方法。但当前代码中,Preferences.setPreferencesLocation("EncryptedPreferences")先于EncryptedStorage.install("hshdjimnj")执行——这意味着当Preferences开始读取数据时,加密存储还未完成安装,导致读取加密存储内容时出现解密失败(pad block corrupted)。

另外,Server类的静态初始化被提前触发(在Main.init的第51行),此时加密存储尚未初始化,进一步加剧了这个问题。

调整建议

  • 优先安装加密存储:将EncryptedStorage.install移至所有Preferences相关操作(包括设置存储位置)之前,确保加密存储在Preferences使用前完全初始化。
  • 延迟静态类初始化:检查Server类的静态代码逻辑,避免在应用初始化早期就触发Preferences读取;如果无法避免,必须确保加密存储在Server类加载前完成安装。

调整后的代码示例:

public void init(Object context) {
// 先安装加密存储,确保所有加密操作前完成初始化
EncryptedStorage.install("hshdjimnj");
// 再设置Preferences的存储位置
Preferences.setPreferencesLocation("EncryptedPreferences");
Storage.getInstance().deleteStorageFile(Cookie.STORAGE_NAME);
JSONParser.setUseLongs(true);
Display.getInstance().setProperty("AppVersion", "2.1");
NetworkManager.getInstance().updateThreadCount(2);
Util.register("Activity", Activity.class);
Util.register("OfflineCommand", OfflineCommand.class);
Util.register("Appointment", Appointment.class);
theme = UIManager.initNamedTheme("/theme", "Theme");
Dialog.setDefaultBlurBackgroundRadius(10);

内容的提问来源于stack exchange,提问作者user1678742

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 18:02:47