Back to tech

Android の hardware accelerated の実装における個人メモ

2 min read
Table of Contents

業務で Android の機能である hardware accelereted について調査する機会がありました

hardware accelereted は便利なものである一方でよく知っておかないとアプリの表示関連に悪影響を与えることがわかりました

もうちょっと深くまで知りたいなぁということでプライベートで色々しらべたことをまとめます

あくまで個人的見解です

hardware accelereted とは

hardware accelereted は Android 3.0 ( API 11) 以降に使用できる View で行われる描画を GPU のリソースを用いて行うことができる機能です

この機能を用いることで描画が高速にできる可能性がある一方で、 RAM を多く消費します

この RAM の消費が重要なポイントです

なんでもかんでも GPU で描画すると、描画の乱れが多々発生します

そのため、個々のレイヤに合わせて hardware accelereted のオン・オフをすることが望ましいです

一応、APIレベルが 14  の場合は hardware accelereted はデフォルトで有効になっています

そのため、描画の乱れがある場合ははじめにこの機能を疑ってみるのが良いです

hardware accelerete の制御

hardware accelereted は大きく分けて 4 領域で制御することが可能です

  • Application
  • Acitivity
  • Window
  • View

Application

APP すべてを hardware accelereted の有効・無効に設定することができます

AndroidManifest.xml の Application タグで以下の属性を追加すると有効になります

<application android:hardwareAccelerated = "true" ... >

無効にしたいのであれば、 true のところを false にすればおkです

Acitivity

個々の Activity に対して hardware accelereted を有効・無効にすることができます

メモ: Activity とは onCreate() でページを制御するやつ, ページ遷移するときにお世話になるやつ

AndroidManifest.xml の activity タグで以下の属性を追加すると有効になります

<application>
    <activity android:hardwareAccelerated="true" />
</application>

無効にしたいのであれば、 true のところを false にすればおkです

また、一部の Activity に対して hardware accelereted を無効にすることもできます

<application android:hardwareAccelerated="true">
    <activity android:hardwareAccelerated="false" />
</application>

Window

Activity よりも下のレイヤである window でも細かく設定できます

また、このレベルでは今日 (2019/09/02) において、 hardware accelereted を有効のみの設定です

getWindow().setFlags(
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
    WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);

getWindow().setFlags について調べると、 Activity レベルと動作一緒じゃないかぁと思うのですが違うのでしょうか

getWindow().setFlags で window 全体をもらうのであれば、activity タグでもおんなじような動作だと思われ

ここの回答お待ちしています

View

個々の View に対しても hardware accelereted の設定をすることができます

具体的には TextView や Button です

注意として hardware accelereted は今日(2019/09/02)時点においては無効のみしかできません

myView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

TextViewに追加する例を上げておきます

import android.widget.TextView;

private TextView myTextView;

@Override
protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  myTextView = findViewById(R.id.textview);
  myTextView.setLayout((View.LAYER_TYPE_SOFTWARE, null);
}

その他

Application レベルで hardware accelereted を有効にしつつ、View レベルで各々無効にするのが良いかと

参考