ハードウェアアクセラレーションの罠

久しぶりにAndroidでカスタムViewを書いている。内容はiOSで作ったUIViewからの移植であり、画像の加工前のプレビューを表示するものだ。技術的には別に難しくは無いのだが、画像をassetからロードするとエミュレータでは発生しなかった例外が出る。

サンプルコード
  //アセットに配置したイメージをロードする
  try {
     InputStream is = context.getResources().getAssets().open("sample.png");
      this.setImageBitmap(BitmapFactory.decodeStream(is));
  } catch (IOException e) {
      e.printStackTrace();
  }
発生した例外

11-26 13:51:28.825: W/OpenGLRenderer(9048): Bitmap too large to be uploaded into a texture (1661x2252, max=2048x2048)

2048x2048ピクセル以上の画像をロードすることはできないらしい。OpenGLRendererを使っているということはOpenGLの制限か。
ということはGPUアクセラレーションが有効になっていることかと開発者向け設定画面を見ると


GPUレンダリングは常時有効になってはいない。 なぜだ??

Hardware Acceleration | Android Developers

なるほどICSからは基本有効で、更に色々なレイヤでアクセラレーションの有効無効を設定できるのね。
とりあえずViewレベルでアクラレーションを無効にする場合は

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

で良いようだ。(ただし、API Level11から使用可能)