業務で 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 レベルで各々無効にするのが良いかと
参考
- Android Developers, Hardware acceleration, https://developer.android.com/guide/topics/graphics/hardware-accel