すべてのプロダクト
Search
ドキュメントセンター

Mobile Platform as a Service:Portal プロジェクトと Bundle プロジェクト

最終更新日:Mar 01, 2026

重要
  • ベースライン 10.2.3 以降を使用する場合は、ネイティブ AAR 方式を使用してください。

  • コンポーネントベースの接続タイプ (Portal & Bundle) を使用するには、Android Studio Flamingo (2022.2.1) 以前のバージョンが必要です。

コンポーネントベースのフレームワークは、Open Service Gateway Initiative (OSGi) テクノロジーに基づく mPaaS フレームワークです。アプリを、ビジネスから独立した 1 つ以上の Bundle プロジェクトと 1 つの Portal プロジェクトに分割します。mPaaS は各 Bundle プロジェクトのライフサイクルと依存関係を管理し、Portal プロジェクトはすべての Bundle プロジェクトパッケージをマージして、実行可能な .apk パッケージを生成します。

mPaaS フレームワークは、チームベースのアプリ開発に最適です。コンポーネントの初期化やインストルメンテーションなどの機能が含まれており、mPaaS コンポーネントを簡単に統合できます。

Bundle プロジェクト

従来のネイティブプロジェクトは、メインモジュールと、オプションでいくつかのサブモジュールで構成されます。mPaaS の Bundle プロジェクトは、通常、app という名前のメインモジュールといくつかのサブモジュールで構成されます。

たとえば、Alipay では、Bundle は通常、app という名前のメインモジュールと、次の 3 つのサブモジュールで構成されます。

  • api:インターフェイス定義のみを含みます。

  • biz:インターフェイスの実装を含みます。

  • ui:アクティビティ、カスタムビュー、その他の UI 関連コンポーネントを含みます。

説明

Bundle には、api という名前のサブモジュールが少なくとも 1 つ必要です。このサブモジュールがないと、Bundle のインターフェイスパッケージを作成できず、他の Bundle がそれに依存できなくなります。

このトピックでは、次の観点から Bundle プロジェクトについて説明します。

Bundle プロジェクトと従来のプロジェクトの相違点

Bundle は本質的にネイティブプロジェクトです。主な違いは、mPaaS の Apply プラグインプロジェクトメインモジュール、およびサブモジュールbuild.gradle ファイルに追加される点です。相違点は次のファイルにあります。

  • プロジェクトのルートディレクトリにある build.gradle ファイル

  • メインモジュールの build.gradle ファイル

  • サブモジュールの build.gradle ファイル

プロジェクトのルートディレクトリの build.gradle

プロジェクトのルートディレクトリにある build.gradle ファイルに、mPaaS プラグインへの依存関係が追加されます。

説明

プラグインのバージョンは、新しい反復で機能が追加されるにつれて上がる可能性があります。

classpath 'com.alipay.android:android-gradle-plugin:3.0.0.9.13'

image.png

メインモジュールの build.gradle

メインモジュールの build.gradle ファイルに、mPaaS Bundle の Apply プラグインの宣言が追加されます。これにより、プロジェクトが Bundle プロジェクトであることが示されます。Bundle の構成は次のとおりです。

apply plugin: 'com.alipay.bundle'

次の構成もメインモジュールの build.gradle ファイルに追加されます。image

ここで、

  • version:この Bundle のバージョン。

  • group:この Bundle のグループ ID。

  • exportPackages:現在の Bundle プロジェクトのすべてのクラスを含むパッケージ名を指定します。親パッケージ名を指定できます。静的にリンクされていない Bundle の場合は、exportPackages を指定する必要があります。指定しない場合、クラスのロードに失敗する可能性があります。たとえば、すべてのコードが com.alipay.democom.alipay.bundle の下にある場合、exportPackagescom.alipay を指定できます。また、com.alipay.democom.alipay.bundle を指定することもできます。一般的すぎる、または具体的すぎるパッケージ名の使用は避けてください。

  • initLevel:起動時にフレームワークがこの Bundle をロードするタイミングを指定します。有効値は 0 から 100 です。値が小さいほど、Bundle は早くロードされます。値 11110000 は遅延読み込みを示し、Bundle がオンデマンドでロードされることを意味します。

  • packageId:現在の Bundle のリソース ID を指定します。この ID は aapt パッケージングに必要であり、マルチ Bundle アーキテクチャでは各 Bundle で一意である必要があります。現在 mPaaS で使用されている packageId は次のとおりです。

Bundle

packageId

