Skip to content

Instantly share code, notes, and snippets.

@tw-Frey
Created June 22, 2022 22:50
Show Gist options
  • Select an option

  • Save tw-Frey/d1028e19632e4f9ec38c7d7c6fd494e0 to your computer and use it in GitHub Desktop.

Select an option

Save tw-Frey/d1028e19632e4f9ec38c7d7c6fd494e0 to your computer and use it in GitHub Desktop.
當開啟 Proguard/R8 時, 會發生 Android Instrumented Test 無法通過甚至無法執行

問題

當開啟 Proguard/R8 時, 會發生 Android Instrumented Test 無法通過甚至無法執行

解決方案之一

就是在 android buildType debug 裡, 新增以下 Proguard Rule:

-dontshrink
@tw-Frey
Copy link
Copy Markdown
Author

tw-Frey commented Jun 22, 2022

經過

困擾一個月耗費兩個工作週的調查和嘗試(最後還閉關兩天)
期間嘗試下述套件版本更新:

  • Gradle,
  • AGP(Android-Gradle-Plugin)
  • Kotlin
  • KGP(Kotlin-Gradle-Plugin)

不斷組合上述套件版本 (包括衍伸程式碼修改)
依然有 NoSuchXXX 的錯誤 (不同版本組合有不同NoSuchXXX錯誤)
最後無法避免對 main app 新增 keep proguard rule

instrumented test 回報少什麼, main app 就 keep 什麼

雖然這樣workaround方式, 最後能通過測試
但這違背開啟 Proguard/R8 的初衷


查閱 instrumented test 的 R8 configuration
最後一條是

-applymapping "xxx\app\build\outputs\mapping\devDebug\mapping.txt"

意即 instrumented test app 的混淆後名字 會跟 main app 一致

本來是以為 R8 的 applymapping 有問題
又去查 Google IssueTracker

幾乎 fixed 狀態 或者 跟 我的 issue 只有間接關係

後來想通一個 關鍵:
因為 Android R8 很盡責地工作, 確實地完成 混淆(obfuscate)縮減(shrink)
問題出在

縮減(shrink)

instrumented test app 回報的 NoSuchXXX 那些缺少
都是 main app 沒有使用到的 (但在 instrumented test 直接或間接有用到)
所以被 R8 給 shrink 了
以致 兩邊資訊不一致

@tw-Frey
Copy link
Copy Markdown
Author

tw-Frey commented Jun 22, 2022

解決方法

就是在 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
最後考慮還是作罷
因為主管可能不會喜歡這提議
而且作罷好處之一

不用修改教學文件

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment