Android Gradle Plug 4.1.0 升级后gradle获取manifest位置失败问题解决

问题背景

项目编译过程中,使用了类似Android Gradle Plugin的gradle插件进行编译,在最终打包apk时,会动态修改manifest文件。

近期发现线上用户有反应升级到以下开发环境后,打包apk后manifest文件中没有应有的任何配置。

Android Gradle Plugin:4.1.0
Gradle:6.5
Android Studio:4.1

确认调查方向

首先要确认清楚到底是上述3个哪个的升级导致的问题。

在本地进行环境升级过程验证了以下结论:

Android Gradle Plugin:4.1.0 强制要求 Android Studio:4.1 + Gradle:6.5。然而 以下环境下打包过程是正常的:

Android Gradle Plugin:4.0.2
Gradle:6.5
Android Studio:4.1

Android Gradle Plugin:4.0.2 是 4.1 的前一个版本,至此可以确认是 Android Gradle Plugin:4.1.0 的升级导致的不兼容问题。

明确了调查的方向,接下来就可以有的放矢了。

调查分析

我们的gradle插件,是通过以下代码获取到manifest文件后做处理的:

new File(output.processManifestProvider.get().manifestOutputDirectory.get().getAsFile(), "AndroidManifest.xml")

其实并非如此简单,只是这一句是最关键的。在gradle插件中增加了一些关键打印语句后,编译过程中得到了以下错误提示:

Could not get unknown property 'manifestOutputDirectory' for task ':app:processDebugManifest' of type com.android.build.gradle.tasks.ProcessMultiApkApplicationManifest

百度了一下,没有任何相关记录,毕竟距离 Android Gradle Plugin:4.1.0 正式发布才过去2个月,只好自给自足。

很明显是读取manifest文件位置的属性失效了,那最直接的方法就是看源码。找到 Android Gradle Plugin:4.1.0 的jar包看看就行。

又是百度一下,很可惜,没有下载地址。

上JCenter找,结果JCenter仓库只更新到2.x版本。

也对,好像是从 Android Studio 3.0 开始,google就将 Android Gradle Plugin 转移至 google() 仓库了,那只能去 google() 仓库找了,一时半会也不知道具体地址,以前的编译过程中也没留意看studio的编译日志输出,当然如果是一个全新工程环境,编译一下,肯定能找到仓库地址的,不过我懒得搞。

先到AS的缓存路径下碰碰运气吧,不过碰运气也得先有个方向,别忘了Android Gradle Plugin的classpath配置:

classpath 'com.android.tools.build:gradle:4.1.0'

果不其然,在以下路径找到了:

/Users/jackie/.gradle/caches/modules-2/files-2.1/com.android.tools.build/gradle

加载过的各种版本都有,直接拿到 4.1.0 的jar包看源码,在 ProcessMultiApkApplicationManifest.class 中找到了以下代码:

File mergedManifestOutputFile = new File(((Directory)getMultiApkManifestOutputDirectory().get()).getAsFile(),
  FileUtils.join(new String[] { dirName,
    "AndroidManifest.xml" }));

同时还有一个抽象方法:

public abstract DirectoryProperty getMultiApkManifestOutputDirectory();

看来属性已经变成了 multiApkManifestOutputDirectory。

如果不确定,我们再看看 4.0.2 的源码,在 ProcessApplicationManifest.class 中找到了以下代码:

代码如下:

File manifestOutputFile = new File(((Directory)getManifestOutputDirectory().get()).getAsFile(), FileUtils.join(new String[] { apkData.getDirName(), "AndroidManifest.xml" }));

很明显,在 4.0.2 版本时,获取manifest文件路径的属性确实是 manifestOutputDirectory ,而task本质上是一个 ProcessApplicationManifest 实例,但从 4.1.0 版本开始, task变为 ProcessMultiApkApplicationManifest 的实例,属性变为 multiApkMnifestOutputDirectory 了。

好了,剩下的就是做一下版本兼容了,大功告成。

代码如下:

new File(output.processManifestProvider.get().multiApkManifestOutputDirectory.get().getAsFile(), "AndroidManifest.xml")

总结

