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,
),
),
4条答案
按热度按时间bybem2ql1#
我不太确定,但看起来你想在数据库已经锁定的情况下访问或写入smth,可能你应该有
isOpen
方法来检查DB是否打开。xpszyzbs2#
以下是我的想法,也许是解决这个问题的最快方法:试着删除你的android文件夹,确保你把它保存在安全的地方,这样你可以在以后访问它。删除当前的android文件后,在你的根目录下运行
flutter create .
,这将产生一个新的新鲜的android文件夹。最后,使用前一个的细节编辑你的新android文件夹。ef1yzkbh3#
我首先排除了耗时的选项。由于输出的错误日志很可能与
AndroidX
有关,请尝试将您的项目重构为AndroidX。Android Studio中的步骤:
flutter clean
flutter pub cache clean
flutter pub get
,记录任何错误如果某些Flutter包与AndroidX不兼容,此解决方案可能无法正常工作。
sulc1iza4#
快速解决方案:
我也遇到过这个错误,我通过在www.example.com中添加“public”关键字来解决它MainActivity.java