com.alipay.android.phone.thirdparty:androidsupportrecyclerview-build

28

com.alipay.android.phone.mobilesdk:framework-build

30

com.alipay.android.phone.rome:pushservice-build

35

com.alipay.android.phone.sync:syncservice-build

38

com.alipay.android.phone.wallet:nebulabiz-build

41

com.alipay.android.phone.mobilecommon:share-build

42

com.alipay.android.phone.wallet:nebulacore-build

66

com.alipay.android.mpaas:scan-build

72

com.alipay.android.phone.wallet:nebula-build

76

com.alipay.android.phone.securitycommon:aliupgrade-build

77

dependencies に、次の mPaaS 依存関係が追加されます。

dependencies {
    compile project(":api")
    apt 'com.alipay.android.tools:androidannotations:2.7.1@jar'
    //mPaaS dependencies
    provided 'com.alipay.android.phone.thirdparty:fastjson-api:1.1.73@jar'
    provided 'com.alipay.android.phone.thirdparty:androidsupport-api:13.23@jar'
}

サブモジュールの build.gradle

サブモジュールの build.gradle ファイルに、mPaaS の Apply プラグインの宣言が追加されます。これにより、プロジェクトが Bundle のサブモジュールであることが示されます。このプロセスにより、最終的に Bundle のインターフェイスパッケージが作成されます。

apply plugin: 'com.alipay.library'

dependencies に、次の mPaaS 依存関係が追加されます。

dependencies {
    apt 'com.alipay.android.tools:androidannotations:2.7.1@jar'
    //mPaaS dependencies
    provided "com.alipay.android.phone.thirdparty:utdid-api:1.0.3@jar"
    provided "com.alipay.android.phone.mobilesdk:framework-api:2.1.1@jar"
}

Bundle のプロパティ

このフレームワークの Bundle プロパティの設計は OSGi Bundle に基づいていますが、よりシンプルで軽量です。

次の表に、Bundle のプロパティとその説明を示します。

プロパティ

説明

Bundle-Name

Bundle 名。build.gradle ファイルの groupsettings.gradle ファイルで定義された name から派生します。

Bundle-Version

Bundle のバージョン。build.gradle ファイルの version から取得されます。

Init-Level

Bundle のロード時間。build.gradle ファイルで定義された init.level プロパティから取得されます。

Package-Id

Bundle のリソースのパッケージ ID。build.gradle ファイルで定義されたプロパティから取得されます。

Contains-Dex

Bundle に DEX ファイルが含まれているかどうかを示します。コンパイルプラグインがこれを自動的に決定します。

Contains-Res

Bundle にリソースが含まれているかどうかを示します。コンパイルプラグインがこれを自動的に決定します。

Native-Library

Bundle に含まれる .so ファイル。コンパイルプラグインがこれを自動的に決定します。

Component-Name

AndroidManifest.xml ファイルで定義された ActivityServiceBroadcastReceiver、および ContentProvider から取得されます。

exportPackages

この Bundle のすべてのクラスを含むパッケージ名。詳細については、メインモジュールの build.gradle ファイルをご参照ください。

Bundle のインターフェイスパッケージ

Bundle には、biz、api、ui などの複数のサブモジュールを含めることができます。Bundle をコンパイルしてパッケージングすると、各サブモジュールは .jar フォーマットのインターフェイスパッケージを生成します。他の Bundle は api インターフェイスパッケージを使用できます。

パッケージング中に、Bundle プロジェクトパッケージも生成されます。このプロジェクトパッケージにはすべてのサブモジュールが含まれており、Portal プロジェクトで使用できます。プロジェクトパッケージは Portal でコンパイルされ、最終的な .apk パッケージが生成されます。

  • Bundle のサブモジュールから作成されたインターフェイスパッケージには、定義された Java または Kotlin のインターフェイスクラスのみが含まれます。res ディレクトリ内のリソースなど、他のリソースは含まれません。api という名前のサブモジュールのみが、これらのインターフェイスパッケージを生成できます。

  • Bundle プロジェクトは、インターフェイスパッケージを介して相互に依存します。依存関係を作成するには、Bundle の build.gradle ファイルの dependency セクションで構成する必要があります。たとえば、Bundle A が Bundle B の bapi サブモジュールに依存する場合、Bundle A の対応するサブモジュールの build.gradle ファイルの dependency セクションで bapi への依存関係を構成します。

    provided "com.alipay.android.phone:bundleB:1.0.1:bapi@jar"
  • 依存関係の groupId:artifactid:version:classifier は、Bundle で宣言されたグループ、名前、バージョン、およびサブモジュール名に対応します。

  • デフォルトでは、Bundle の名前はメインモジュールのフォルダ名です。次のコードに示すように、settings.gradle で変更できます。この例では、app はメインモジュールのプロジェクト名です。

    include ':api', ':xxxx-build'
    project(':xxxx-build').projectDir = new File('app')

