Flutter应用程序在更新后崩溃:java.lang.IllegalAccessError,如何避免这个问题?

xe55xuns  于 2023-03-16  发布在  Java
关注(0)|答案(4)|浏览(147)

Flutter应用程序在Play商店中更新后崩溃

我有大量的崩溃在Google Play控制台与这种类型的错误:java.lang.IllegalAccessError
大约20%的用户在Play商店更新应用程序时出现此崩溃:

java.lang.IllegalAccessError: 
  at androidx.room.v.e (Unknown Source:15)
  at d.h.a.k.e.onUpgrade (:2)
  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked (SQLiteOpenHelper.java:354) // line number is different in some crashes
  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase (SQLiteOpenHelper.java:250)
  at d.h.a.k.e.c (Unknown Source:4)
  at d.h.a.k.f.N (Unknown Source:4)
  at androidx.room.s.k (Unknown Source:2)
  at androidx.room.s.b (Unknown Source)
  at androidx.work.impl.D.j.b (Unknown Source:9)
  at androidx.work.impl.background.systemjob.b.i (Unknown Source:20)
  at androidx.work.impl.utils.f.a (:1)
  at androidx.work.impl.utils.f.run (Unknown Source:31)
  at androidx.work.impl.utils.k.run (Unknown Source:2)
  at java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1162)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:636)
  at java.lang.Thread.run (Thread.java:784)

此故障的历史记录-〉

我的生产应用遇到了问题,它在没有null safety的flutter旧版本中工作了一段时间(之前)。我将应用迁移到了null safety版本的flutter中,并添加了android 12兼容性。之后我将其添加到了Play store的发布版本中。这是应用版本1.3.0,没有出现任何大规模崩溃情况(发布时间为2022年2月21日下午6:21推出时间为2022年3月17日下午8:20停止,没有出现任何提到的崩溃情况)。在该版本的应用中,我有以下类型的依赖项:

auto_orientation: ^2.2.0
  cached_network_image: ^3.2.0
  connectivity: ^3.0.6
  dio: ^4.0.4
  dio_http_cache: ^0.3.0
  dotted_line: ^3.1.0
  path_provider: ^2.0.8
  firebase_analytics: ^9.0.5
  firebase_messaging: ^11.2.5
  flutter_html: ^2.2.1
  google_mobile_ads: ^1.0.1
  video_player: ^2.2.15
  hive: ^2.0.5
  hive_flutter: ^1.1.0
  photo_view: ^0.13.0
  provider: ^6.0.2
  pull_to_refresh: ^2.0.0
  scrollable_positioned_list: ^0.2.3
  share: ^2.0.4
  shared_preferences: ^2.0.11
  shimmer: ^2.0.0
  sqflite: ^2.0.1
  url_launcher: ^6.0.17

之后,我在应用程序的设计模式和状态管理方面做了一些更改。我的应用程序在调试模式下运行时没有任何错误,我在几台设备上测试了它。没有任何崩溃,并在Play商店推出了我的应用程序,版本名为2.0.0,(发布时间:2022年3月17日8:20 PM替换日期:2022年3月19日9:39 PM,截至今天,之前提到的崩溃案例为13.7K,开始推出时为40%,我不认为这是个大问题,一天后增加到100%),其中我有以下类型的依赖项:

auto_orientation: ^2.2.0
  cached_network_image: ^3.2.0
  chewie: ">=1.1.0 <1.1.1"
  connectivity_plus: ^2.2.1
  equatable: ^2.0.3
  dio: ^4.0.4
  dio_cache_interceptor: ^3.2.6
  dio_cache_interceptor_hive_store: ^3.1.1
  ferry: ^0.10.4
  firebase_analytics: ^9.0.5
  firebase_messaging: ^11.2.5
  flutter_html: ^2.2.1
  provider: ^6.0.2
  google_mobile_ads: ^1.0.1
  hive: ^2.0.5
  path_provider: ^2.0.9
  photo_view: ^0.13.0
  pull_to_refresh: ^2.0.0
  scrollable_positioned_list: ^0.2.3
  share_plus: ^3.0.5
  shared_preferences: ^2.0.13
  shimmer: ^2.0.0
  url_launcher: ^6.0.20

在那之后,我感到恐慌,并停止了发布。我已经发布到生产之前的版本名称为1.3.1,因为它没有这种类型的崩溃。不幸的是,这个版本的应用程序有大量相同的崩溃类型(发布于2022年3月19日9:39下午更换于2022年3月25日3:01下午,推出100%,因为避免以前的崩溃,但它是无用的)。某种清理应用程序存储或重新安装帮助在大多数手机。之后,我想如果我清理应用程序目录和缓存日期从应用程序端,它不会崩溃,并发布了2.0.1版本(应用程序在大多数用户中得到崩溃),但它没有成功。

