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.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,576评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,515评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,017评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,626评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,625评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,255评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,825评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,729评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,271评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,363评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,498评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,183评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,867评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,338评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,458评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,906评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,507评论 2 359

推荐阅读更多精彩内容