Android之./gradlew assembleRelease打包失败问题

问题:执行gradle命令打多个release包失败了(./gradle assembleRelease)

报错:(以下为其中1个,都是这种类别的)

> Task :ocr_lib:verifyReleaseResources FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':ocr_lib:verifyReleaseResources'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
   > Android resource linking failed
     /Users/lopez/.gradle/caches/transforms-2/files-2.1/ec609e8cee787e2dff3592c66b08a66a/core-1.0.0/res/values/values.xml:57:5-88:25: AAPT: error: resource android:attr/fontVariationSettings not found.
         
     /Users/lopez/.gradle/caches/transforms-2/files-2.1/ec609e8cee787e2dff3592c66b08a66a/core-1.0.0/res/values/values.xml:57:5-88:25: AAPT: error: resource android:attr/ttcIndex not found.

格式的话,大概是下面这样的,只是上面的那个ec609e8cee787e2dff3592c66b08a66a字符串不是固定的

.gradle\caches\transforms-2\files-2.1(32位的随机码,好像是hash值,目测是core-1.1.0.zip这个压缩文件的md5,找不到以前看过的那篇文章了,有知道的老铁麻烦说声)\core-1.1.0\res\values\values.xml:行号:列号-行号:列号: AAPT: error: resource android:attr/xxx not found.

PS:ocr_lib是project中的一个library,也就是所谓的module

场景:

  1. 在AS IDE上方菜单Build里点击Make/Clean/Build Project啥的都是能build成功的
  2. 直接点击AS右上角的gradle task直接执行命令比如installUat1Debug/Release是能成功编译好然后安装成功的
  3. 点击gradle的sync按钮也是能同步成功
  4. 执行打包单个渠道/环境的包是能成功的,比如./gradlew assembleUat1Release ,注意这里无论debug/release的buid type都能成功
  5. 执行打多个Release包命令的时候(./gradlew assembleRelease)就报错了,如上面所示
  6. 针对第5点,执行./gradlew assembleDebug命令能成功打包
  7. 上述情景,基于相同的gradle buildTypes配置,只配置了
signingConfig signingConfigs.config
minifyEnabled false

PS:这里配置是没开混淆,实际默认就是没开混淆的,相当于不加上这行也行,但还有些问题就先不开了

  1. targetSdkVersion全局是26
  2. app module与问题module的compileSdkVersion不一致,app module compileSdkVersion 28,问题module compileSdkVersion 26
  3. 各module都添加了androidx的依赖,如
    implementation 'androidx.appcompat:appcompat:1.2.0'

分析:

./gradlew assembleRelease 命令执行完后就看到上面的编译报错,然后按build失败提示里添加命令--warning-mode all查看已弃用的警告信息及--info --debug --stacktrace查看堆栈信息,但也还是没有发现涉及到项目里的内容,都是提示找不到某个库里的某个资源,然后项目中也并没有使用到这个资源,但就是这个原因导致build不成功,所以就还是定位为编译问题

方案:

  • 经过各种尝试折腾(上面部分场景),发现最终把问题module的compileSdkVersion改成与app module的一致即可解决问题,或者比app module的大也行
  • 最好保证子module的compileSdkVersion也在28以上,因为要跟主module保持一致,毕竟AndroidX compileSdkVersion最低只支持28,AndroidX最低只支持compileSdkVersion28,AndroidX最低只支持compileSdkVersion28,另外AndroidX最低支持的gradle版本是4.6,AndroidX最低支持的gradle plugin插件版本是3.2
  • compileSdkVersion概念:compileSdkVersion 告诉 Gradle 用哪个 Android SDK 版本编译你的应用,使用任何新添加的 API 就需要使用对应 Level 的 Android SDK。修改 compileSdkVersion 不会改变运行时的行为。当你修改了 compileSdkVersion 的时候,可能会出现新的编译警告、编译错误,但新的 compileSdkVersion 不会被包含到 APK 中:它纯粹只是在编译的时候使用
  • Realize task: ocr_lib:verifyReleaseResources AAPT校验资源的问题。因为项目依赖了androidx的库,然后app module的compileSdkVersion是androidx库要求的最低版本28,所以编译时就符合要求能正常通过,只是最终执行批量构建打包assembleRelease命令的时候这个gradle的打包流程多了这个realize的task(打单个包、批量打debug包只有执行到register task: verifyReleaseResources)。
  • 因为项目的targetSdkVersion是26,所以这个task就校验到所依赖的AndroidX类库中包含了只有API28才有的资源,虽然你实际可能没有用到这个资源,但因为它仅仅是校验资源的作用,那么它发现目标API版本与类库依赖API版本不对应,还是会给你报错说找不到对应的资源,这就是你疑惑明明依赖了这个库怎么还报找不到资源的根本原因。
  • 因为没测试过,所以这里推测:尽管打包跟运行都正常,但等你运行且实际用到了这个资源时就会报错(具体报错类型是否NotFoundException in Resouce我也不能确定)。因为targetSdkVersion指定了是26,因此尽管你在API28的设备上运行,但因为它要去实现API26表现的特性,那最后应该就要用到API26的资源(非代码,比如android:attr是系统预设颜色)才对。
  • 即androidx要用到某个系统attr,但是这个资源并不是包含在你所依赖的这个aar包中的,而是在里面写了对这个attr资源(API28)的引用,而API26里面没有这个系统attr,于是因为找不到它就报错了。就那个task而言,APPT给我们做的只不过是提前校验资源罢了,未雨绸缪,提升你程序的健壮性。综上所述,建议在做好充分测试及兼容后,targetSdkVersion要及时跟上compileSdkVersion。
  • 本文问题出现的根本原因大概就是上面说的那样导致的。什么?你问我怎么打单个包、同时打多个debug包没问题,怎么同时打多个release包就有问题?就是因为多了这步:Realize task: module:verifyReleaseResources(为什么就这个命令多了这步我不知道,哪位大神麻烦告诉下我),给你贴个流程对比你就明白了(下列日志打单个debug包、同时打多个debug包的就不贴了,如果还是不懂,建议对gradle输出更多详细日志即可理解):

前者流程:

172-2-22-8:xxxproject lopez$ ./gradlew assembleUat2Release

> Task :ocr_lib:stripReleaseDebugSymbols UP-TO-DATE
Compatible side by side NDK version was not found.

> Task :app:stripUat2ReleaseDebugSymbols UP-TO-DATE
Compatible side by side NDK version was not found.

BUILD SUCCESSFUL in 2s
47 actionable tasks: 47 up-to-date

后者流程

172-2-22-8:xxxproject lopez$ ./gradlew assembleRelease

> Task :ocr_lib:stripReleaseDebugSymbols UP-TO-DATE
Compatible side by side NDK version was not found.

> Task :app:stripProductReleaseDebugSymbols UP-TO-DATE
Compatible side by side NDK version was not found.

> Task :ocr_lib:verifyReleaseResources FAILED

FAILURE: Build failed with an exception.

你可能感兴趣的:(Android之./gradlew assembleRelease打包失败问题)