大部分基于gradle的编译脚本,其工作原理都一样,就是在编写自定义的task、在某个预设的task之前或之后做自定义的特殊处理等等,更高级一点的gradle插件也不例外。

而 Android Gradle Plugin 同样也只是一个Google官方开发的gradle插件,每次升级版本都会伴随着一些“task名变更”、“task处理内容变更”、“task执行顺序变更”等等的更新,这些更新很可能就会影响到我们这些基于其“预置task”做特殊处理的gradle插件,所以大部分版本兼容问题都应该从这个方向出发调查。

另外,有时候Gradle的升级也会带来一些兼容问题。

到此这篇关于Android Gradle Plug 4.1.0 升级后gradle获取manifest位置失败问题解决的文章就介绍到这了,更多相关Android Gradle4.1升级内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2020-10-15

Android studio升级4.1时遇到的问题记录

1.布局文件预览不了 百度搜索了好多办法,有要降低android sdk版本的,有要改Theme的都没有成功. 个人的解决办法:在布局文件的design界面,点击右上角的感叹号,如图1, 1​​ 在下方展开的界面中点击图2处的here,然后会提示重启studio,重启完一般都会好的,如果没有好多点几次试试.             ,                2 2.Gradle sync failed:Unable to start the daemon process报错 如图所示报错

Android将Xamarin For VS升级为4.1.0.530版教程

