付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】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年柳州市壶西实验中学教育集团五菱校区秋季学期合同制教师招聘备考题库及答案详解1套
- 2025年中山大学孙逸仙纪念医院深汕中心医院放射科影像专科合同医技岗位招聘备考题库及1套参考答案详解
- 2025年四川省宜宾普什集团有限公司中层管理人员公开招聘的备考题库及参考答案详解
- 南昌高新招商集团2026届校园招聘100名备考题库有答案详解
- 人保财险阳江市分公司2026统筹校园招聘备考题库及参考答案详解
- 2025年复旦大学经济学院招聘经济学院院务办公室行政秘书岗位1名备考题库及完整答案详解一套
- 2025年巴林右旗蒙医医院招聘备考题库及答案详解1套
- 2025年上海市浦东新区肺科医院非编人员招聘备考题库及参考答案详解一套
- 2025-2030药品研发领域市场分析及创新驱动与知识产权保护研究
- 2026年南开大学滨海学院单招综合素质考试题库及答案详解(有一套)
- 2026四川成都市简阳市招聘四级城乡社区工作者65人考试备考题库及答案解析
- (2026春新版本) 苏教版科学三年级下册全册教学设计
- 2025年河北省公务员考试行测试卷真题附答案详解
- 中国移动社会招聘在线笔试题
- 全屋定制讲解方案
- 上海市奉贤区2026届初三一模英语试题(含答案)
- 《电力系统继电保护及应用》课件-110kv线路保护配置-双语
- 餐饮厨房消防安全培训
- 天津市和平区天津一中2026届高二上数学期末学业水平测试试题含解析
- GB/T 19275-2025材料在特定微生物作用下潜在生物分解和崩解能力的评价
- 2026年山东铝业职业学院单招职业技能测试必刷测试卷汇编
评论
0/150
提交评论