Marshmallow设备安装APK遇解析错误,Nougat设备正常求助
APK解析错误仅在Android 6.0(Marshmallow)出现,7.0+正常运行
问题详情
用户反馈:自己的APK在Android 7.0及以上设备能正常安装运行,但在Android 6.0设备上安装时弹出解析错误。相关配置及报错信息如下:
项目Build配置:
android { compileSdkVersion 23 buildToolsVersion "25.0.0" defaultConfig { applicationId "com.graymatic.gmind.mylook" minSdkVersion 15 targetSdkVersion 21 versionCode 1 versionName "1.4" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true } }
系统报错日志:
/PackageManager: Failed collect during installPackageLI android.content.pm.PackageParser$PackageParserException: Package /data/app/vmdl1108144592.tmp/base.apk has no certificates at entry AndroidManifest.xml at android.content.pm.PackageParser.collectCertificates(PackageParser.java:1176) at android.content.pm.PackageParser.collectCertificates(PackageParser.java:1130) at com.android.server.pm.PackageManagerService.installPackageLI(PackageManagerService.java:13205) at com.android.server.pm.PackageManagerService.access$3600(PackageManagerService.java:327) at com.android.server.pm.PackageManagerService$10.run(PackageManagerService.java:11017) at android.os.Handler.handleCallback(Handler.java:743) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:150) at android.os.HandlerThread.run(HandlerThread.java:61) at com.android.server.ServiceThread.run(ServiceThread.java:46)
解决方案
从报错信息has no certificates at entry AndroidManifest.xml可以看出,核心问题是Marshmallow系统对APK签名的校验未通过——这个版本的系统在签名验证逻辑上比Nougat及以后更严格,尤其是开启MultiDex的场景。下面是几个经过验证的解决办法:
重新签名APK,确保签名完整
先确认你使用的是有效的正式签名密钥(避免用临时debug密钥,或者签名过程被中断)。可以手动重新签名并对齐APK:# 执行签名操作 jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 你的密钥库路径.jks 待签名APK路径.apk 密钥别名 # 签名后执行对齐(必须在签名之后操作,否则会破坏签名) zipalign -v 4 签名后的APK路径.apk 对齐后的APK路径.apk用重新处理后的APK在Marshmallow设备上测试,大概率能解决问题。
调整Build配置的版本兼容性
你的compileSdkVersion(23)和buildToolsVersion(25.0.0)版本不匹配,这可能导致构建出的APK在低版本系统上签名校验异常。建议:- 把
compileSdkVersion升级到25,和buildToolsVersion保持一致; - 或者将
buildToolsVersion降级到23.0.3(对应compileSdkVersion 23的稳定版本)。
另外,开启multiDexEnabled true后,要确保Application类正确配置MultiDex:如果你的自定义Application没有继承MultiDexApplication,需要在attachBaseContext方法中添加MultiDex.install(this);。
- 把
清理缓存后重新构建项目
有时候Android Studio的缓存构建文件会导致签名异常,按以下步骤操作:- 点击菜单栏
Build > Clean Project; - 再点击
Build > Rebuild Project; - 重新生成签名APK,不要使用之前的旧构建产物。
- 点击菜单栏
避免APK被篡改
确认APK生成后没有被压缩工具(如WinRAR、7-Zip)打开并修改过,哪怕只是打开后直接保存,都可能破坏APK的签名结构。直接使用Android Studio生成的签名包,或者通过Gradle命令./gradlew assembleRelease生成的包进行测试。
内容的提问来源于stack exchange,提问作者Uma Achanta
相关产品推荐
相关产品推荐

