2013-04-30 76 views
0

Proguard和postgresql jdbc驅動程序出現問題。Android Proguard postgresql和ssl連接

問題: 04-30 19:26:36.865:W/PostgresHelper(26968):提供org.postgresql.ssl.NonValidatingFactory的SSLSocketFactory的類不能被實例化

這在調試模式下不成問題 - 即連接建立成功。

「Proguarding」項目後,我得到了上述錯誤。

我在我的項目中有/ libs下的postgresql-8.3-607.jdbc3.jar。

新增-dontwarn org.postgresql **到proguard.cfg(出口沒有這將無法完成)

這是代碼(共常見)位:

try { 
Class.forName("org.postgresql.Driver"); 
String url = decrypt(pgurl); 
Properties props = new Properties(); 
props.setProperty("user", decrypt(pguser)); 
props.setProperty("password", decrypt(pgpass)); 
props.setProperty("ssl", "true"); 
props.setProperty("sslfactory", "org.postgresql.ssl.NonValidatingFactory"); 
conn = DriverManager.getConnection(url, props); 
} catch (ClassNotFoundException e) { 
Log.w(TAG, "Postgresql Class not found!"); 
System.exit(1); 
} catch (SQLException e) { 
Log.w(TAG, "Postgresql connection failure!"); 
Log.w(TAG, e.getMessage()); 
} catch (Exception e) { 
e.printStackTrace(); 
} 

在這點我正在圈圈,並在大量的谷歌搜索無法得出結論。 有什麼見解嗎? ;)

TIA, 佩德羅

編輯:

在我已經添加了proguard.cfg文件,按照副把的友好建議: -keep public class org.postgresql.*

至於-dontobfuscate AFAIK沒有按」沒有采取任何額外的參數?

這是堆棧跟蹤(當應用程序是 「Proguarded」):

04-30 23:11:09.355: E/System(30717): Uncaught exception thrown by finalizer 04-30 23:11:09.355: E/System(30717): java.lang.NullPointerException 04-30 23:11:09.355: E/System(30717): at org.postgresql.d.g.close(Unknown Source) 04-30 23:11:09.355: E/System(30717): at org.postgresql.d.g.finalize(Unknown Source) 04-30 23:11:09.355: E/System(30717): at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:186) 04-30 23:11:09.355: E/System(30717): at java.lang.Daemons$FinalizerDaemon.run(Daemons.java:169) 04-30 23:11:09.355: E/System(30717): at java.lang.Thread.run(Thread.java:856)

EDIT2: 按照埃裏克LaFortune建議這已經解決了:

-keep class org.postgresql.** { *; } 

謝謝你真是太棒了! :)

+1

你確定你可以/想要/做一個直接從Android的PG jdbc連接,這是一個明智的做法嗎?您通常會創建一個連接到數據庫的Web服務/休息/ soap,然後繼續客戶端本身。 – 2013-04-30 22:23:38

回答

0

的可能的情況是Proguard的已更名爲org.postgresql.ssl.NonValidatingFactory喜歡的東西a.a.a.a,扔扳手到反射類加載回事。您需要指示proguard以避免混淆Postgres JDBC驅動程序。

簡單的方法是將其完全白名單。驅動程序本身是開源的,不需要對此保密。在您的ProGuard配置文件,它會是這樣的:

-keep org.postgresql.* 
-dontobfuscate org.postgresql.* 

當然,它的使用可以揭示事物關於您的程序代碼,所以如果你真的很緊張,你要只列入白名單的最低金額,因此跟蹤代碼的哪些部分調用JDBC變得更加困難。我想這將是相當多的試驗和錯誤,但它會大致相同。您可能可以通過與-keepnames合作。

+0

-keep選項是一個好開始。可能還需要將子類保存在子包中:「-keep class org.postgresql。**」。如果仍然不夠,可能還需要保留其字段和方法:「-keep class org.postgresql。** {*;}」。 – 2013-04-30 23:36:57

+0

埃裏克你是對的「錢」! :) 非常感謝你! 既然你剛剛評論過我該如何接受你的答案作爲正確的答案? 此致敬禮, 佩德羅。 P.S.非常感謝Barend :) – 2013-04-30 23:44:36