Существующие приложения Android генерируют AAR и интегрируются в другие приложения (локальный AAR).

1. Предполагая, что проект A уже существует и он намерен создать aar из проекта A.

(1) Измените плагин для применения: «com.android.application» , чтобы применить плагин: «com.android.library» в build.gradle основного приложения
(2) Измените defaultConfig {} в build.gradle основного приложения ApplicationId удаляется
, как показано на рисунке ниже: (3) Обработайте файл AndroidMenifest.xml
вставьте сюда описание изображения
в подключаемом приложении . Удалите активность запуска, а другие активности не нужно экранировать, просто сохраните их. Здесь он должен быть заблокирован, потому что, когда приложение загружает aar, файл AndroidMenifenst будет автоматически объединен с файлом манифеста основного приложения. В противном случае в файле манифеста основного приложения будет два действия при запуске. После завершения модификации в соответствии с вышеуказанными шагами просто пересоберите проект, после чего будет сгенерирован файл aar.Путь следующий: Следует отметить, что в моей демонстрации добавлен переход на внутреннюю страницу aar, в основном для проверки того, aar - это то же самое, что и установка apk. Может ли он прыгать сам по себе, и есть ли у него полный жизненный цикл.
вставьте сюда описание изображения


вставьте сюда описание изображения

2. Используйте аар

Создайте новый демонстрационный проект основного приложения
(1) Поместите файл aar прямо сейчас в папку app/libs.
вставьте сюда описание изображения

(2) Добавьте узел android{} в app/build.gradle:

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, чтобы обнаружить, что все AndroidMenifest в aar были объединены в список основного приложения.
Возникла проблема при запуске теста apk:

  • Основной apk открывает домашнюю страницу и переходит на домашнюю страницу aar.
  • Сбой происходит после перехода на страницу внутри aar.

Решение : проанализируйте apk и обнаружите, что файл макета в основном приложении и файл макета в aar имеют одно и то же имя, в результате чего файл макета aar перезаписывает файл макета основного apk после его упаковки в 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);
    }

После тестирования проблем с внутренним скачком аара нет.

Содержимое объединенного файла манифеста AndroidMenifest фактического apk размещено ниже для справки:

<?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 и предоставления демоверсии, которую удобнее вызывать другим приложениям.

  • Пакет слишком велик при интеграции нескольких aars.

  • Как основное приложение обращается к aar, чтобы решить проблему кросс-процесса.

  • Что делать, если подприложение имеет несколько модулей?Если несколько модулей зависят от упаковки в пакет aar для вызова другими приложениями

  • Как решить проблемы с версией aar

Вышеуказанные проблемы могут встречаться в реальных проектах, и конкретные проблемы должны быть детально проанализированы.

Подведем итог

Если вы хотите использовать этот метод для интеграции apk, он все еще немного сложен. Особенно, когда подприложение слишком велико или имеет сложную архитектуру, оно может столкнуться с более сложными проблемами интеграции. Таким образом, довольно сложно сделать хорошую работу по интеграции.
Я также обсужу вышеуказанные проблемы как можно скорее, и узнаю соответствующие решения в реальных боях.Жду вашего внимания.

Supongo que te gusta

Origin blog.csdn.net/superzhang6666/article/details/126529475
Recomendado
Clasificación