升级compileSdkVersion至26后编译报错:缺失Manifest-Version属性
我之前升级compileSdk到26时也碰到过一模一样的问题,根源就是META-INF目录下的MANIFEST.MF文件缺少必填的Manifest-Version属性,你的packagingOptions里用了pickFirst 'META-INF/*'大概率是诱因——通配符会让Gradle随机选取一个依赖的MANIFEST.MF,而这个被选中的文件可能不符合规范。下面是我亲测有效的解决步骤:
一、调整packagingOptions配置(最可能解决问题)
你的通配符pickFirst 'META-INF/*'会覆盖所有META-INF下的文件,包括关键的MANIFEST.MF。改成只处理有冲突的特定文件,而不是全部:
android { // 其他配置... packagingOptions { // 只排除或优先选择明确冲突的文件,比如LICENSE、NOTICE或者服务类文件 exclude 'META-INF/LICENSE' exclude 'META-INF/NOTICE' pickFirst 'META-INF/services/javax.annotation.processing.Processor' // 示例,根据你的冲突情况调整 } }
如果不确定哪些文件冲突,可以先注释掉pickFirst 'META-INF/*',编译看看会不会报其他冲突错误,再针对性处理。
二、清理并重新构建项目
执行以下命令彻底清理缓存:
./gradlew clean ./gradlew assembleDebug --stacktrace
有时候旧的build缓存里会保留损坏的MANIFEST.MF文件,清理后重新生成就能解决。
三、检查依赖库兼容性
某些旧依赖可能打包了不符合SDK 26规范的MANIFEST.MF。执行命令查看所有依赖:
./gradlew app:dependencies
找到版本较老的库,尤其是和annotation processing、multiDex相关的库,尝试升级到兼容Android 8.0(API 26)的版本。
四、验证AndroidManifest.xml的正确性
确保你的Manifest根节点属性完整,比如:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="xxx.xxx.com" android:versionCode="xxx" android:versionName="x.x.x"> <!-- 其他组件配置 --> </manifest>
不过更推荐只在Gradle中配置versionCode和versionName,Manifest里可以去掉这两个属性,避免冲突。
你提供的配置信息参考
Gradle配置片段:
android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { applicationId "xxx.xxx.com" minSdkVersion 14 targetSdkVersion 25 versionCode xxx versionName "x.x.x" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" vectorDrawables.useSupportLibrary = true multiDexEnabled true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } packagingOptions { pickFirst 'META-INF/*' } dexOptions { javaMaxHeapSize "4g" } }
完整堆栈跟踪关键信息:
[10:58:50] john@bob:project$ gradle assembleDebug --stacktrace
...
FAILURE: Build failed with an exception.
What went wrong:
Execution failed for task ':app:packageDebug'.
Failed to generate v1 signature
...
Caused by: java.lang.IllegalArgumentException: Mandatory Manifest-Version attribute missing
内容的提问来源于stack exchange,提问作者Joao Sardinha

