ベースライン 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'
メインモジュールの build.gradle
メインモジュールの build.gradle ファイルに、mPaaS Bundle の Apply プラグインの宣言が追加されます。これにより、プロジェクトが Bundle プロジェクトであることが示されます。Bundle の構成は次のとおりです。
apply plugin: 'com.alipay.bundle'次の構成もメインモジュールの build.gradle ファイルに追加されます。
ここで、
version:この Bundle のバージョン。group:この Bundle のグループ ID。exportPackages:現在の Bundle プロジェクトのすべてのクラスを含むパッケージ名を指定します。親パッケージ名を指定できます。静的にリンクされていない Bundle の場合は、exportPackagesを指定する必要があります。指定しない場合、クラスのロードに失敗する可能性があります。たとえば、すべてのコードがcom.alipay.demoとcom.alipay.bundleの下にある場合、exportPackagesにcom.alipayを指定できます。また、com.alipay.demoとcom.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 名。 |
Bundle-Version | Bundle のバージョン。 |
Init-Level | Bundle のロード時間。 |
Package-Id | Bundle のリソースのパッケージ ID。 |
Contains-Dex | Bundle に DEX ファイルが含まれているかどうかを示します。コンパイルプラグインがこれを自動的に決定します。 |
Contains-Res | Bundle にリソースが含まれているかどうかを示します。コンパイルプラグインがこれを自動的に決定します。 |
Native-Library | Bundle に含まれる |
Component-Name |
|
exportPackages | この Bundle のすべてのクラスを含むパッケージ名。詳細については、メインモジュールの |
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 のコードを
APKのclasses.dex、classes1.dex、classes2.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 に追加されます。
プラグインのバージョンは、新しい反復で機能が追加されるにつれて上がる可能性があります。

このプラグインには Portal プラグインが含まれており、パッケージングプロセス中に Bundle をマージします。
マージされた
.jarバンドルバンドルの
AndroidManifestのマージ
メインモジュールディレクトリの build.gradle
mPaaS の Apply Portal プラグインの宣言が追加されます。これにより、プロジェクトが Portal プロジェクトであることが示されます。Portal の構成は次のとおりです。
apply plugin: 'com.alipay.portal'また、dependencies ブロックに対応する Bundle の依存関係を追加する必要があります。dependencies 内の文は、Portal が依存するバンドルとマニフェストを宣言します。

通常、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 ファイルでリポジトリアドレスを宣言する必要があります。
次の構成の username と password は、コンソールのログイン認証情報ではありません。これらの値を取得するには、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 への依存関係を追加したりできます。そのためには、次の手順に従います。
Portal または Bundle のルート
build.gradleファイルで依存関係リポジトリアドレスを宣言します。依存関係リポジトリは、Bundle の公開リポジトリに対応している必要があります。依存関係リポジトリの構成方法の詳細については、「依存関係リポジトリの構成」をご参照ください。Portal または Bundle のメインモジュールの
build.gradleファイルでdependenciesを宣言できます。次の例は、quinoxBundle への依存関係を追加する方法を示しています。
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'
}