最近google發布了android系統打包時出現“Janus”安全漏洞風險,幾個時間久的項目使用的是eclipse開發的,eclipse簽名打包時只能采用v1簽名,需要采用v1+v2簽名才能修復該漏洞。而androidStudio(AS)打包時可以采用v1+v2方式,故嘗試升級eclipse為androidstudio。升級后build沒有問題,但是打包時提示:Error:Execution failed for task ':transformClassesWithMultidexlistForDebug'. > java.io.IOException: Can't read [D:\workspace\project2\haocaimao2\build\intermediates\transforms\jarMerging\debug\jars\1\1f\combined.jar] (Can't process class [com/tencent/wxop/stat/al.class] (Unknown verification type [95] in stack map frame))錯誤。百度了很久,終于參考http://bbs.csdn.net/topics/392084419?list=lz這個鏈接上的修改方式成功編譯打包運行,也解決了該漏洞。雖然這個鏈接寫的比較詳細,但本人還是按照自己的思路進行修改。具體過程如下:
1.原因:出現上面錯誤的原因是AS里默認是用的proguard混淆編輯工具里有個ClassConstant.java類里的ATTR_StackMapTable?的常量值修改成?"dummy",默認為“StackMapTable”。修改后需要使用ant工具重新打包proguard源碼,然后更新AS中使用的該proguard.jar包即可。具體ATTR_StackMapTable為什么要改為?"dummy"就沒有詳細了解了。
2.使用工具
win7 64位,AndroidStudio2.2.2,jdk1.8,apache-ant-1.10.1-bin.zip(http://ant.apache.org),proguard5.3.1(https://sourceforge.net/projects/proguard/files/proguard/)
3.修改步驟:
1)查看自己的proguard的版本路徑,AS安裝路徑下的proguard和sdk下也有proguard,還有就是AS緩存路徑下的,我是在這三個地方都進行了替換。sdk下的本人路徑是:
2)從proguard官網下載proguard源碼,我下載的是5.3.1,不過最新的已經是5.3.3了。
3)下載后proguard的目錄結構如下:
進入src\proguard\classfile目錄下找到ClassConstant.java類,將該類中ATTR_StackMapTable 默認常量值修改成?"dummy"(原值為StackMapTable)。修改后:
4)修改后下載ant,具體下載地址見上面說明。
下載好后直接解壓,然后配置ant的環境變量,這樣才能直接使用ant命令。環境變量配置和JDK環境變量配置類似,我的配置如下(版本不同對應的jdk也不同,我用的ant版本1.10.1對應的jdk至少是1.8的):
5)驗證ant是否安裝成功
命令行打開直接輸入ant,如果輸出如下提示,則說明配置正確。
6)運行ant命令重新打包3)中修改后的proguard的源碼。
? ? ? 命令行切換到下載的proguard5.3.1的buildscripts目錄下,也可以修改該目錄名稱為build(低版 本的一般是build目錄,有人說不改為build,打包時會報錯,我是修改后才打包的,沒修改的就沒有嘗試了)
? ? ? 接著,命令行 直接輸入ant命令,就會在lib下重新生成proguard.jar包,如下圖:
生成后可以看下日期是不是剛剛執行命令后的時間。
7)將修改后的proguard.jar覆蓋原先AS使用的proguard包。
第一個位置是AS使用的sdk下的proguard.jar包,本人路徑如下。可以先拷出備份下,免得到時候打包有問題,無法還原老的proguard。
第二個位置是AS安裝目錄下的proguard。本人路徑如下:
這里有三個文件夾,proguard包在proguard-base文件夾下,可能已經存在多個版本的proguard,本人如下:
這兩個文件夾下分別有proguard-base-5.1.jar和proguard-base-5.2.1.jar兩個不同版本的包,我是先把這兩個文件拷出,然后修改重新打包后的proguard.jar的名稱和這兩個文件名一樣,再拷到原位置。
第三個位置是AS的緩存目錄下,有可能該緩存目錄不存在,那就不用替換了。本人目錄如下:
我的這里也是有2個版本的proguard,我是按照和第二個位置的方式,找到這兩個文件夾下的proguard包,然后相同的名稱直接替換原包。
8)替換好后,重新打開AS進行編譯打包,就可以了。