1. プロジェクト A がすでに存在し、プロジェクト A から aar を生成すると仮定します。
(1)メインアプリの build.gradle 下のapply plugin: 'com.android.application'をapply plugin: 'com.android.library' に
変更 (2)メインアプリの build.gradle 下のdefaultConfig {}を変更以下の図のように削除されます。 (3)プラグインアプリケーションでAndroidMenifest.xmlファイルを処理します。スタートアップ アクティビティを削除すると、他のアクティビティはシールドする必要がなく、そのまま保持してください。アプリケーションが aar をロードすると、AndroidMenifenst ファイルがメイン アプリケーションのマニフェスト ファイルに自動的にマージされるため、ここでブロックする必要があります。それ以外の場合、メイン アプリケーションのマニフェスト ファイルには 2 つの起動アクティビティが存在します。上記の手順で修正が完了したら、プロジェクトをリビルドするだけで、パスは次のようになります: aar ファイルが生成されます。 aar は apk のインストールと同じかどうか、それ自体でジャンプできるか、完全なライフサイクルがあるかどうか。
2.aarを使用する
新しいデモメインアプリケーションプロジェクトを作成します
(1) 先ほどの aar ファイルを app/libs の下に置きます
(2) app/build.gradle の下に android{} ノードを追加します。
repositories {
flatDir {
dirs 'libs'
}
}
そして依存関係を導入します
implementation(name:'app-debug',ext:'arr')
ビルド後にエラーが見つかりました:
Build was configured to prefer settings repositories over project repositories but repository 'flatDir' was added by build file 'build.gradle'
上記の方法はgradle7以下のバージョンでは問題ありません。gradle7+ バージョンの場合は、次の解決策が必要です。
dependencies {
implementation fileTree(include: ['*.jar','*.aar'], dir: 'libs')
implementation(name:'app-debug',ext:'arr')
}
または:
implementation fileTree("libs\\sdk_Login.aar") // 括号内是aar包相对路径
firDir を記述する必要はありません。
(3) ビルド時にそれらが競合する問題が発生します。アプリケーションタグを追加します。
(4) apk をパッケージ化し、apk を分析して、aar 内のすべての AndroidMenifest がメイン アプリケーションのリストにマージされていることを確認します。
APK テストの開始で問題が発生しました:
- メイン APK はホームページを開き、aar のホームページにジャンプします
- aar 内のページにジャンプするとクラッシュが発生します。
解決策: APK を分析し、メイン アプリケーションのレイアウト ファイルと aar のレイアウト ファイルが同じ名前であることを確認します。これにより、apk にパッケージ化された後、aar レイアウト ファイルがメイン APK のレイアウト ファイルを上書きします。このとき、アプリケーション本体のレイアウトファイル名を変更します。
メイン アプリケーションのホームページ:
「クリック」をクリックして aar のホームページにジャンプします。
メイン ページから aar ページへのジャンプ コードは次のとおりです。 ここで、com.dic.firstandroidproject.MainActivity は aar のホームページです。
public void go(View view) {
Intent intent = new Intent();
intent.setClassName(this,"com.dic.firstandroidproject.MainActivity");
startActivity(intent);
}
テストの結果、aarの内部ジャンプは問題ありませんでした。
実際の APK のマージされた AndroidMenifest マニフェスト ファイルの内容を参考のために以下に掲載します。
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="1"
android:versionName="1.0"
android:compileSdkVersion="32"
android:compileSdkVersionCodename="12"
package="com.hzs.plguin"
platformBuildVersionCode="32"
platformBuildVersionName="12">
<uses-sdk
android:minSdkVersion="21"
android:targetSdkVersion="32" />
<application
android:theme="@ref/0x7f0f01d3"
android:label="@ref/0x7f0e001b"
android:icon="@ref/0x7f0c0000"
android:debuggable="true"
android:testOnly="true"
android:allowBackup="true"
android:supportsRtl="true"
android:fullBackupContent="@ref/0x7f110000"
android:roundIcon="@ref/0x7f0c0001"
android:appComponentFactory="androidx.core.app.CoreComponentFactory"
android:dataExtractionRules="@ref/0x7f110001">
<activity
android:name="com.hzs.plguin.MainActivity"
android:exported="true">
<intent-filter>
<action
android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
// 以下是aar的
<activity
android:name="com.dic.firstandroidproject.DisplayMessageActivity"
android:parentActivityName="com.dic.firstandroidproject.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
<activity
android:name="com.dic.firstandroidproject.SecondActivity"
android:parentActivityName="com.dic.firstandroidproject.MainActivity">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity" />
</activity>
<activity
android:name="com.dic.firstandroidproject.MainActivity" />
</application>
</manifest>
ここまでで簡単なデモは終わりましたが、予想を立てると色々な問題がありそうです
-
リソース競合の問題
-
サードパーティの依存関係の問題の読み込み
-
アプリケーションのマージの問題
記事を参照してください: Android は他のアプリケーションの SDK (aar) を統合してアプリケーションのマージを実現する方法
-
モジュールを使用して aar を再カプセル化し、他のアプリケーションが呼び出すのに便利なデモを提供する方法。
-
複数の aar を統合する場合、パッケージが大きすぎます。
-
メインアプリケーションは aar にアクセスし、プロセス間の問題をどのように解決しますか。
-
サブアプリケーションに複数のモジュールがある場合はどうすればよいですか? 複数のモジュールが、他のアプリケーションが呼び出すために aar パッケージにパッケージ化することに依存している場合
-
aar バージョンの問題を管理する方法
実際のプロジェクトでは上記の問題が発生する可能性があり、具体的な問題を詳細に分析する必要があります。
要約する
この方法を使用して APK を統合する場合は、まだ少し複雑です。特にサブアプリケーションが大きすぎる場合、またはアーキテクチャが複雑な場合、より複雑な統合の問題に直面する可能性があります。このように、統合をうまく行うことは非常に困難です。
上記の問題についても早急に議論し、実戦での対応策を見つけていきたいと思いますので、よろしくお願いいたします。