Mac 下打包APK的血淚坑(巨坑,巨巨坑,史前巨坑)

androidwing發表於2019-02-12

本文同步自wing的地方酒館

又是好久沒寫部落格,這回依然是一個坑把我炸出來了。。

前因後果經過

起因是這樣子的。公司Jenkins是部署在mac上的

,更新完一個功能自動打包下來的apk開啟以後,總會蹦。 報錯 classNotFound. 奇怪的是,自己用ubuntu打包的apk就不會報錯。

真是奇了大怪了,一開始以為是Jenkins的鍋,然後調來調去還是不行,就以為是gradle的鍋,各種換版本還是不行。

一直報一個錯: com.xxxx.r ClassNotFound

這個r.class是第三方SDK裡面的,並且就在包的最底下。就是一個普通的類。於是把Jenkins打包出來的APK給逆向過來,找到這個SDK對應的包,發現裡面r.class居然丟失了!! 丟失了!!! 然後逆向ubuntu打包的APK,裡面r.class居然是存在的!!存在的!!

手動執行task 有時候還會報錯,說r和R不匹配

呵呵噠。這下子基本明瞭了,為什麼會拿r和R去匹配呢? 肯定是mac系統的鍋了,因為mac系統硬碟本身是大小寫不敏感的,系統又會自動生成一個R.class,所以r.class和R.class被認為是同一個檔案,就會被自動合併(隨機刪除)一個,所以,到最後導致打包出來的apk就會丟失這個r.class

證明猜想

新建一個test專案,在根目錄建立一個小r.java,這時候打包會報錯的。 parse error.

刪除r.java ,建立一個a.java和一個A.java ..你會發現 a.java被刪除了。。。
尼瑪!!!!好坑啊。。。

解決問題

用磁碟工具新建一個分割槽,把硬碟格式化為“大小寫敏感”的,將專案丟過來打包即可。

結尾

媽媽,mac坑我。。。浪費我好多時間。。

你說這問題複雜吧,也不復雜,可是他的展現形式是一個崩潰,以一個classnotfound展開的,這就很難聯想了。。。絞盡乳汁啊。。

相關文章