本稿は「Qt 6.9 - Android Updates」の抄訳です。
Qt 6.9 では、Android プラットフォームをターゲットとする開発者の開発プロセスを改善するために、いくつかの便利な新機能が追加されました。
注意)以下のリストは、Android 用の Qt に関するすべての変更点を網羅しているわけではありません。また、いくつかの機能は別のブログで紹介される場合があります。
Android 6 およびそれ以降のバージョンでは、デフォルトでAPKの一部となっている非圧縮ネイティブライブラリがサポートされます。しかし、Qtは build.gradle
の下でこの機能を明示的に無効化していました。
android {
...
packagingOptions.jniLibs.useLegacyPackaging true
...
}
あるいは、現在では廃止された extractNativeLibs
マニフェスト フラグを使用していました。なぜならQt は APK からライブラリを直接読み込むことをサポートしていなかったからです。このリリースでは、共有ライブラリをディスクに展開することなく、APK から共有ライブラリを直接読み込み、読み込むことをサポートしています。Qt アプリおよび QLibrary や QPluginLoader などの API は以前と同じように動作し、ネイティブ ライブラリ ディレクトリの下のライブラリを反復処理します。
このモードが有効になっているときに考慮すべきことがいくつかあります (6.9以降ではデフォルトで有効になっています)。たとえば、QCoreApplication::applicationDirPath()
は、アプリの APK 内にある共有ライブラリのファイル名を指すパスを返すようになります。
/data/data/package-path/base.apk!/lib/arm64-v8a/libmyapp_arm64_v8a.so
同様のAPIコールによって返されたパスは、以前は書き込み可能なパスを返していましたが、今後は書き込み不可能なパスを返します。
これを有効にすると、生成される APK の合計サイズがわずかに増加するかもしれませんが、インストール後のディスク容量が節約され、Play ストアからの更新サイズも節約され、起動がわずかに速くなります。詳細については、Google Play でのより小さいアプリのダウンロードのための改善を参照してください。
圧縮ライブラリを使用する古い方法を使っているアプリは、上記のように関連するフラグが明示的に有効になっていれば、これまでどおり動作します。
Android 向けに開発する場合、ほとんどの場合、ビルドとデプロイ、およびアプリの実行を処理する IDE を使用することが期待されます。そのプロセスはそれほど複雑ではないので、そのジョブを処理するラッパースクリプトを追加しました。特にCI環境や、軽量なコードエディターとターミナルで開発することに慣れている人にとっては、非常に便利な機能です。プロジェクトのAPKをビルドし、以下のようにアプリを実行するだけです。
cd build
qt-cmake -S ... -B .-GNinja
cmake --build .--target apk
MY_ENV_VAR=value ./my_app --install --my_arg value
この最後のコマンドは、アプリをデバイスにインストールし、アプリを起動し、アプリのlogcat
を出力することで、シームレスなエクスペリエンスを実現し、手間を省くなど、基本的なadb
コマンドを裏ですべて処理します。Windowsの場合、ランナーは.bat
という拡張子を持ちます。
シェルから直接環境変数を渡すことができるので、最終的にデバイス上のアプリのランタイムに渡されます。同じことがコマンドラインの引数にも適用され、ランナーによって予約されていない引数は、アプリの引数として渡されます。ラッパーが受け付ける全てのパラメーターについて、 --help
で呼び出します。
同じことが自動テストにも当てはまります。簡単に次のように実行することができます。
cd build
QTEST_FUNCTION_TIMEOUT=900000 ./tst_android test_case_1
そして、これは単純にandroidtestrunner
ですべてを処理します。この場合、androidtestrunner
が処理してくれるので、手動でAPKビルドコマンドを発行する必要はありません。
私たちは Android ビルドと CMake の統合を改善し続け、Android 固有の要件を管理および保守しやすくしています。以下はその新機能です。
Android アプリのパーミッションを管理するには、多くの場合、AndroidManifest.xmlを手動で編集する必要があります。新しい qt_add_android_permission() 機能は、CMakeLists ファイル内で直接パーミッションを宣言できるようにすることで、この手間を省きます。この関数は、Qt モジュールの管理されたパーミッションの自動インクルードを可能にします。このアプローチはプロジェクト管理を簡素化し、プロジェクトの設定を 1 か所にまとめることで、よりわかりやすくします。
アプリの名前の設定は、CMakeの設定の中でQT_ANDROID_APP_NAME を指定するのと同じくらい簡単になりました。AndroidManifest.xml
ファイルでアプリの名前を手動で設定する必要はもうありません。同様に、QT_ANDROID_APP_ICON を使用して、プロジェクトの CMake 設定でアプリのアイコンを描画可能にしたり、ミップマップとして定義したりできるようになりました。これは、適切な Android リソース ディレクトリ階層の下にアイコン drawables があることと、QT_ANDROID_PACKAGE_SOURCE_DIR の使用を想定しています。
新しいプロパティQT_ANDROID_COMPILE_SDK_VERSION Java コードをコンパイルするための Android SDK バージョンを指定できます。このプロパティを使用すると、プロジェクトが常に希望する API レベルに対してビルドされるようにすることができます。
バックグラウンド処理、特に UI の更新を含む処理は、適切に管理されない場合、パフォーマンスのボトルネックの原因になる可能性があります。これに対して、開発者は新しい環境変数 QT_ANDROID_BACKGROUND_ACTIONS_QUEUE_SIZE を設定することにより、キューに入るバックグラウンド UI イベントの最大数を設定できるようになりました。
この機能拡張は、キューで待機しているタスクの数が多すぎることによる潜在的なメモリ過負荷を防ぎます。制限を定義することにより、開発者はよりスムーズなパフォーマンスを提供し、アプリの遅延や応答しない動作を防ぐことができます。
今回は以上です!私たちは常に Qt for Android の改良を続けています。このブログの投稿、または bugreports.qt.io でのフィードバックや提案を歓迎します。