Android Studio 升级之旅

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