Android Proguard postgresql和ssl连接

问题描述:

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

的可能的情况是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