#android #mysql #jdbc
#Android #mysql #jdbc
Вопрос:
Я заявляю, что для меня важно подключиться к mysql через драйвер jdbc. Это приложение, которое работает таким образом в течение многих лет.
Если я запускаю приложение из Android Studio на Samsung j5, оно работает нормально. Если вместо этого я скомпилирую apk с подписью и установлю его на то же устройство, я получу это сообщение об ошибке:
09-01 18:01:17.106 21570-21586/? E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
Process: x.wifi, PID: 21570
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:304)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NoClassDefFoundError: com.mysql.jdbc.log.StandardLogger
at b.b.a.a0.x()
at b.b.a.a0.<clinit>()
at b.b.a.q1.connect()
at java.sql.DriverManager.getConnection(DriverManager.java:179)
at java.sql.DriverManager.getConnection(DriverManager.java:213)
at x.Connessione.B0()
at x.Connessione.u()
at x.WifiActivity.H()
at x.WifiActivity.O()
at x.WifiActivity$d0.a()
at x.WifiActivity$d0.doInBackground()
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
мой gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
applicationId "x.wifi"
minSdkVersion 15
targetSdkVersion 28
versionCode 8
versionName "1.7"
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
}
lintOptions {
checkReleaseBuilds true
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
minifyEnabled false
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_6
}
}
dependencies {
androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
implementation group: 'mysql', name: 'mysql-connector-java', version: '5.0.8'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:2.0.1'
testImplementation 'junit:junit:4.13'
}
proguard:
-keep public class com.mysql.* {*;}
-dontwarn com.mysql.**
Я уже пытался включить connector jar в библиотеки, очевидно, с правильной настройкой скрипта gradle, но результат тот же.
До обновления Android Studio с 4.0 до 4.0.1 и обновления gradle с 4 до 6 я правильно скомпилировал и установил подписанный apk без проблем.
Советы?
Ответ №1:
Попробуйте:
-keep public class com.mysql.** {*;}
поскольку класс, который вы теряете, находится в глубоком подпакете под com.mysql
, а не непосредственно в com.mysql
.
Если это не поможет, попробуйте запустить некоторые из отчетов об устранении неполадок и посмотрите, дают ли они вам какие-либо подсказки.
для меня важно подключиться к mysql через драйвер jdbc
При всем уважении, то, что вы считаете это необходимым, не означает, что это разумный выбор для большинства приложений и разработчиков. JDBC является древним и был разработан для клиентов и серверов в стабильной защищенной локальной сети. Он не был разработан для мобильных устройств. Хотя вы можете использовать его, я всегда рекомендую разработчикам сделать что-то еще.
Комментарии:
1. Это решение не решило проблему. Ошибка теперь такова: Вызвана: java.lang. Ошибка в NoClassDefFoundError: com.mysql.jdbc. ConnectionPropertiesImpl$ConnectionProperty
2. Я решил эту проблему, изменив правила proguard и gradle. Примечания: приложение работает в защищенной локальной сети;)!