下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】AndroidWeb3jOOM解决详解
在Android客户端使用Web3j创建钱包、导入钱包时都可能会产生OOM,相关issue在Github上已经有所提及:/web3j/web3j/issues/299。这个问题在Web3j3.0版本以前是没有的,由于新版的Web3j使用spongycastle库替换了lambdaworks库,虽然在效率上提升了速度,但存在Android端的兼容性问题。本项目代码地址:/uncleleonfan/WalletOOM.git创建钱包OOM解决
在创建钱包时,如果创建一个FullWallet,则会导致OOM:Log如下:
"Causedby:java.lang.OutOfMemoryError:Failedtoallocatea1036byteallocationwith16777216freebytesand48MBuntilOOM;failedduetofragmentation(requiredcontinguousfree16384bytesforanewbufferwherelargestcontiguousfree8192bytes)",
"\tatorg.spongycastle.util.Arrays.clone(Arrays.java:602)",
"\tatorg.spongycastle.crypto.generators.SCrypt.SMix(SCrypt.java:126)",
"\tatorg.spongycastle.crypto.generators.SCrypt.MFcrypt(SCrypt.java:87)",
"\tatorg.spongycastle.crypto.generators.SCrypt.generate(SCrypt.java:66)",
"\tatorg.web3j.crypto.Wallet.generateDerivedScryptKey(Wallet.java:136)",
"\tatorg.web3j.crypto.Wallet.create(Wallet.java:74)",
"\tatorg.web3j.crypto.Wallet.createStandard(Wallet.java:93)",
"\tatorg.web3j.crypto.WalletUtils.generateWalletFile(WalletUtils.java:61)"
"Causedby:java.lang.OutOfMemoryError:Failedtoallocatea1036byteallocationwith16777216freebytesand48MBuntilOOM;failedduetofragmentation(requiredcontinguousfree16384bytesforanewbufferwherelargestcontiguousfree8192bytes)",
"\tatorg.spongycastle.util.Arrays.clone(Arrays.java:602)",
"\tatorg.spongycastle.crypto.generators.SCrypt.SMix(SCrypt.java:126)",
"\tatorg.spongycastle.crypto.generators.SCrypt.MFcrypt(SCrypt.java:87)",
"\tatorg.spongycastle.crypto.generators.SCrypt.generate(SCrypt.java:66)",
"\tatorg.web3j.crypto.Wallet.generateDerivedScryptKey(Wallet.java:136)",
"\tatorg.web3j.crypto.Wallet.create(Wallet.java:74)",
"\tatorg.web3j.crypto.Wallet.createStandard(Wallet.java:93)",
"\tatorg.web3j.crypto.WalletUtils.generateWalletFile(WalletUtils.java:61)"
generateFullNewWalletFile里面会调用createStandard创建钱包,使用N_STANDARD,P_STANDARD来配置加密强度,直接影响需使用的内存大小,最终导致OOM的发生。解决方法非常简单,创建一个LightWallet即可:generateLightNewWalletFile会调用createLight来创建一个轻钱包,使用N_LIGHT,P_LIGHT,他们在数值上相对较小,所以不会OOM。我们可以对比一下N_STANDARD和P_STANDARD,N_LIGHT和P_LIGHT的大小:导入钱包OOM解决
当我们导入一个轻钱包时,不会产生OOM,但导入不是一个轻钱包时,则有可能产生OOM。例如,我们使用Imtoken创建一个钱包并导出Keystore,Keystore如下:
{"address":"9a2e2419f3af050d4730f80e7a65b9f8deb5e16f","crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"eaccea79c27a91e307f24988186ef21a"},"ciphertext":"a163e532edf2d76beaee5c26fd2c2fab071a9cb37627aa185ac89e223e41ab97","kdf":"scrypt","kdfparams":{"dklen":32,"n":65536,"p":1,"r":8,"salt":"6a847392a029553f4152dea7bb0b6fb0ac9eec29f55e572fe94603182f5ed7f1"},"mac":"3fad2a31e18c611b10df84db9ae368ce2e189b5c35e9f111e40ca4b4bfb02491"},"id":"032c47c2-c7b7-46f8-a3f7-f526580f6f09","version":3}
{"address":"9a2e2419f3af050d4730f80e7a65b9f8deb5e16f","crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"eaccea79c27a91e307f24988186ef21a"},"ciphertext":"a163e532edf2d76beaee5c26fd2c2fab071a9cb37627aa185ac89e223e41ab97","kdf":"scrypt","kdfparams":{"dklen":32,"n":65536,"p":1,"r":8,"salt":"6a847392a029553f4152dea7bb0b6fb0ac9eec29f55e572fe94603182f5ed7f1"},"mac":"3fad2a31e18c611b10df84db9ae368ce2e189b5c35e9f111e40ca4b4bfb02491"},"id":"032c47c2-c7b7-46f8-a3f7-f526580f6f09","version":3}
可以看到,其中n为65536,p为1,而轻钱包的n为1<<12,即2的12次方,4096,所以这不是一个轻钱包。我们将该Keystore作为一个json文件push到SD卡中,然后使用Web3j进行导入:发现同样会OOM:
Causedby:java.lang.OutOfMemoryError:Failedtoallocatea1036byteallocationwith13588800freebytesand12MBuntilOOM;failedduetofragmentation(requiredcontinguousfree16384bytesforanewbufferwherelargestcontiguousfree12288bytes)
atorg.spongycastle.util.Arrays.clone(Arrays.java:602)
atorg.spongycastle.crypto.generators.SCrypt.SMix(SCrypt.java:126)
atorg.spongycastle.crypto.generators.SCrypt.MFcrypt(SCrypt.java:87)
atorg.spongycastle.crypto.generators.SCrypt.generate(SCrypt.java:66)
atorg.web3j.crypto.Wallet.generateDerivedScryptKey(Wallet.java:136)
atorg.web3j.crypto.Wallet.decrypt(Wallet.java:214)
atorg.web3j.crypto.WalletUtils.loadCredentials(WalletUtils.java:112)
Causedby:java.lang.OutOfMemoryError:Failedtoallocatea1036byteallocationwith13588800freebytesand12MBuntilOOM;failedduetofragmentation(requiredcontinguousfree16384bytesforanewbufferwherelargestcontiguousfree12288bytes)
atorg.spongycastle.util.Arrays.clone(Arrays.java:602)
atorg.spongycastle.crypto.generators.SCrypt.SMix(SCrypt.java:126)
atorg.spongycastle.crypto.generators.SCrypt.MFcrypt(SCrypt.java:87)
atorg.spongycastle.crypto.generators.SCrypt.generate(SCrypt.java:66)
atorg.web3j.crypto.Wallet.generateDerivedScryptKey(Wallet.java:136)
atorg.web3j.crypto.Wallet.decrypt(Wallet.java:214)
atorg.web3j.crypto.WalletUtils.loadCredentials(WalletUtils.java:112)
通过log可以看出来,这里和创建钱包的OOM是一样的,都是最后调用generateDerivedScryptKey后导致:创建钱包可以创建一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年人民版九年级生物下册阶段测试试卷含答案
- 2025年华师大新版选修4化学下册阶段测试试卷含答案
- 2025年沪科版第二册生物上册月考试卷
- 2025年人教新课标七年级生物下册阶段测试试卷含答案
- 2025年粤教沪科版八年级科学上册月考试卷含答案
- 2025年沪教版九年级历史上册阶段测试试卷含答案
- 2025年新世纪版七年级物理上册阶段测试试卷含答案
- 2025年华东师大版必修3历史上册月考试卷含答案
- 2025年度网络文字处理专家劳动合同4篇
- 2025年度智能门窗系统销售安装与升级合同4篇
- 2025年度版权授权协议:游戏角色形象设计与授权使用3篇
- 心肺复苏课件2024
- 《城镇燃气领域重大隐患判定指导手册》专题培训
- 湖南财政经济学院专升本管理学真题
- 全国身份证前六位、区号、邮编-编码大全
- 2024-2025学年福建省厦门市第一中学高一(上)适应性训练物理试卷(10月)(含答案)
- 《零售学第二版教学》课件
- 广东省珠海市香洲区2023-2024学年四年级下学期期末数学试卷
- 房地产行业职业生涯规划
- 江苏省建筑与装饰工程计价定额(2014)电子表格版
- MOOC 数字电路与系统-大连理工大学 中国大学慕课答案
评论
0/150
提交评论