2017-09-27 8 views
2

私は昨日更新されたGoogle Playのアプリを持っており、Androidの4.x(4.1.2 - 4.4.4)。Androidのjava.lang.OutOfMemoryErrorのみSamsungのデバイス

次のように例外のトレースがある:私は次のトレース受信他の場合には

Fatal Exception: java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:300) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:841) 
Caused by java.lang.OutOfMemoryError 
     at java.util.Arrays.copyOfRange(Arrays.java:2684) 
     at com.android.org.conscrypt.OpenSSLCipher.engineDoFinal(OpenSSLCipher.java:467) 
     at javax.crypto.Cipher.doFinal(Cipher.java:1204) 
     at com.ijsoft.cpul.Util.DbMainFunctions.com.ijsoft.cpul.Util.AES256Cipher.decrypt(DbMainFunctions.java:2059) 
     at com.ijsoft.cpul.Util.DbMainFunctions.initializeDb(DbMainFunctions.java:94) 
     at com.ijsoft.cpul.SplashActivity$InitializeDb.doInBackground$9ecd34e(SplashActivity.java:2095) 
     at android.os.AsyncTask$2.call(AsyncTask.java:288) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
     at java.lang.Thread.run(Thread.java:841) 

:エラーが発生した場合

Fatal Exception: java.lang.RuntimeException: An error occured while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:299) 
     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
     at java.lang.Thread.run(Thread.java:856) 
Caused by java.lang.OutOfMemoryError 
     at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91) 
     at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201) 
     at com.ijsoft.cpul.Util.DbMainFunctions.initializeDb(DbMainFunctions.java:90) 
     at com.ijsoft.cpul.SplashActivity$InitializeDb.doInBackground$9ecd34e(SplashActivity.java:2095) 
     at android.os.AsyncTask$2.call(AsyncTask.java:287) 
     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
     at java.lang.Thread.run(Thread.java:856) 

Iはコードの一部を残す:

AES256Cipher.java

public class AES256Cipher { 
    public byte[] decrypt(byte[] textBytes, Context context) 
      throws java.io.UnsupportedEncodingException, 
      NoSuchAlgorithmException, 
      NoSuchPaddingException, 
      InvalidKeyException, 
      InvalidAlgorithmParameterException, 
      IllegalBlockSizeException, 
      BadPaddingException { 

     byte[] keyBytes = CommonFunctions.md5Package(context).getBytes(); 
     byte[] ivBytes = new byte[16]; 
     for (int j = 0; j < keyBytes.length; j+=2) { 
      ivBytes[j/2]=keyBytes[31-j]; 
     } 

     AlgorithmParameterSpec ivSpec = new IvParameterSpec(ivBytes); 
     SecretKeySpec newKey = new SecretKeySpec(keyBytes, "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
     cipher.init(Cipher.DECRYPT_MODE, newKey, ivSpec); 
     return cipher.doFinal(textBytes); 
    } 
} 

DbMainFunctions.java

public synchronized static int initializeDb(int release, Context context) { 
     int resultCode = 0; 
     try { 
      // Get the encrypted json file (database) from Assets 
      AssetManager am = context.getAssets(); 
      InputStream is = am.open("assets"); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      byte[] buff = new byte[4096]; 
      int i; 
      while ((i = is.read(buff, 0, buff.length)) > 0) { 
       baos.write(buff, 0, i); 
      } 
      is.close(); 
      baos.close(); 
      resultCode = updateDb(baos.toByteArray(), release, context); 
      //baos.close(); 
     } catch (Exception e) { 
      Log.e("DbMainFunctions", e.getMessage()); 
      //e.printStackTrace(); 
      resultCode = -1; 
     } 
     return resultCode; 
    } 

public synchronized static int updateDb(byte[] cipherJson, int release, Context context) { 
     int resultCode = 0; 
     AES256Cipher aes256; 
     try { 
      aes256 = new AES256Cipher(); 
      cipherJson = aes256.decrypt(cipherJson, context); 
     } catch (UnsupportedEncodingException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | 
       InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException e) { 
      Log.e("DbMainFuctions", e.getMessage()); 
      return -2; 
     } 

    ... 
} 

私のアプリケーションは、その時点で行い、暗号化されたファイル(ファイル名:資産)を取得することですAPKに含ま資産ディレクトリからAES256とします。その後、ファイルは解読され、バイト配列に保存されます。このファイルのサイズは約4.4 MBです。 initializeDb()メソッドは、doInBackground()中にAsyncTaskから呼び出されます。つまり、すべての前のコードがAsyncTaskで実行されます。

答えて

4

これは、特にAndroid 5.0より前のバージョンで必ずしも4.4MBの連続した空きメモリブロックを持つ必要はありません。

セキュリティは提供されていない(誰でもあなたのファイルを解読できる)ので、CPU、バッテリー、メモリを無駄にするので、暗号化を取り除くだろう。

最低限、内容全体をメモリに読み込もうとするのをやめ、ストリーミング方式でデータを一度に復号化し(16KBなど)、復号化されたデータを出力ファイルにストリーミングします(十分なメモリがないため)。どちらかを保持する、おそらく)。

関連する問題