Bundle のプロジェクトパッケージ

  • Bundle プロジェクト全体から作成された .jar パッケージは、実際には .apk フォーマットのファイルですが、.jar 拡張子が付いています (例: framework-build.jar)。

  • Portal で Bundle に依存するには、次に示すように、Portal のメインモジュールの build.gradle ファイルの dependency セクションで Bundle パッケージへの依存関係を宣言します。

    dependencies {
        bundle "com.alipay.android.phone.mobilesdk:framework-build:version@jar"
        manifest "com.alipay.android.phone.mobilesdk:framework-build:version:AndroidManifest@xml"
    }
  • Bundle パッケージには、デバッグとリリースの 2 種類があります。Portal が Bundle のデバッグ パッケージに依存する場合、依存関係に :raw を追加する必要があります。

    • ポータルがバンドルのデバッグパッケージに依存する場合: bundle "com.alipay.android.phone.mobilesdk:framework-build:version:raw@jar"

    • ポータルがバンドルのリリースパッケージに依存する場合: bundle "com.alipay.android.phone.mobilesdk:framework-build:version@jar"

説明
  • Portal をパッケージングする際は、以下を決定する必要があります。

    • どのバンドルをアプリのメイン DEX ファイルにパッケージ化するか。静的にリンクされ、ContentProvider を含むバンドルは含める必要があります。

    • どのバンドルを動的にロードするか。小規模なアプリの場合、すべてのバンドルをメイン DEX ファイルにパッケージ化できます。

  • Bundle のコードをメイン DEX ファイルにパッケージングするには、Portal の slinks ファイルで Bundle を構成します。構成フォーマットは groupId-artifactId です。artifactId が -build で終わる場合は、それを削除します。たとえば、groupId が com.mpaas.group で、artifactId が testBundle-build の場合、slinks ファイルに com.mpaas.group-testBundle という行を追加します。

  • 静的リンクは、Bundle のコードを APKclasses.dexclasses1.dexclasses2.dex、およびその他の DEX ファイルにパッケージングします。これにより、プロジェクトの起動時に Bundle 内のクラスをロードできます。

Portal プロジェクト

Portal プロジェクトは、すべての Bundle プロジェクトパッケージをマージして、実行可能な .apk パッケージを生成します。

Portal プロジェクトと従来のプロジェクトの相違点

Portal プロジェクトと従来のプロジェクトの違いは、build.gradle ファイルにあります。

  • プロジェクトのルートディレクトリにある build.gradle

  • メインモジュールディレクトリにある build.gradle

プロジェクトのルートディレクトリの build.gradle

次の図に示すように、com.alipay.android:android-gradle-plugin:2.1.3.2.7 プラグインが classpath に追加されます。

説明

プラグインのバージョンは、新しい反復で機能が追加されるにつれて上がる可能性があります。

image.png

このプラグインには Portal プラグインが含まれており、パッケージングプロセス中に Bundle をマージします。

  • マージされた .jar バンドル

  • バンドルの AndroidManifest のマージ

メインモジュールディレクトリの build.gradle

mPaaS の Apply Portal プラグインの宣言が追加されます。これにより、プロジェクトが Portal プロジェクトであることが示されます。Portal の構成は次のとおりです。

apply plugin: 'com.alipay.portal'

また、dependencies ブロックに対応する Bundle の依存関係を追加する必要があります。dependencies 内の文は、Portal が依存するバンドルとマニフェストを宣言します。

image

重要
  • 通常、Portal プロジェクトにコードを記述することはありません。

  • Bundle プロジェクトのスタイル、ドロワブル、文字列などの以下のタイプのリソースは、Portal プロジェクトに配置する必要があります。そうしないと、コンパイル時または実行時にリソースが見つかりません。

    • AndroidManifest.xml で使用されるリソース。

    • NotificationManager に渡されるリソース。

    • getResources().getIdentifier() メソッドを介して使用されるリソース。

    • 参照されるサードパーティの AAR パッケージに、前述の 3 種類のリソースタイプのいずれかが含まれている場合、その AAR を解凍し、対応するリソースを Portal プロジェクトにコピーする必要もあります。

