我遇到了dalvik dex轉換器和它用於調用方法的操作碼的問題。基本上我有一個在我的類中定義的private final
方法,在調用它時,不是生成invoke-direct
操作碼,而是生成invoke-super
。由於它是一種私有方法,因此該方法在超類中不存在,所以我在設備上遇到VFY違例。我能追查觸發這個確切的情況下,它出現時發生:使用錯誤調用代碼的Dalvik轉換
- 插裝班,JaCoCo,並與
--target 1.6
編譯
invoke-super
而不是invoke-direct
。如果我禁用JaCoCo或者如果我使用--target 1.5
進行編譯,它將使用正確的invoke-direct
操作碼。 在看javap
拆卸類代碼,我可以看到是什麼原因導致dx
超,而不是直接的假設:
好工具,編譯爲1.6:
$ javap -d com.example.ClassName | grep waitForConnectivity
159: invokespecial #115; //Method waitForConnectivity:()V
$ dexdump -d classes.dex | grep waitForConnectivity
147ad8: 7010 6042 0200 |001e: invoke-direct {v2}, Lcom/example/ClassName;.waitForConnectivity:()V // [email protected]
儀表,編譯1.5(--target 1.5
):
$ javap -d com.example.ClassName | grep waitForConnectivity
235: invokespecial #115; //Method waitForConnectivity:()V
$ dexdump -d classes.dex | grep waitForConnectivity
149d4c: 7010 9242 0400 |0018: invoke-direct {v4}, Lcom/example/ClassName;.waitForConnectivity:()V // [email protected]
儀表,編爲1.6:
$ javap -d com.example.ClassName | grep waitForConnectivity
235: invokespecial #115; //Method com/example/ClassName.waitForConnectivity:()V
$ dexdump -d classes.dex | grep waitForConnectivity
149d4c: 6f10 9242 0400 |0018: invoke-super {v4}, Lcom/example/ClassName;.waitForConnectivity:()V // [email protected]
所以不同的是,編譯後的.class文件已編譯Java字節碼引用完全限定類名的this
類(通知「//Method waitForConnectivity:()V
」與「//Method com/example/ClassName.waitForConnectivity:()V
」)。看起來dx
自動假定如果方法名稱是完全限定的,它必須使用invoke-super
,但如果它不合格,它將使用invoke-direct
。
我的問題是:
- 這是Android的
dx
,或JaCoCo錯誤的錯誤嗎? - 我該如何避免這種情況,以便JaCoCo儀器化的類可以在我的自動化測試版本中正常工作?
我目前的解決方法是擁有一個Maven「jacoco」配置文件,並在那裏覆蓋${java.version}
屬性將其從默認的「1.6」更改爲「1.5」。有沒有更好的解決方案?
所以這意味着'ref.getDefiningClass()!= method.getDefiningClass()'。今天我會盡量爲你提供一個更完整的轉儲。但是,使用JaCoCo離線設備和Java 1.6編譯器,問題似乎很容易重現。有趣的是,它並不總是這樣,所以你可能是正確的,還有其他事情正在發生。我只是不知道什麼時候開始。 – Joe
我正在授予賞金,因爲您已經滿足賞金要求的可信部分。雖然尚未解決或追蹤到某個原因/原因,但現在看來,罪魁禍首最有可能是JaCoCo的指導員,儘管我覺得'dx'仍然應該能夠識別被調用方法的定義類等於調用者的定義類,從而導致「INVOKE_DIRECT」如預期的那樣。將需要進一步調查建議。也許我們可以在稍後的聊天中繼續這一點,因爲我有時間回到這裏。 – Joe
謝謝!正如我所說的,'dx --dump'可能有助於查明差異的確切性質。我不會聲稱'dx'是完美無缺的(儘管驕傲使我想要),但是,JaCoCo幾乎肯定會做一些至少有些懷疑的事情。 – danfuzz