2012-07-06 67 views
3

我們最近決定在我們的Android版本中禁用代碼混淆,因爲雖然它使得最終APK稍微大一點,但它使調試變得更加困難。爲什麼在ProGuard中禁用混淆可能會破壞優化步驟?

自從我們這樣做以來,我一直在我們的應用程序中出現以前不存在的崩潰,即混淆處於活動狀態。通常這些崩潰是由Java VerifyErrorNoSuchMethodError引起的。

這裏有兩個這樣的錯誤我突然看到我禁用模糊:

Could not find method org.apache.http.HttpConnectionMetrics.getResponseCount, referenced from method com.google.android.apps.analytics.PipelinedRequester.sendRequests 
W/dalvikvm(6652): VFY: unable to resolve virtual method 16112: Lorg/apache/http/HttpConnectionMetrics;.getResponseCount()J 
W/dalvikvm(6652): VFY: rejecting opcode 0x6e at 0x000c 
W/dalvikvm(6652): VFY: rejected Lcom/google/android/apps/analytics/PipelinedRequester;.sendRequests()V 
W/dalvikvm(6652): Verifier rejected class Lcom/google/android/apps/analytics/PipelinedRequester; 
D/dalvikvm(6652): GC_CONCURRENT freed 253K, 46% free 3261K/6023K, external 0K/0K, paused 2ms+2ms 
I/dalvikvm(6652): Rejecting re-init on previously-failed class Lcom/google/android/apps/analytics/PipelinedRequester; v=0x4062de30 
D/AndroidRuntime(6652): Shutting down VM 
W/dalvikvm(6652): threadid=1: thread exiting with uncaught exception (group=0x400a7560) 
E/AndroidRuntime(6652): FATAL EXCEPTION: main 
E/AndroidRuntime(6652): java.lang.VerifyError: com/google/android/apps/analytics/PipelinedRequester 
... 

我可以通過類/合併禁止類合併解決此錯誤/ *

另一個錯誤我看到是這樣的:

I/dalvikvm(7292): DexOpt: access denied from Lcom/urbanairship/analytics/EventUploadManager; to field Lorg/apache/http/entity/AbstractHttpEntity;.contentEncoding 
W/dalvikvm(7292): VFY: unable to resolve instance field 5188 
D/dalvikvm(7292): VFY: replacing opcode 0x5b at 0x00ec 
I/dalvikvm(7292): Could not find method org.apache.http.conn.scheme.PlainSocketFactory.<init>, referenced from method com.google.android.apps.analytics.PipelinedRequester.<init> 
W/dalvikvm(7292): VFY: unable to resolve direct method 15044: Lorg/apache/http/conn/scheme/PlainSocketFactory;.<init> (B)V 
D/dalvikvm(7292): VFY: replacing opcode 0x70 at 0x0003 
D/dalvikvm(7292): VFY: dead code 0x0006-0009 in Lcom/google/android/apps/analytics/PipelinedRequester;.<init> (Lorg/apache/http/HttpHost;)V 
I/dalvikvm(7292): DexOpt: access denied from Lcom/google/android/apps/analytics/PipelinedRequester; to field Lorg/apache/http/impl/SocketHttpClientConnection;.open 
W/dalvikvm(7292): VFY: unable to resolve instance field 5234 
D/dalvikvm(7292): VFY: replacing opcode 0x55 at 0x0006 
D/dalvikvm(7292): VFY: dead code 0x0008-000e in Lcom/google/android/apps/analytics/PipelinedRequester;.closeConnection()V 
D/dalvikvm(7292): VFY: dead code 0x0010-0011 in Lcom/google/android/apps/analytics/PipelinedRequester;.closeConnection()V 
I/dalvikvm(7292): DexOpt: access denied from Lcom/google/android/apps/analytics/PipelinedRequester; to field Lorg/apache/http/impl/SocketHttpClientConnection;.open 
W/dalvikvm(7292): VFY: unable to resolve instance field 5234 
D/dalvikvm(7292): VFY: replacing opcode 0x55 at 0x0006 
D/dalvikvm(7292): VFY: dead code 0x0008-0009 in Lcom/google/android/apps/analytics/PipelinedRequester;.addRequest (Lorg/apache/http/HttpEntityEnclosingRequest;)V 
D/dalvikvm(7292): GC_CONCURRENT freed 253K, 47% free 3251K/6023K, external 0K/0K, paused 2ms+3ms 
I/dalvikvm(7292): DexOpt: access denied from Lcom/google/android/apps/analytics/PipelinedRequester; to field Lorg/apache/http/impl/AbstractHttpClientConnection;.metrics 
W/dalvikvm(7292): VFY: unable to resolve instance field 5225 
D/dalvikvm(7292): VFY: replacing opcode 0x54 at 0x0008 
D/dalvikvm(7292): VFY: dead code 0x000a-0090 in Lcom/google/android/apps/analytics/PipelinedRequester;.sendRequests()V 
D/AndroidRuntime(7292): Shutting down VM 
W/dalvikvm(7292): threadid=1: thread exiting with uncaught exception (group=0x400a7560) 
E/AndroidRuntime(7292): FATAL EXCEPTION: main 
E/AndroidRuntime(7292): java.lang.NoSuchMethodError: org.apache.http.conn.scheme.PlainSocketFactory.<init> 

這一次我可以通過設置解決方法/傳播/ *

但是,爲什麼這些問題只出現在模糊處理已禁用?一個人不應該對另一個沒有影響嗎?

+0

我注意到,我看到的所有錯誤都涉及Apache HttpClient的類。也許我正朝着錯誤的方向走? – Matthias 2012-07-06 16:07:37

回答

4

混淆是節省您的,因爲它將您的Apache HttpClient類的副本重命名爲不會與這些類的副本相沖突的名稱already present in Android

討厭之處......你可能要考慮不使用Apache的HttpClient所有,並使用內置HttpURLConnection類的建議傑西·威爾遜:

http://android-developers.blogspot.com/2011/09/androids-http-clients.html

你可以試試這個在HttpURLConnection的Android的友好木皮:

https://github.com/kevinsawicki/http-request

如果你真的使用pache HttpClient,要麼使用嵌入在Android中的舊版本,要麼嘗試調整您的ProGuard配置爲,只需混淆HttpClient庫。

+1

哈,這正是問題所在。在我閱讀你的回覆之前,我確實發現並打了我的額頭。 Maven將Apache Http組件(核心和客戶端)用作編譯範圍的傳遞依賴項,所以ProGuard將它添加爲-injar而不是-libraryjar。解決方案是使用提供的範圍聲明它。謝謝! – Matthias 2012-07-09 09:49:24