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
工件的应用程序的编译类路径中时才会发生这种情况。
- 这只有在无法识别从
draw
到 views
的传递依赖性时才会发生。
- 检查
~/.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 漂浮在周围。
我有一个我几年前写的库,我已经逐渐将它模块化并部署到 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
工件的应用程序的编译类路径中时才会发生这种情况。 - 这只有在无法识别从
draw
到views
的传递依赖性时才会发生。 - 检查
~/.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 漂浮在周围。