房扑医生

Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 2.10.3, on Microsoft Windows [Version 10.0.22000.493], locale en-US)
[√] Android toolchain - develop for Android devices (Android SDK version 31.0.0)
[√] Chrome - develop for the web
[X] Visual Studio - develop for Windows
    X Visual Studio not installed; this is necessary for Windows development.
      Download at https://visualstudio.microsoft.com/downloads/.
      Please install the "Desktop development with C++" workload, including all of its default components       
[√] Android Studio (version 4.1)
[√] VS Code (version 1.65.2)
[√] Connected device (3 available)
[√] HTTP Host Availability
该应用程序拥有约25,000名用户,总的来说,它发生了55,347次相同的崩溃,超过6500名用户受到上述崩溃的影响😣。
我对任何帮助、建议或忠告表示感谢🙏。
我对应用程序有何期望:

1.在生产中没有这种崩溃的应用程序(如果我在调试模式中有这种类型的崩溃,那就好多了)
1.任何能避免坠机的方法。
1.出了什么问题。
在我把问题发送到游戏控制台开发人员之前,他们给我发了几个关于java错误文档和崩溃的链接,但我还没有找到任何解决方案,在整个互联网上。

2022年4月7日6:39之后编辑

有关我的android/build.gradle的更多详细信息(版本2.0.x):

buildscript {
    ext.kotlin_version = '1.5.10'
    repositories {
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath 'com.google.gms:google-services:4.3.2'
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

rootProject.buildDir = '../build'
subprojects {
    project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
    project.evaluationDependsOn(':app')
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

我的andorid/app/build.gradle文件:

def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
    localPropertiesFile.withReader('UTF-8') { reader ->
        localProperties.load(reader)
    }
}

def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
    throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}

def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
    flutterVersionCode = '2'
}

def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
    flutterVersionName = '1.0.0'
}

def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
    keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'com.google.gms.google-services'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"

android {
    compileSdkVersion flutter.compileSdkVersion

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    kotlinOptions {
        jvmTarget = '1.8'
    }

    sourceSets {
        main.java.srcDirs += 'src/main/kotlin'
    }

    defaultConfig {
        applicationId "com.<company_name>.<app_name>"
        // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
        minSdkVersion 19
        targetSdkVersion flutter.targetSdkVersion
        versionCode flutterVersionCode.toInteger()
        versionName flutterVersionName
        multiDexEnabled true
    }

    signingConfigs {
       release {
           keyAlias keystoreProperties['keyAlias']
           keyPassword keystoreProperties['keyPassword']
           storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
           storePassword keystoreProperties['storePassword']
       }
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.release
        }
    }
}

flutter {
    source '../..'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.android.support:multidex:2.0.1'
    implementation platform('com.google.firebase:firebase-bom:29.0.4')
    implementation 'com.google.firebase:firebase-analytics'
    // implementation 'com.google.android.gms:play-services-ads:20.5.0'
    implementation 'androidx.cardview:cardview:1.0.0'
}

之前版本的应用程序(1.3.0)具有相同的文件,但未发生任何类似的崩溃。
关于如何在代码中使用cached_network_image:

CachedNetworkImage(
  imageUrl: widget.post.imageUrl,
  width: double.infinity,
  fit: BoxFit.cover,
  placeholder: (url, ctx) => const BigImageShimmer(),
  errorWidget: (context, url, error) => Image.asset(
    'assets/images/error_image.png',
    fit: BoxFit.cover,
    color:
        Theme.of(context).textTheme.bodyText1?.color,
  ),
),
bybem2ql

bybem2ql1#

我不太确定,但看起来你想在数据库已经锁定的情况下访问或写入smth,可能你应该有isOpen方法来检查DB是否打开。

  • 此外,您还可以检查DB初始化。
  • 也许可以从DB类中提供一些代码来帮助您更好地使用它。
  • 或者,如果您尝试关闭DB,如果不需要,请尝试删除此代码。
xpszyzbs

xpszyzbs2#

以下是我的想法,也许是解决这个问题的最快方法:试着删除你的android文件夹,确保你把它保存在安全的地方,这样你可以在以后访问它。删除当前的android文件后,在你的根目录下运行flutter create .,这将产生一个新的新鲜的android文件夹。最后,使用前一个的细节编辑你的新android文件夹。

ef1yzkbh

ef1yzkbh3#

我首先排除了耗时的选项。由于输出的错误日志很可能与AndroidX有关,请尝试将您的项目重构为AndroidX。
Android Studio中的步骤:

  • 备份项目
  • flutter clean
  • flutter pub cache clean
  • 右键单击项目模块〉重构〉迁移到Android X
  • flutter pub get,记录任何错误

如果某些Flutter包与AndroidX不兼容,此解决方案可能无法正常工作。

sulc1iza

sulc1iza4#

快速解决方案:
我也遇到过这个错误,我通过在www.example.com中添加“public”关键字来解决它MainActivity.java

相关问题