签名发布后尝试调试时 Flutter android App 崩溃

Posted

技术标签:

【中文标题】签名发布后尝试调试时 Flutter android App 崩溃【英文标题】:Flutter android App crashes when trying to debug after signing release 【发布时间】:2020-08-20 13:11:20 【问题描述】:

我是 Flutter 的新手,我正在构建一个 Flutter 应用程序作为学校项目的一部分。我和我的团队正在构建 iosandroid 和 web 应用程序版本,我的任务是生成和签署我的应用程序包以在 google play 中发布。我能够成功签署捆绑包并上传项目。我无法在模拟器上测试发布版本,但这是另一个可能相关的问题。

关于这一点,我现在在调试我的应用程序时遇到了问题。在重命名和配置构建类型之前没有问题,我只是使用默认应用程序 ID 并在 VScode 中运行调试器。我的应用程序似乎构建成功(我认为是因为我没有收到错误),但它没有正确安装在模拟器上。我收到一个关于仿真的弹出通知,不幸的是应用程序不断关闭。在捕获日志中,我看到“等待天文台端口可用......”。

我已经重置了模拟器,flutter clean 并重建了。我曾尝试在 android studio(调试)中运行/清理/构建无济于事。

这里是捕获日志。我没有将它们全部包括在内,因为看起来应用程序正在正确构建。

                   A: android:name(0x01010003)="com.google.android.gms.measurement.AppMeasurementReceiver" (Raw: "com.google.android.gms.measurement.AppMeasurementReceiver")
                   A: android:enabled(0x0101000e)=(type 0x12)0xffffffff
                   A: android:exported(0x01010010)=(type 0x12)0x0
                 E: receiver (line=177)
                   A: android:name(0x01010003)="com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver" (Raw: "com.google.android.gms.measurement.AppMeasurementInstallReferrerReceiver")
                   A: android:permission(0x01010006)="android.permission.INSTALL_PACKAGES" (Raw: "android.permission.INSTALL_PACKAGES")
                   A: android:enabled(0x0101000e)=(type 0x12)0xffffffff
                   A: android:exported(0x01010010)=(type 0x12)0xffffffff
                   E: intent-filter (line=182)
                     E: action (line=183)
                       A: android:name(0x01010003)="com.android.vending.INSTALL_REFERRER" (Raw: "com.android.vending.INSTALL_REFERRER")
                 E: service (line=187)
                   A: android:name(0x01010003)="com.google.android.gms.measurement.AppMeasurementService" (Raw: "com.google.android.gms.measurement.AppMeasurementService")
                   A: android:enabled(0x0101000e)=(type 0x12)0xffffffff
                   A: android:exported(0x01010010)=(type 0x12)0x0
                 E: service (line=191)
                   A: android:name(0x01010003)="com.google.android.gms.measurement.AppMeasurementJobService" (Raw: "com.google.android.gms.measurement.AppMeasurementJobService")
                   A: android:permission(0x01010006)="android.permission.BIND_JOB_SERVICE" (Raw: "android.permission.BIND_JOB_SERVICE")
                   A: android:enabled(0x0101000e)=(type 0x12)0xffffffff
                   A: android:exported(0x01010010)=(type 0x12)0x0
                 E: provider (line=197)
                   A: android:name(0x01010003)="com.google.firebase.provider.FirebaseInitProvider" (Raw: "com.google.firebase.provider.FirebaseInitProvider")
                   A: android:exported(0x01010010)=(type 0x12)0x0
                   A: android:authorities(0x01010018)="com.sensationalscience.sensational_science.firebaseinitprovider" (Raw: "com.sensationalscience.sensational_science.firebaseinitprovider")
                   A: android:initOrder(0x0101001a)=(type 0x10)0x64
                 E: meta-data (line=203)
                   A: android:name(0x01010003)="com.google.android.gms.version" (Raw: "com.google.android.gms.version")
                   A: android:value(0x01010024)=@0x7f080004
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [   +6 ms] Stopping app 'app.apk' on Android SDK built for x86.
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [        ] executing: C:\Users\Lauren\AppData\Local\Android\sdk\platform-tools\adb.exe -s emulator-5554 shell am force-stop com.sensationalscience.sensational_science
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [  +44 ms] executing: C:\Users\Lauren\AppData\Local\Android\sdk\platform-tools\adb.exe -s emulator-5554 shell pm list packages com.sensationalscience.sensational_science
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [ +215 ms] package:com.sensationalscience.sensational_science
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [   +2 ms] executing: C:\Users\Lauren\AppData\Local\Android\sdk\platform-tools\adb.exe -s emulator-5554 shell cat /data/local/tmp/sky.com.sensationalscience.sensational_science.sha1
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [  +24 ms] 2ef7da51e6c1f4f4170671be4372471e59f61ee6
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [        ] Installing APK.
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [   +1 ms] executing: C:\Users\Lauren\AppData\Local\Android\sdk\platform-tools\adb.exe version
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [  +16 ms] Android Debug Bridge version 1.0.41
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <==            Version 29.0.6-6198805
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <==            Installed as C:\Users\Lauren\AppData\Local\Android\sdk\platform-tools\adb.exe
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [        ] executing: C:\Users\Lauren\AppData\Local\Android\sdk\platform-tools\adb.exe start-server
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== ["event":"app.progress","params":"appId":"bc8e3997-0174-4387-ae07-3b6f69cdc04d","id":"1","progressId":null,"message":"Installing build\\app\\outputs\\apk\\app.apk..."]
[12:19:52 PM] [FlutterRun] [Info] [Flutter] <== [  +17 ms] executing: C:\Users\Lauren\AppData\Local\Android\sdk\platform-tools\adb.exe -s emulator-5554 install -t -r C:\Users\Lauren\Documents\School\467\sensational_science\build\app\outputs\apk\app.apk
[12:19:56 PM] [FlutterRun] [Info] [Flutter] <== [+3493 ms] Performing Streamed Install
[12:19:56 PM] [FlutterRun] [Info] [Flutter] <==            Success
[12:19:56 PM] [FlutterRun] [Info] [Flutter] <== ["event":"app.progress","params":"appId":"bc8e3997-0174-4387-ae07-3b6f69cdc04d","id":"1","progressId":null,"finished":true]
[12:19:56 PM] [FlutterRun] [Info] [Flutter] <== [   +1 ms] executing: C:\Users\Lauren\AppData\Local\Android\sdk\platform-tools\adb.exe -s emulator-5554 shell echo -n cc0ff10c7a448e68c958b5ace7858fca4554ee4e > /data/local/tmp/sky.com.sensationalscience.sensational_science.sha1
[12:19:56 PM] [FlutterRun] [Info] [Flutter] <== [  +31 ms] Android SDK built for x86 startApp
[12:19:56 PM] [FlutterRun] [Info] [Flutter] <== [   +2 ms] executing: C:\Users\Lauren\AppData\Local\Android\sdk\platform-tools\adb.exe -s emulator-5554 shell am start -a android.intent.action.RUN -f 0x20000000 --ez enable-background-compilation true --ez enable-dart-profiling true --ez enable-checked-mode true --ez verify-entry-points true --ez start-paused true com.sensationalscience.sensational_science/com.sensationalscience.sensational_science.MainActivity
[12:19:56 PM] [FlutterRun] [Info] [Flutter] <== [  +95 ms] Starting: Intent  act=android.intent.action.RUN flg=0x20000000 cmp=com.sensationalscience.sensational_science/.MainActivity (has extras) 
[12:19:56 PM] [FlutterRun] [Info] [Flutter] <== [        ] Waiting for observatory port to be available...
Tue May 05 2020 [12:23:20 GMT-0600 (Mountain Daylight Time)] Log file ended

