前人未踏の領域へ Androidアプリ開発編

Androidアプリ開発に関する調査メモ置き場。古い記事にはアプリ以外も含まれます。

build.gradle.kts:apply falseの役割

以下、AI Chatにお尋ねしてみた。


apply false は Gradle における設定で、プラグインの適用をサブプロジェクト内で手動で行うようにする命令です。これには具体的な機能と目的があります。

1. 基本的な意味

apply false を付けると、プラグイン現在のファイルでは有効化しない(適用しない)という指定を行います。
ただし、このファイルでプラグインを宣言するときの情報(例えばバージョン)は、サブプロジェクトで有効に利用できるようになります。

例:

plugins {
    alias(libs.plugins.androidApplication) apply false
}
  • apply false の役割:
    • プラグイン自体の情報(バージョンや依存など)はプロジェクト全体で共有されるようになります。
    • ただし、プラグインを即座に適用するわけではなく、必要なモジュールで手動で適用します。

2. 使用例

プロジェクト全体の ./build.gradle.kts(ルートの Gradle ファイル)

plugins {
    alias(libs.plugins.androidApplication) apply false
    alias(libs.plugins.kotlinMultiplatform) apply false
}
  • ここでプラグインを宣言しますが、このファイル自身(プロジェクトレベル)にはプラグインを適用 しません
  • サブプロジェクト(たとえば composeApp)内で必要に応じて適用を行います。

サブモジュール composeApp/build.gradle.kts

plugins {
    alias(libs.plugins.androidApplication) // apply false は不要
}

android {
    namespace = "com.example.composeApp"
    compileSdk = 33
}

3. なぜ apply false を使うのか?

apply false が役立つ場面や理由を以下に挙げます。

プラグインの重複ロードを防ぐ

Gradle は、同じプラグインが複数のモジュールで適用されると、複数回ロードされる可能性があります。特に大規模プロジェクトでは、これがパフォーマンスの低下を引き起こす可能性があります。

  • 解決策: プロジェクトのルートでプラグインを宣言し、必要なサブプロジェクトでのみ適用することで、無駄を避けます。

② プロジェクトの設定と構造が分かりやすくなる

サブプロジェクトで使用可能なプラグインをルート Gradle ファイルで明確に定義できるため、どのプラグインがプロジェクトでサポートされているかが一目で分かります。

  • : ./build.gradle.kts に以下の設定を記載:
plugins {
      alias(libs.plugins.kotlinMultiplatform) apply false
  }

必要なサブプロジェクトで適用:

plugins {
      alias(libs.plugins.kotlinMultiplatform)
  }

③ プロジェクトのビルド時間を短縮

必要なプラグインのみをロードするように分けて適用することで、ビルド時間やメモリ使用量の最適化に寄与します。

④ 複数のモジュール間で共有される設定を統一

たとえば、同じ Android プラグインが複数のモジュールで使われる場合、ルートで宣言することでバージョンを統一できます。


4. apply false を使わない場合との差

apply false を使わない場合、ルートの Gradle ファイルで宣言されたすべてのプラグインが即座に適用されます。

それに比べて: - apply false を使う: プラグインはロードされるが、即適用されない。必要なモジュールでのみ適用。 - apply true(デフォルト): その場ですべてのプラグインが即適用される。

モジュールが多い場合には、適用が必要ないプラグインが他のモジュールに影響を及ぼす可能性があるため、apply false を使って制御するのが推奨されます。


まとめ

  • apply false のポイント:
    • プラグインはロードされるが、即座には適用されないようにする。
    • 必要なモジュールでのみ適用可能。
  • メリット:
    • プラグインの重複ロードを防ぐ。
    • プロジェクト構造を整理しやすくする。
    • ビルド時間を最適化する。
  • おすすめの運用方法: プラグインをルート Gradle ファイルで共通管理し、適用場所をモジュール単位で明確にする。

これによりプロジェクトが拡張しやすくなり、ビルドパフォーマンスも維持しやすくなります。

UIモジュールでAndroidTestを実行する

課題

UI用のモジュールを作成し、AndroidTestを実行しようとしたところ、いくつかエラーが発生したのでメモ

対応

モジュール側のAndroidManifestに以下を記述する

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application>
        <activity
            android:name="androidx.activity.ComponentActivity"
            android:exported="true" />
        <property
            android:name="android.adservices.AD_SERVICES_CONFIG"
            android:resource="@xml/gma_ad_services_config"
            tools:replace="android:resource" />
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="@string/ads_app_id" />
    </application>
</manifest>
  • ComponentActivityを定義
  • Manifest merger failed 対策として android.adservices.AD_SERVICES_CONFIGtools:replace="android:resource"設定
  • AdMobを使っている場合は com.google.android.gms.ads.APPLICATION_ID を追加

また、テストでespressoを使っている場合はbuild.gradleで以下の記述も必要になるかと

    configurations.configureEach {
        exclude(group = "com.google.protobuf", module = "protobuf-lite")
    }

Jetpack Compose:POBox Plusアプリで漢字、濁点が入力できない

内容

ソニーXperia端末にインストールされているキーボードアプリ、POBox Plusを使っている場合にJetpack ComposeのTextFieldで文字入力しようとすると漢字及び濁点が入力できない。

  • ComposeBomの2024.05.00 までは問題なし
  • ComposeBomの2024.06.00 からエラー発生
  • ComposeBomの最新 2024.09.03 でもエラー継続
  • Gboardアプリなら問題なし

対応

選択肢は以下の3つだが...、

  • (X)Composeの対応バージョンを下げる
  • (◯)Gboardに変更して使ってもらう
  • (X)POBoxアプリのアップデートを待つ

既にXperiaPOBox Plusのプリインストールは行われていないようなので、Gboardのインストール及びキーボードの切り替え方法を案内するのが良いだろう。

感想

Composeのバージョンをあげたタイミングで発生するのでこの時期に古いXperia端末使ってるユーザーからチラホラと報告が出てきてそうな感じ。

参考

www.sony.jp

support.google.com