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.** { *; }
谢谢你真是太棒了! :)
的可能的情况是Proguard的已更名为org.postgresql.ssl.NonValidatingFactory
喜欢的东西a.a.a.a
,扔扳手到反射类加载回事。您需要指示proguard以避免混淆Postgres JDBC驱动程序。
简单的方法是将其完全白名单。驱动程序本身是开源的,不需要对此保密。在您的ProGuard配置文件,它会是这样的:
-keep org.postgresql.*
-dontobfuscate org.postgresql.*
当然,它的使用可以揭示事物关于您的程序代码,所以如果你真的很紧张,你要只列入白名单的最低金额,因此跟踪代码的哪些部分调用JDBC变得更加困难。我想这将是相当多的试验和错误,但它会大致相同。您可能可以通过与-keepnames
合作。
-keep选项是一个好开始。可能还需要将子类保存在子包中:“-keep class org.postgresql。**”。如果仍然不够,可能还需要保留其字段和方法:“-keep class org.postgresql。** {*;}”。 – 2013-04-30 23:36:57
埃里克你是对的“钱”! :) 非常感谢你! 既然你刚刚评论过我该如何接受你的答案作为正确的答案? 此致敬礼, 佩德罗。 P.S.非常感谢Barend :) – 2013-04-30 23:44:36
你确定你可以/想要/做一个直接从Android的PG jdbc连接,这是一个明智的做法吗?您通常会创建一个连接到数据库的Web服务/休息/ soap,然后继续客户端本身。 – 2013-04-30 22:23:38