Android 库 AAR 打包资源不正确

Android library AAR packing resource incorrectly

我有一个我几年前写的库,我已经逐渐将它模块化并部署到 jfrog

https://github.com/sentinelweb/vectoroid-sdk

有 3 个模块:

vectoroid-android-base (svg read/render, 基础向量 类)

vectoroid-android-draw(绘图视图)

vectoroid-android-views(支持意见)

所以绘图模块使用基础和矢量-android-views

所以我一直在更新它,因为我想用它构建一个应用程序,但是支持视图库有问题

vectoroid-android-views 没有将资源放在 AAR 文件中的正确文件夹中,res(可绘制、布局等)下的文件夹应该位于 AAR 的顶层,但出于某些原因有一个 res 文件夹,drawable 文件夹和资源都放在那里。所以看起来有一个错误的源集或其他东西 - 仅用于视图模块,另一个似乎正确构建。

github: https://github.com/sentinelweb/vectoroid-sdk

回购是:git clone https://github.com/sentinelweb/vectoroid-sdk.git

然后:cd vectoroid-sdk

分支是:git checkout maintenance/update_build_2019

然后 ~./gradle/gradle.properties

中的这些键
SW_JCENTER_API_KEY=xxx
SW_JCENTER_USER=xxx

并构建 AAR 其:./gradlew install

然后在 vectoroid-android-views/build/outputs/aar/vectoroid-android-views-release.aar -> .zip -> 解压缩 - 正如我所说,资源应该在顶级文件夹中,但它们在 res 文件夹下。因此,当使用绘制模块时,出现以下构建错误。

Caused by: com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource linking failed
/Users/robmunro/.gradle/caches/transforms-2/files-2.1/924af02d6aaccd5e74b8bf41ac8ad0bc/res/values/values.xml:168:5-177:10: AAPT: error: resource drawable/butt_short (aka uk.co.sentinelweb.rememe:drawable/butt_short) not found.

而且,呃,代码非常糟糕 - 我 8 年前写的 - 希望从那时起我已经成长为一名开发人员 ;) - 它会得到修复。

AAR 的结构是正确的,结构应该是:

res/
    values/
        <stuff here>
    layout/
        <stuff here>
    drawable/
        <stuff here>
classes.jar
public.txt
R.txt
AndroidManifest.xml

https://developer.android.com/studio/projects/android-library#aar-contents

除了你的包装不知何故还添加了空的顶级文件夹:

res/
    values/
        <stuff here>
    layout/
        <stuff here>
    drawable/
        <stuff here>
values/
layout/
drawable/
classes.jar
public.txt
R.txt
AndroidManifest.xml

但我认为除了奇怪之外不会引起其他问题。


我怀疑 X/Y problem ;)

正在读取AAPT的错误信息:

.gradle/caches/.../res/values/values.xml resource drawable/butt_short (aka app:drawable/butt_short) not found.

  • 这意味着 butt_short.xml 对应用不可见。
  • 只有当 views 工件不在使用 draw 工件的应用程序的编译类路径中时才会发生这种情况。
  • 这只有在无法识别从 drawviews 的传递依赖性时才会发生。
  • 检查~/.m2/uk/co/sentinelweb/vectoroid-android-draw/0.1.3/vectoroid-android-draw-0.1.3.pom,可以看到它没有依赖项。

我通过创建一个空项目来确认这一点:

// don't forget src/main/AndroidManifest.xml: <manifest package="com.test" />
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'
    }
}

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    buildToolsVersion "28.0.3"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 28
    }
}

repositories {
    mavenLocal() // for consuming vectoroid local `gradlew install`
    google() // for AAPT2
}

dependencies {
    implementation 'uk.co.sentinelweb:vectoroid-android-draw:0.1.3'
    // TODO uncomment to make it assemble correctly
//    implementation 'uk.co.sentinelweb:vectoroid-android-views:0.1.3'
}

在SDK中我推荐使用

    implementation project(':vectoroid-android-views')
    implementation project(':vectoroid-android-base')

而不是

    implementation 'uk.co.sentinelweb:vectoroid-android-views:0.1.3'
    implementation 'uk.co.sentinelweb:vectoroid-android-base:0.1.3'

并将已失效的 com.github.dcendents.android-maven 插件更新为可用的插件。例如,我看到很多 gradle-mvn-push.gradle 漂浮在周围。