プロジェクトの依存関係

mPaaS フレームワークに基づくアプリには、1 つ以上の Bundle と 1 つの Portal が含まれます。アプリには Portal プロジェクトは 1 つしか含めることができませんが、Bundle プロジェクトは複数含めることができます。

mPaaS プラグインは、Portal プロジェクト内のすべての Bundle プロジェクトパッケージをマージして、実行可能な .apk パッケージを生成します。マージ後、プラグインは Bundle プロジェクトを指定されたリポジトリにデプロイします。このリポジトリアドレスは、次のコードに示すように、Bundle のメインモジュールの build.gradle ファイルで定義されます。

uploadArchives {
    repositories {
        mavenLocal()
    }
}

デフォルトでは、このアドレスはローカルの ~/.m2 リポジトリを指してアップロードされます。次に示すように、カスタムリポジトリアドレスを追加することもできます。

mavenDeployer {
    mavenLocal()
    repository(url: "${repository_url}") {
        authentication(userName: 'userName', password: 'userName_pwd')
    }
    snapshotRepository(url: "${repository_url}") {
        authentication(userName: 'userName', password: 'userName_pwd')
    }
}

アップロード後、Bundle は指定されたリポジトリで groupid:artifactid:version:classifier@type のフォーマットで使用可能になります。したがって、次に示すように、Portal のメインモジュールの build.gradle ファイルの dependency セクションで宣言することにより、各 Bundle の依存関係を指定できます。

dependencies {
    bundle 'com.alipay.android.phone.mobilesdk:quinox-build:2.2.1.161221190158:nolog@jar'
    manifest 'com.alipay.android.phone.mobilesdk:quinox-build:2.2.1.161221190158:AndroidManifest@xml'
}

同様に、Bundle プロジェクト間の依存関係については、依存する Bundle のルート build.gradle ファイルでリポジトリアドレスを宣言する必要があります。

重要

次の構成の usernamepassword は、コンソールのログイン認証情報ではありません。これらの値を取得するには、ID 145930007362 の DingTalk グループを検索して参加してください。パラメーターは次のように説明されます。

  • mavenLocal() は、依存関係のローカルリポジトリアドレスを指定します。

  • maven{} は、依存関係のリモートリポジトリアドレスを宣言します。

allprojects {
    repositories {
        mavenLocal()
        mavenCentral()
        maven {
            credentials {
                username "{username}"
                password "{password}"
            }
            url "http://mvn.cloud.alipay.com/nexus/content/repositories/releases/"
        }
    }
}

Bundle のコンパイルとパッケージングの結果

mPaaS プラグインを使用して Bundle をコンパイルしてパッケージングすると、プロジェクトパッケージ (.jar パッケージ) が生成されます。詳細については、「Bundle のプロジェクトパッケージ」および「Bundle のインターフェイスパッケージ」をご参照ください。

プロジェクトパッケージは、groupid:artifactid:version:classifier@type フォーマットで指定されたリポジトリに公開されます。公開リポジトリアドレスは、次の例に示すように、Bundle のメインモジュールの build.gradle ファイルで定義されます。

uploadArchives {
    repositories {
        mavenLocal()
    }
}

上記の設定では、公開リポジトリとしてローカルの Maven リポジトリ (mavenLocal) を指定しています。ローカルの Maven リポジトリアドレス (デフォルト: ~/.m2) を変更したり、公開リポジトリを追加したりするには、「公開リポジトリの構成」をご参照ください。

Bundle の依存関係の追加

Portal 内から Bundle への依存関係を追加したり、ある Bundle から別の Bundle への依存関係を追加したりできます。そのためには、次の手順に従います。

  1. Portal または Bundle のルート build.gradle ファイルで依存関係リポジトリアドレスを宣言します。依存関係リポジトリは、Bundle の公開リポジトリに対応している必要があります。依存関係リポジトリの構成方法の詳細については、「依存関係リポジトリの構成」をご参照ください。

  2. Portal または Bundle のメインモジュールの build.gradle ファイルで dependencies を宣言できます。次の例は、quinox Bundle への依存関係を追加する方法を示しています。

dependencies {
    bundle 'com.alipay.android.phone.mobilesdk:quinox-build:2.2.1.161221190158:nolog@jar'
    manifest 'com.alipay.android.phone.mobilesdk:quinox-build:2.2.1.161221190158:AndroidManifest@xml'
}

関連トピック