这是我的应用级 build.gradle。请注意我的构建类型。我不确定这些配置是否正确。我关注了https://flutter.dev/docs/deployment/android,但他们对如何设置构建类型的解释有限。

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 = '1'


def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) 
    flutterVersionName = '1.0'


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

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


    compileSdkVersion 28

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

    lintOptions 
        disable 'InvalidPackage'
    

    defaultConfig 

        applicationId "com.sensationalscience.sensational_science"
        minSdkVersion 16
        targetSdkVersion 28
        multiDexEnabled true
        versionCode = flutterVersionCode.toInteger()
        versionName flutterVersionName
    


//**Note in my app I have the correct key info I just replaced the information here.
    signingConfigs 
        release 
            keyAlias keystoreProperties['xx']
            keyPassword keystoreProperties['xx']
            storeFile keystoreProperties['C:\\Keystore\\xx'] ? file(keystoreProperties['xx']) : null
            storePassword keystoreProperties['xx']
        
    
    buildTypes 
        release 
            signingConfig signingConfigs.release
        

        debug 

            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.debug
        
    




flutter 
    source '../..'


dependencies 
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.google.firebase:firebase-analytics:17.2.2' // connect to firebase analytics
    implementation 'com.google.firebase:firebase-auth:19.3.0' // connect to firebase authentication
    implementation 'com.google.firebase:firebase-firestore:21.4.2' // connect to firebase coud firestore
    implementation 'com.android.support:multidex:1.0.3' // allow more than 64k methods with multidex enabling

