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))
原因分析:引用的第三方庫已經混淆過,再在本地進行編譯混淆的時候就會報出這個錯誤。
解決方案:則修改混淆器,重新進行編譯,將新的混淆器覆蓋原來的混淆器,則可以解決。
問題二:
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