一.Xamarin for VS的版本简介 下面是Xamarin for VS发布的版本简介: --更早的版本(略) 2015年11月发布:Xamarin for VS 4.0.0.1717 Stable版(收费) 2016年3月发布:Xamarin for VS 4.0.1.145 Stable版(收费) 2016年5月发布:Xamarin for VS 4.0.4.4 Stable版(企业版,免费) 2016年6月发布:Xamarin for VS 4.1.0.530 Stable版(企业版

AndroidStudio升级4.1坑(无法启动、插件plugin不好用、代码不高亮)

上班坐稳,打开AS看到studio有更新,于是就点击升级,4.1版本,看更新日志:bug修复什么什么一大堆,感觉挺好的,应该做了不少优化,结果升级完后就无法启动了,于是肠子悔青了. 一.升级4.1之后,无法启动 插件报错了. 解决办法:1.删除AndroidStudioX.X文件,一般在C盘,你自己的用户目录下.2.删除C:\Users\xxx\AppData\Roaming\Google\AndroidStudio4.1\plugins下的所有文件(要是能找到哪个插件导致启动失败可以单独删除对

Android Studio IDE升级4.1以后Start Failed

突然遇到Android Studio IDE自升级到4.1,然后就无法启动了. 以下是错误截图 : 于是各种重新卸载,重新安装都不行,最终找到解决方法是:删除.local/share/google的Google文件包,然后重新启动android studio就可以了(Linux). 揪其原因是安装的plugin不支持4.1版本的IDE. 所以可以打开安装plugin的文件包,要不删除,要不移到其他文件夹里,然后就可以重启Android Studio了.. 到此这篇关于Android Studio

详解Android studio如何导入jar包方法

下面我就总结一下Android studio大家在导入jar包时遇到的一些问题和解决方法: 1,首先先说一下怎么在AS 中找到sdk,jdk,ndk的安装路径,可能一部分人一开始找不到,下面贴出方法: Android studio 中更改sdk的路径,如下图,在右边红色方框中更改sdk的路径 还有一种更好的方式可以把sdk,jdk,ndk的路径全部找到,首先File---Other Settings---Default Project Structure...,打开如下图界面,从红方框处即可直接

图文详解Android Studio搭建Android集成开发环境的过程

有很长一段时间没有更新博客了,最近实在是太忙了,没有时间去总结,现在终于可以有时间去总结一些Android上面的东西了,很久以前写过这篇关于使用Android Studio搭建Android集成开发环境,不过一直没有发表出来,写这篇文章的目的是记录一下Android开发环境的搭建过程,这篇文章写得一般般,主要是记录了整个搭建过程,没什么技术含量,觉得有帮助的朋友就看一下! 一.Android Studio简单介绍 2013年GoogleI/O大会首次发布了Android Studio IDE(A

Windows下快速搭建安卓开发环境Android studio

一.Android Studio简单介绍 2013年GoogleI/O大会首次发布了Android Studio IDE(Android平台集成开发环境).它基于Intellij IDEA开发环境,旨在取代Eclipse和ADT(Android开发者工具)为开发者提供更好的开发工具.既然Google一直在努力推广,相信不久以后就有望赶上Eclipse. 相比Eclipse,Android Studio IDE有自己的特点: 对UI界面设计和编写代码有更好地支持,可以方便地调整设备上的多种分辨率.

浅析Android Studio 3.0 升级各种坑(推荐)

点击 Check for Updates 增量更新: 下载完成,会提示更新 您将 Gradle 更新至 4.1: 这里建议您对老项目先暂时点击 Don't remind me on this project,以防有坑.当然我不入地狱谁入地狱,我点 Update,于是问题来了,一直处于下载中,不过,莫担心,我下载好了,公众号聊天界面回复「 gradle-4.1-all 」,下载 gradle-4.1-all.zip 文件,放到: 重启 Android Studio. gradle 目录: Mac系

android studio 3.0 升级 项目遇到的问题及更改思路(问题小结)

Android Studio从3.0版本新增了许多功能,当然首当其冲就是从3.0版本新增了对 Kotlin 开发语言的支持,除此之外还有其他一些新功能,例如:Android Profiler (其中包含了: CPU Profiler.Memory Profiler.Network Profiler ),APK Debugger,Device File Explorer,Java 8 Language Features等. android studio 3.0版本升级问题修改: ===> 问题一

Android Studio 升级到3.0后输入法中文状态下无法选词的终极解决方案

AndroidStudio终于出3.0正式版了,内置了kotlin(虽然我安了插件一直能用).一直忍着没敢下rc版的好奇猫,总算装了正式版.当然,伴随每次大版本更新,总有一些恼人的后遗症,其中以gradle问题最多.AS3.0要求gradle版本在3.5以上,配置文件内将标准版本指定为gradle-4.1-milestone-1. 之前用的是AS2.3,在稳定版3.0发布之后由于好奇,就更新到了3.0.但是,除了Android Profiler分析器+自我感觉native编译速度加快以外,其他的

解决Android studio 2.3升级到Android studio 3.0 后apt报错问题

1.现象描述 原来项目在Android studio 2.3一切正常,升级3.0之后报如下错误: Error:Cannot choose between the following configurations of project :android_sdk: - debugApiElements - debugRuntimeElements - releaseApiElements - releaseRuntimeElements All of them match the consumer

Android Studio 升级到3.0 提示 java.lang.NoClassDefFoundError的解决方法

解决方法 首先把方法写出来,起因和经过和原理写在后面,时间仓促的直接看解决方法吧. 一般出现这个错都是使用的provided导致的 例如,我的旧配置如下: Project build.gradle文件: buildscript { dependencies { classpath 'com.android.tools.build:gradle:3.0.1' // need delete in gradle3.x version classpath 'com.neenbedankt.gradle.

Android Studio升级3.6 Build窗口出现中文乱码问题解决方法

前言 最近受疫情影响,很多互联网企业目前才开始慢慢复工,希望这次的疫情没有影响我们码代码的心情. 问题 好的一点,我们的AndroidStudio迎难而上,最近发布了3.6最新版本,不得不说最新版本还是更新了很多地方,但也有出现了一些问题,比如我最近就碰到了这么一个问题,在我升级到了Android Studio3.6以后发现,编译的时候在底部出现的Build窗口中文出现了乱码的问题,代码中没有出现乱码情况,如下图: 这种问题就很头疼了,我先是在File->Settings->File Enco

android studio 3.6.1升级后如何处理 flutter问题

前提条件介绍 1.android-studio-3.6.1 死丢丢 配置了dart 和flutter插件 在 3.5.3时 成功运行过flutter工程 2.flutter 版本 Flutter 1.12.13+hotfix.8 • channel stable • https://github.com/flutter/flutter.git Framework • revision 0b8abb4724 (5 weeks ago) • 2020-02-11 11:44:36 -0800 Eng