这是我的 android 清单。我想知道 MainActivy 是否是问题所在。我不太确定该文件在哪里/究竟是什么,并且在捕获日志的末尾有一个在启动 Intent 时对其的引用。 ``

package="com.sensationalscience.sensational_science">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
     calls FlutterMain.startInitialization(this); in its onCreate method.
     In most cases you can leave this as-is, but you if you want to provide
     additional functionality it is fine to subclass or reimplement
     FlutterApplication and put your custom class here. -->
<application
    android:name="io.flutter.app.FlutterApplication"
    android:label="sensational_science"
    android:icon="@mipmap/ic_launcher">
    <activity
        android:name=".MainActivity"
        android:launchMode="singleTop"
        android:theme="@style/LaunchTheme"
        android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
        android:hardwareAccelerated="true"
        android:windowSoftInputMode="adjustResize">

        <!-- Specifies an Android theme to apply to this Activity as soon as
             the Android process has started. This theme is visible to the user
             while the Flutter UI initializes. After that, this theme continues
             to determine the Window background behind the Flutter UI. -->
        <meta-data
          android:name="io.flutter.embedding.android.NormalTheme"
          android:resource="@style/NormalTheme"
          />
        <!-- Displays an Android View that continues showing the launch screen
             Drawable until Flutter paints its first frame, then this splash
             screen fades out. A splash screen is useful to avoid any visual
             gap between the end of Android's launch screen and the painting of
             Flutter's first frame. -->
        <meta-data
          android:name="io.flutter.embedding.android.SplashScreenDrawable"
          android:resource="@drawable/launch_background"
          />
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <!-- Add UCrop Activity for image cropping (MPJ 4/21/20)-->
    <activity
        android:name="com.yalantis.ucrop.UCropActivity"
        android:screenOrientation="portrait"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar"/>

    <!-- Don't delete the meta-data below.
         This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
    <meta-data
        android:name="flutterEmbedding"
        android:value="2" />
</application>

这是我的 build.gradle。我收到此错误无法使用 Gradle 分发“https://services.gradle.org/distributions/gradle-5.6.2-all.zip”运行分阶段构建操作。 无法启动守护进程。 此问题可能是由于守护程序配置不正确造成的。 例如,使用了无法识别的 jvm 选项。 请参阅https://docs.gradle.org/5.6.2/userguide/gradle_daemon.html 上有关守护进程的用户手册一章

