2013-04-30 3 views
0

Наличие проблемы с Proguard и драйвером postgresql jdbc.Android Proguard postgresql и ssl connection

Проблема: 04-30 19: 26: 36,865: Вт/PostgresHelper (26968): SSLSocketFactory класс при условии org.postgresql.ssl.NonValidatingFactory не мог быть создан.

Это не проблема, когда в режиме отладки - то есть соединение установлено успешно.

После выполнения «Proguarding» проекта я получаю вышеуказанную ошибку.

У меня есть postgresql-8.3-607.jdbc3.jar под/libs в моем проекте.

Добавлено -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(); 
} 

В этом Я собираюсь по кругу, и после того, как многие поисковые системы не могут прийти к выводу. Какие-нибудь идеи? ;)

ТИА, Pedro

EDIT:

В proguard.cfg файл я добавил, что за любезное предложение Barend в: -keep public class org.postgresql.*

Как -dontobfuscate AFAIK Безразлично» t взять какие-либо дополнительные параметры?

это трассировки стека (когда приложение "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.** { *; } 

Thank вы очень! :)

+1

Вы уверены, что можете/хотите/сделать прямое соединение PG jdbc с Android, и это разумная вещь?Обычно вы делаете веб-сервис/rest/soap, который подключен к db, а затем вы выполняете сам клиент. –

ответ

0

Вероятный случай заключается в том, что Proguard переименовал org.postgresql.ssl.NonValidatingFactory в нечто вроде a.a.a.a, бросая гаечный ключ в загрузку класса отражающих. Вы хотите проинструктировать proguard, чтобы избежать обфускации драйвера Postgres JDBC.

Легкий способ - полностью перевести его в белый список. Сам драйвер - с открытым исходным кодом, не нужно скрывать его. В вашем Proguard конфигурации, это будет что-то вроде:

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

Конечно, его использование может выявить вещи о вашей программе кода, так что если вы действительно нервничал, вы хотите, чтобы белый список только минимальное количество из этого, так что становится труднее проследить, какие части вашего кода вызывают JDBC. Я предполагаю, что это будет немного пробная ошибка, чтобы понять, но это будет почти то же самое. Возможно, вам удастся сделать -keepnames по телефону -dontobfuscate.

+0

Опция -keep - хорошее начало. Может быть необходимо также сохранить классы в подпакетах: «-keep class org.postgresql. **». Если этого еще недостаточно, может потребоваться также сохранить свои поля и методы: «-keep class org.postgresql. ** {*;}». –

+0

Эрик, ты прав на «деньги»! :) Спасибо ОЧЕНЬ много! Теперь, когда вы просто прокомментировали, как я могу принять ваш ответ как правильный? С уважением, Pedro. P.S. Большое спасибо Баренду тоже :) –