How can I package my Android library so that my customer does not experience errors like "AAPT: error: attribute layout_behavior"

How can I package my Android library so that my customer does not experience errors like "AAPT: error: attribute layout_behavior"

我制作了一个 Android 库,当我的客户试图将它导入到名为 mylocusmapsapplication 的项目的模块级 build.gradle 文件中时,该库无法 link。客户的应用程序中几乎没有任何内容,它是在 Android Studio 中创建的,方法是转到文件 > 新建 > 新建项目... > 空 Activity。然后我们简单地将我的库添加为依赖项。但是当他们试图编译时,它给出了以下错误:

/Users/michaelosofsky/.gradle/caches/transforms-2/files-2.1/9f0df0bf18c337fe1883aef0ec2959c5/jetified-locuslabs-android-sdk-3.0.1/res/layout/ll_levels_selector_coordinator.xml:9: AAPT: error: attribute layout_behavior (aka com.example.mylocusmapsapplication:layout_behavior) not found.

我们能够通过将以下内容添加到他们的模块级别 build.gradle 文件来解决此错误:

implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"

然而,随后我们收到了一个新的错误:

/Users/michaelosofsky/.gradle/caches/transforms-2/files-2.1/9f0df0bf18c337fe1883aef0ec2959c5/jetified-locuslabs-android-sdk-3.0.1/res/layout/ll_levels_selector_coordinator.xml:9: AAPT: error: resource string/bottom_sheet_behavior (aka com.example.mylocusmapsapplication:string/bottom_sheet_behavior) not found.

我们再次通过向模块级 build.gradle 文件添加另一个依赖项来解决这个问题:

implementation "com.google.android.material:material:1.3.0-alpha02"

然后客户能够编译,link,运行他们的项目。

但我对此解决方法不满意。所以我尝试更改我的库包含这两个依赖项的方式。

在我的库的模块级 build.gradle 文件中,我尝试将其更改为:

implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
implementation "com.google.android.material:material:1.3.0-alpha02"

为此:

api "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
api "com.google.android.material:material:1.3.0-alpha02"

我重新发布了我的库,但是当我的客户在没有上述解决方法的情况下自行尝试我的新版本库时,他们看到了相同的错误消息。

我的库使用 :coordinatorlayout: 和 :material: 库如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/ll_darkDarkTranslucent">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/llLevelSheetLayout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@null"
        app:layout_behavior="@string/bottom_sheet_behavior">

我相信 app:layout_behavior 属性是在 :coordinatorlayout: 库中定义的,它的值 @string/bottom_sheet_behavior 是在 :material: 库中定义的。

更新 1: 当我使用就地解决方法对此进行更多工作时,我发现了一堆其他依赖项也有类似的问题。以下是我的 SDK 所依赖的库,它在 运行 时导致 java.lang.NoClassDefFoundError

    implementation "androidx.coordinatorlayout:coordinatorlayout:1.1.0"
    implementation "com.google.android.material:material:1.3.0-alpha02"
    implementation "com.mapbox.mapboxsdk:mapbox-android-sdk:9.0.0"
    implementation "com.squareup.retrofit2:retrofit:2.9.0"
    implementation "com.squareup.retrofit2:converter-gson:2.9.0"
    implementation "org.kamranzafar:jtar:2.2"
    implementation "org.tukaani:xz:1.5"
    implementation "com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2"
    implementation "me.xdrop:fuzzywuzzy:1.2.0"
    implementation "androidx.fragment:fragment-ktx:1.3.0-alpha07"

我能够找到一些关于 retrofit 库的类似问题的参考资料,并且有人使用了与我相同的解决方法:https://github.com/square/retrofit/issues/3266#issuecomment-632362066

更新 2: 我从 @megasoft78 那里得到了一个很好的见解,根本原因可能是库本身可能像 中那样被错误地打包了。

我如何打包我的库,使我的客户不会遇到这些错误?

感谢@pavneet-singh,我们找到了解决这个问题的方法。 @megasoft78 是正确的,根本原因是我的库打包不正确。这是为我的图书馆更正后的 module-level build.gradle file

// This must go at the top of build.gradle
plugins {
    id 'maven-publish'
}
// This can go anywhere in the build.gradle
// I have removed my values wherever it says <MY_XXX> below
project.afterEvaluate {
    publishing {

        // How to package the library
        publications {
            library(MavenPublication) {
                from components.release
                groupId = '<MY_GROUP_ID>'
                artifactId = '<MY_ARTIFACT_ID>'
                version = '<MY_ARTIFACT_VERSION_NUMBER>'
            }
        }

        // Where to publish the library (GitLab Package Registry in my case)
        repositories {
            maven {
                url "https://gitlab.com/api/v4/projects/<MY_GITLAB_GROUP_ID>/packages/maven"
                name "GitLab"
                credentials(HttpHeaderCredentials) {
                    name = 'Job-Token'
                    value = System.getenv("CI_JOB_TOKEN")
                }
                authentication {
                    header(HttpHeaderAuthentication)
                }
            }
        }
    }
}

关键的变化是 publications 块。以下 不正确的 块是导致问题的原因:

        publications {
            library(MavenPublication) {
                groupId = '<MY_GROUP_ID>'
                artifactId = '<MY_ARTIFACT_ID>'
                version = '<MY_ARTIFACT_VERSION_NUMBER>'
                artifact bundleReleaseAar
            }
        }

请注意,我正在使用 GitLab's Package Registry instead of JitPack.io,因为在我成为付费客户后,JitPack.io 的客户服务就没有响应了。