处理命令行:C:\Program Files (x86)\Java\jdk1.8.0_172\bin\java.exe -Xmx1536M -Dfile.encoding=utf8 -Duser.country=US -Duser.language=en -Duser .variant -cp C:\Users\Lauren.gradle\wrapper\dists\gradle-5.6.2-all\9st6wgf78h16so49nn74lgtbb\gradle-5.6.2\lib\gradle-launcher-5.6.2.jar org.gradle.launcher。 daemon.bootstrap.GradleDaemon 5.6.2 请阅读以下流程输出以了解更多信息: 初始化虚拟机时出错 无法为 1572864KB 对象 heapJava(0) 保留足够的空间

       buildscript 
            ext.kotlin_version = '1.3.50'
            repositories 
                google()
                jcenter()
            

            dependencies 
                classpath 'com.android.tools.build:gradle:3.5.0'
                classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
                classpath 'com.google.gms:google-services:4.3.3' // for connecting to firebase
            
        

        allprojects 
            repositories 
                google()
                jcenter()
            
        

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

        task clean(type: Delete) 
            delete rootProject.buildDir
        

编辑:我添加到捕获日志中

编辑:添加 android studio 崩溃细节:

  --------- beginning of crash
2020-05-05 13:37:49.148 13524-13524/com.sensationalscience.sensational_science E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.sensationalscience.sensational_science, PID: 13524
    java.lang.RuntimeException: Unable to instantiate activity ComponentInfocom.sensationalscience.sensational_science/com.sensationalscience.sensational_science.MainActivity: java.lang.ClassNotFoundException: Didn't find class "com.sensationalscience.sensational_science.MainActivity" on path: DexPathList[[zip file "/data/app/com.sensationalscience.sensational_science-TWyC0kIWuswGoy1G-VAtCQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.sensationalscience.sensational_science-TWyC0kIWuswGoy1G-VAtCQ==/lib/x86, /data/app/com.sensationalscience.sensational_science-TWyC0kIWuswGoy1G-VAtCQ==/base.apk!/lib/x86, /system/lib, /vendor/lib]]
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2718)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
     Caused by: java.lang.ClassNotFoundException: Didn't find class "com.sensationalscience.sensational_science.MainActivity" on path: DexPathList[[zip file "/data/app/com.sensationalscience.sensational_science-TWyC0kIWuswGoy1G-VAtCQ==/base.apk"],nativeLibraryDirectories=[/data/app/com.sensationalscience.sensational_science-TWyC0kIWuswGoy1G-VAtCQ==/lib/x86, /data/app/com.sensationalscience.sensational_science-TWyC0kIWuswGoy1G-VAtCQ==/base.apk!/lib/x86, /system/lib, /vendor/lib]]
        at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:93)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
        at android.app.Instrumentation.newActivity(Instrumentation.java:1173)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2708)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6541) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767) 

【问题讨论】:

尝试在清单文件中添加&lt;uses-permission android:name="android.permission.INTERNET" /&gt; 遇到了同样的问题。我在 android studio 中调试并得到了更有用的响应。我会用它来编辑我的帖子。 这样更好,即时运行可能是问题所在,请查看此帖子:***.com/questions/43435658/… 我在该页面上找不到解决方案,但我确实注意到 Build build\app\outputs\apk\debug\app-debug.apk。与它安装的不同。注意它是一个 apk 不是调试 apk 正在安装 build\app\outputs\apk\app.apk... 当我在主分支上运行调试时(尚未合并更改)它正确构建调试 apk 然后安装调试 apk。我想知道为什么它没有安装调试 apk? 【参考方案1】:

我已经解决了这个问题。当我更改应用程序名称/ID 时,我不小心更改了 MainActivity.java 类名。我将班级名称从 Sensational Science 更改为 MainActivity。

package com.sensationalscience.sensational_science

import io.flutter.embedding.android.FlutterActivity

class MainActivity: FlutterActivity() 

【讨论】:

以上是关于签名发布后尝试调试时 Flutter android App 崩溃的主要内容,如果未能解决你的问题,请参考以下文章

flutter电子木鱼flutter 打包 android apk,记录配置签名的过程/调试的过程及flutter build apk放到手机上用。

flutter电子木鱼flutter 打包 android apk,记录配置签名的过程/调试的过程及flutter build apk放到手机上用。

Flutter 无法接受安卓许可

在 Flutter 中限制 Google Directions API 密钥

VS code 进行 flutter 调试时启动后就停止,无法调试的问题

黑莓设备中的调试应用程序