當開啟 Proguard/R8 時, 會發生 Android Instrumented Test 無法通過甚至無法執行
就是在 android buildType debug 裡, 新增以下 Proguard Rule:
-dontshrink
| -dontshrink |
就是在 buildType debug 裡, 新增以下 proguard rule:
-dontshrink
效果跟 -keep 一樣而且依然維持名字 混淆(obfuscate)
至於為什麼是針對 buildType debug
因為 AndroidTest (instrumented test) 預設是依附 debug (預設release是沒有AndroidTest)
參考: 變更測試版本類型 (https://developer.android.com/studio/build/gradle-tips#change-the-test-build-type)
有想過 針對 instrumented test 新增 buildType
最後考慮還是作罷
因為主管可能不會喜歡這提議
而且作罷好處之一
不用修改教學文件
經過
困擾一個月耗費兩個工作週的調查和嘗試(最後還閉關兩天)
期間嘗試下述套件版本更新:
不斷組合上述套件版本 (包括衍伸程式碼修改)
依然有 NoSuchXXX 的錯誤 (不同版本組合有不同NoSuchXXX錯誤)
最後無法避免對 main app 新增 keep proguard rule
雖然這樣workaround方式, 最後能通過測試
但這違背開啟 Proguard/R8 的初衷
查閱 instrumented test 的 R8 configuration
最後一條是
意即 instrumented test app 的混淆後名字 會跟 main app 一致
本來是以為 R8 的 applymapping 有問題
又去查 Google IssueTracker
幾乎 fixed 狀態 或者 跟 我的 issue 只有間接關係
後來想通一個 關鍵:
因為 Android R8 很盡責地工作, 確實地完成 混淆(obfuscate) 和 縮減(shrink)
問題出在
instrumented test app 回報的 NoSuchXXX 那些缺少
都是 main app 沒有使用到的 (但在 instrumented test 直接或間接有用到)
所以被 R8 給 shrink 了
以致 兩邊資訊不一致