Android Studio 升级之旅

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))

c.png

**原因分析:**引用的第三方库已经混淆过,再在本地进行编译混淆的时候就会报出这个错误。

**解决方案:**则修改混淆器,重新进行编译,将新的混淆器覆盖原来的混淆器,则可以解决。

问题二:

Error:Execution failed for task ‘:app:transformClassesWithMultidexlistForNiannianDebug’.
proguard.KeepClassSpecification.(ZZZZZZLproguard/ClassSpecification;)V

a.png

**原因分析:**升级 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 ,如图:

e.png

如果之前没有修改过Gradle 版本,可以通过下边方法查看,如图:

f.png

我采用的 版本为:Gradle-3.4.1

查看 Gradle Plugin 版本

直接上图:

g.png

当然还有一个更便捷的方式查看当前工程所使用 Gradle 版本与 Gradle Plugin 版本

打开目录:File -> Project Stucture -> Project , 如图:

h.png

重点来了, Gradle 版本与 Gradle Plugin 版本之间的兼容性:

i.png

这里我以 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 (什么?你还在用百度? 学习当然是看官网啦)

j.png

写的非常清楚了,Gradle Plugin  2.3.0 依赖 Gradle 3.3 或者以上版本,依赖 SDK Build Tools 25.0.0 及以上版本。

说了这么多,好像还是没说升级 Android Studio 为什么会导致前边提到的两问题,前边提到的两个问题其实多是和混淆相关。细心的小伙伴可能已经发行 Gradle Plugin  2.3.0 使用的新版本的 ProGurd,如图:

k.png

问题二的出现其实就是 混淆器的版本与 Gradle Plugin 的版本不一致导致的。

很多小伙伴多手动配置了自己的混淆器,如下:

1,在项目的根目录下创建 proguard 文件夹,在文件下加入 proguard.jar

o.png

2, 在project的build.gradle中加入混淆包的关联:

b.png

假如你之前使用的混淆器 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 ,解压,目录结构如下:

p.png

2,找到源码的 ClassConstant.Java 类,在 srcproguardclassfile 文件当中,然后将ATTR_StackMapTable 的值修改成 “dummy”(原值为StackMapTable)。

q.png

3,打开SDK所在模块,依次打开:{android-sdk 目录}toolsproguard,复制 ant文件、proguard-android.txt、proguard-android-optimize.txt、proguard-project.txt 文件至ProGuard version 5.3.2 文件夹类。

r.png

s.png

4,使用ant 进行重新打包

a,安装ant

进入 ant 官网:http://ant.apache.org/ 下载最新版本,并解压至你的硬盘。

t.png

u.png

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

v.png

c, 验证ant 是否配置成功
依次选择:开始->运行->cmd,输入如下命令:ant
如果出现如下内容,说明安装成功:

Buildfile: build.xml does not exist!
Build failed

w.png

d, 运行ant打包 proguard

1,cmd 进入 proguard 目录下的 build.xml 所在目录

a2.png

a3.png

2, 输入命令 ant 编译

a4.png

3,在 lib 里面找到 proguard.jar文件,覆盖到 sdk 里面的 proguard 里面的 proguard.jar 包 。

当然有些小伙伴没有配置过自己的混淆器,那 Android Studio 使用的这是默认的 proguard.jar,
路径:{Android Studio 安装目录}gradlem2repositorynetsfproguardproguard-base

a5.png

a6.png

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

欢迎关注本人微信订阅号:“Android 之旅”,每天更新技术博客与行业资讯

邀请二维码.png微信