0

Proguard 和 postgresql jdbc 驱动程序有问题。

问题:04-30 19:26:36.865: W/PostgresHelper(26968): SSLSocketFactory 类提供org.postgresql.ssl.NonValidatingFactory 无法实例化

在调试模式下这不是问题 - 即成功建立连接。

在“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,佩德罗

编辑:

根据 Barend 的建议,在我添加的 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:根据 Eric LaFortune 的建议,这已通过以下方式解决:

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

非常感谢!:)

4

1 回答 1

0

可能的情况是 Proguard 已将 重命名为org.postgresql.ssl.NonValidatingFactorya.a.a.a将扳手扔到正在进行的反射类加载中。您需要指示 proguard 避免混淆 Postgres JDBC 驱动程序。

简单的方法是将其完全列入白名单。驱动程序本身是开源的,无需保密。在您的 Proguard 配置中,它将类似于:

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

当然,它的使用可能会泄露你的程序代码,所以如果你真的很紧张,你会想要只将它的最小数量列入白名单,这样就很难追踪你的代码的哪些部分正在调用 JDBC。我想这将是一个相当多的反复试验才能弄清楚,但它会大致相同。您也许可以使用-keepnamesover -dontobfuscate

于 2013-04-30T20:47:00.897 回答