【移动应用开发技术】Android Web3j OOM解决详解_第1页
【移动应用开发技术】Android Web3j OOM解决详解_第2页
【移动应用开发技术】Android Web3j OOM解决详解_第3页
【移动应用开发技术】Android Web3j OOM解决详解_第4页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论