Android の既存のアプリケーションは AAR を生成し、他のアプリケーションに統合します (ローカル AAR)

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 を統合する場合は、まだ少し複雑です。特にサブアプリケーションが大きすぎる場合、またはアーキテクチャが複雑な場合、より複雑な統合の問題に直面する可能性があります。このように、統合をうまく行うことは非常に困難です。
上記の問題についても早急に議論し、実戦での対応策を見つけていきたいと思いますので、よろしくお願いいたします。

おすすめ

転載: blog.csdn.net/superzhang6666/article/details/126529475