Android Studioパッケージング-ローカルAARパッケージングへのAARネスト参照

Androidスタジオモジュールのパッケージ化は通常、aarの形式でパッケージ化されます。モジュールがローカルaarを参照している場合、参照されたaarはパッケージ化されてもパッケージ化されませんこのデザインのアイデアはより優れており、パッケージの競合の問題を回避できます。たとえば、アプリが2つのaar(1.aarと2.aar)を参照している場合、1.aarと2.aarの両方がサードパーティの3.aarに依存します(1.aarと2.aarの両方のパッケージが3.aarの場合)。アプリが再び1.aarと2.aarを参照すると、3.aarのために参照の競合が発生します。

実際の開発では、サードパーティライブラリが参照されますが、参照でどのサードパーティライブラリが使用されているかを知りたくないので、サードパーティライブラリを独自のaarに入力する必要があります。この記事では、はじめに、この状況への対処方法。

1.プロジェクトを作成する

プロジェクトのディレクトリ構造を見てください。
ここに画像の説明を挿入
上の図
には、basiclib、exlib、およびpkglib basiclibの3つのモジュールがあります。exlib によって参照されるモジュール(exlibは、basiclibによってパッケージ化されたaarを参照します)。Basiclibの内部実装は非常に簡単で、1つの文のみが出力されます。
ここに画像の説明を挿入
exlib:外部で提供する必要があるモジュール(最終的にaarの形式でパッケージ化されます)、basiclibモジュールのインターフェースを呼び出します。
ここに画像の説明を挿入
pkglib:exlibのすべての依存パッケージのパッケージ化、パッケージ化を担当します。

2. aarをパックしてネストする

pkglibは主にパッケージ化を担当し、次にpkglibのbuild.gradleの実装を確認します

apply plugin: 'java'
version = 1.0
buildscript {

    repositories {
        google()
        mavenCentral()
        jcenter()
        maven {
            url "https://maven.google.com"
        }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.3'
    }
}

repositories {
    google()
    mavenCentral()
    jcenter()
    maven {
        url "https://maven.google.com"
    }
}

dependencies {
    implementation project(':exlib') //此处填写需要打包的Android Library Project name
}

//把所有依赖的 jar 包拷贝至 build/outputs/aar/libs
task syncAllJars() {
    // 使用了绝对路径,需要根据实际情况调整
    // 将指定路径下的所有 jar 包,打包至被打包的路径下
    def dir = new File('D:\\hosh\\android\\hosh\\MqttPhone\\exlib\\libs')
    files(dir.listFiles()).each { file ->
        if (file.name.endsWith('.jar')) {
            copy {
                into buildDir.getPath() + "/outputs/aar/libs"
                from file.absolutePath
            }
        }
    }
}

// 把所有依赖的 aar 包中包含的 classes.jar
// 都拷贝到 build/outputs/aar/libs下,并重命名以不被覆盖
task syncAllAars(dependsOn:':exlib:assemble') {
    def jarName
    def aarPath
    def destDir = buildDir.getPath()+"/outputs/aar"
    // 使用了绝对路径,需要根据实际情况调整
    def dir = new File('D:\\hosh\\android\\hosh\\MqttPhone\\exlib\\libs')
    files(dir.listFiles()).each { file ->
        aarPath = file.absolutePath

        if (file.name.endsWith('.aar')) {
            jarName = "libs/" + file.name.replace(".aar",".jar")
            copy {
                from zipTree(aarPath)
                into destDir
                include "**/*"
                rename 'classes.jar', jarName
            }
        }
    }
}

// 将多个 jar 包打包成一个 classes.jar
task makeJar(type: Jar) {
    archiveName = 'classes.jar'
    def dir = new File(buildDir.getPath()+"/outputs/aar/libs")
    files(dir.listFiles()).each { file ->

        if (file.name.endsWith('.jar')) {
            from (project.zipTree(file.absolutePath))
        }
    }
    destinationDirectory = file(buildDir.getPath()+"/outputs/aar")
}

task fataar(dependsOn:[syncAllAars, syncAllJars, makeJar]) {
}

//生成最终 aar 包,libs 目录需要被排除
task genAar(dependsOn:[fataar], type: Zip) {
    def destDir = buildDir.getPath()+"/outputs/aar"
    baseName "wholeSDK"
    extension "aar"
    version '1.1'
    destinationDirectory = file('libs/')
    from destDir
    exclude "libs"
}

依存関係の前提条件があります。最初に、basiclibモジュールをパッケージ化し、basiclib-debug.aarを生成してexlibモジュールの下のlibsディレクトリにコピーし、exlibモジュールをパッケージ化してexlib-debug.aarを生成してexlibモジュールの下のlibsディレクトリにコピーする必要があります。 。
ここに画像の説明を挿入
pkglibのパッケージ化プロセスは、主にexlibモジュールのlibsディレクトリを処理することです。

最後の実行gradlew pkglib:genAar
ここに画像の説明を挿入

3.ネストされたaarをテストする

gradlew pkglib:genAarコマンドを実行すると、次のファイルが
ここに画像の説明を挿入
生成されます。中間プロセスで生成されたファイルはbuild / outputsディレクトリにあり、wholeSDK-1.1.aarは最終的にlibsディレクトリに必要です

空のプロジェクトで、wholeSDK-1.1.aarをテストします。
ここに画像の説明を挿入
ここに画像の説明を挿入
basiclibに印刷ログが表示され、パッケージングが成功したことがわかりました。

公開された34元の記事 ウォン称賛34 ビュー60000 +

おすすめ

転載: blog.csdn.net/qq_19154605/article/details/105532443