Android Studio 2.3 正式版已经发布,有多少小伙伴第一时间升级自己的 Android Studio了呢? 我猜应该不是很多,因为很多有小伙伴担心升级 AndroidStudio 以后自己的工程就没法编译了,出现一堆莫名其妙的问题.最常见的问题可能有一些两个:
问题一:出现 Unknown verification type [95] in stack map frame 错误
Error:Execution failed for task ‘:app:transformClassesWithMultidexlistForNiannianDebug’.
Java .io.IOException: Can’t read [E:SVNbroondontrunkcodebroodon_androidappbuildintermediatestransformsjarMergingnianniandebugjars11fcombined.jar] (Can’t process class [com/tencent/wxop/stat/al.class] (Unknown verification type [95] in stack map frame))
原因分析:引用的第三方库已经混淆过,再在本地进行编译混淆的时候就会报出这个错误。
解决方案:则修改混淆器,重新进行编译,将新的混淆器覆盖原来的混淆器,则可以解决。
问题二:
Error:Execution failed for task ‘:app:transformClassesWithMultidexlistForNiannianDebug’.
proguard.KeepClassSpecification.(ZZZZZZLproguard/ClassSpecification;)V
原因分析:升级 Android studio 以后,使用的混淆器版本不一致
解决方案:根据 Android studio版本选择与之对应的混淆器版本
我们先来捋一捋 Android studio 编译各插件之间的关系:
Android studio 编译需要保证:SDK Build Tools 版本,Gradle 版本,Gradle Plugin 版本 兼容。
这里我们要重点关注Gradle版本的版本 ,因为版本决定了 SDK Build Tools 版本与 Gradle Plugin 版本 。
查看当前 Android studio 使用的Gradle 版本
打开 目录:File ->Setting -> Build、Execution,Deployment -> Gradle ,如图:
如果之前没有修改过Gradle 版本,可以通过下边方法查看,如图:
我采用的 版本为:Gradle-3.4.1
查看 Gradle Plugin 版本
直接上图:
当然还有一个更便捷的方式查看当前工程所使用 Gradle 版本与 Gradle Plugin 版本
打开目录:File -> Project Stucture -> Project , 如图:
重点来了, Gradle 版本与 Gradle Plugin 版本之间的兼容性:
这里我以 Gradle Plugin 2.3.0 以例子,说说Gradle Plugin 、 Gradle 与 SDK Build Tools 三者之间的关系。
关于 Gradle Plugin 2.3.0,首先,我们先来看看官方是这么说的,官网地址: https://developer.android.com/studio/releases/gradle-plugin.html#revisions (什么?你还在用百度? 学习当然是看官网啦)
写的非常清楚了,Gradle Plugin 2.3.0 依赖 Gradle 3.3 或者以上版本,依赖 SDK Build Tools 25.0.0 及以上版本。
说了这么多,好像还是没说升级 Android Studio 为什么会导致前边提到的两问题,前边提到的两个问题其实多是和混淆相关。细心的小伙伴可能已经发行 Gradle Plugin 2.3.0 使用的新版本的 ProGurd,如图:
问题二的出现其实就是 混淆器的版本与 Gradle Plugin 的版本不一致导致的。
很多小伙伴多手动配置了自己的混淆器,如下:
1,在项目的根目录下创建 proguard 文件夹,在文件下加入 proguard.jar
2, 在project的build.gradle中加入混淆包的关联:
假如你之前使用的混淆器 proguard.jar 的版本是比较低的,现在使用 Gradle Plugin 2.3.0 的话,就会报错,解决方式也非常检查 替换成 Gradle Plugin 2.3.0 对应的 Proguard版本即可。
Proguard 各版本下载地址: https://sourceforge.net/projects/proguard/files/proguard/
至于问题一解决就比较麻烦一点:
问题一出现的原因:引用的第三方库已经混淆过,再在本地进行编译混淆的时候就会报出这个错误。
我们只能通过修改混淆器的源码来解决这个问题。
以 Gradle Plugin 2.3.0 为例
1,首先,下载 Gradle Plugin 2.3.0 至于的混淆器 ProGuard version 5.3.2 ,解压,目录结构如下:
2,找到源码的 ClassConstant.Java 类,在 srcproguardclassfile 文件当中,然后将ATTR_StackMapTable 的值修改成 “dummy”(原值为StackMapTable)。
3,打开SDK所在模块,依次打开:{android-sdk 目录}toolsproguard,复制 ant文件、proguard-android.txt、proguard-android-optimize.txt、proguard-project.txt 文件至ProGuard version 5.3.2 文件夹类。
4,使用ant 进行重新打包
a,安装ant
进入 ant 官网: http://ant.apache.org/ 下载最新版本,并解压至你的硬盘。
b,配置环境变量
window中设置ant环境变量:
配置环境变量:我的电脑 ->属性 -> 高级 -> 环境变量
ANT_HOME D:appantapache-ant-1.10.1
path %ANT_HOME%bin;%JAVA_HOME%bin;
classpath %ANT_HOME%lib;%JAVA_HOME%lib;%JAVA_HOME%libtools.jar
c, 验证ant 是否配置成功
依次选择:开始->运行->cmd,输入如下命令:ant
如果出现如下内容,说明安装成功:
Buildfile: build.xml does not exist!
Build failed
d, 运行ant打包 proguard
1,cmd 进入 proguard 目录下的 build.xml 所在目录
2, 输入命令 ant 编译
3,在 lib 里面找到 proguard.jar文件,覆盖到 sdk 里面的 proguard 里面的 proguard.jar 包 。
当然有些小伙伴没有配置过自己的混淆器,那 Android Studio 使用的这是默认的 proguard.jar,
路径:{Android Studio 安装目录}gradlem2repositorynetsfproguardproguard-base
4,重启 Android Studio,编译运行,大功告成 。
参考文章
https://developer.android.com/studio/releases/gradle-plugin.html#revisions
https://developer.android.com/studio/releases/build-tools.html#notes
http://www.cnblogs.com/huangbei1990/p/6097782.html
来自:http://www.jcodecraeer.com/a/anzhuokaifa/Android_Studio/2017/0322/7713.html