Проблема с драйвером jdbc mysql и подписанным apk Android Studio 4

#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:231at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587at 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. Примечания: приложение работает в защищенной локальной сети;)!