Flutter 发布的 apk 不工作,但调试 apk 工作正常

Posted

技术标签:

【中文标题】Flutter 发布的 apk 不工作,但调试 apk 工作正常【英文标题】:Flutter released apk is not working but debug apk is working fine 【发布时间】:2021-09-03 21:00:18 【问题描述】:

_getMessages() 函数用于从手机中获取 SMS 消息并将它们存储在 _messages 中。此外,在 UI 部分,我有一个重新加载按钮 (floatingActionButton),它调用 _getMessages()。现在,预期的行为是,一旦打开应用程序,就应该获取并显示现有消息,并且稍后到达的新消息,要在屏幕上查看它们,用户可以按下重新加载按钮,再次调用_getMessages() 并显示新消息。

此代码在调试 apk 中有效,但发布的 apk 在安装在其他设备上(非调试模式)时,应用程序不起作用。另外,我使用Telephony 来获取消息。是不是因为函数和变量在_HomeState 中的定义方式?所以,我不确定错误是代码还是包。提前致谢。

import 'package:OffQuiz/home/Quiz/quizCard.dart';
import 'package:OffQuiz/shared/appBar.dart';
import 'package:flutter/material.dart';
import 'package:telephony/telephony.dart';

class Home extends StatefulWidget 
  Home(Key? key, required this.title) : super(key: key);

  final String title;

  @override
  _HomeState createState() => _HomeState();


class _HomeState extends State<Home> 
  final telephony = Telephony.instance;
  List<SmsMessage> _messages = [];

  @override
  void initState() 
    super.initState();
    _getMessages();
  

  Future<void> _getMessages() async 
    List<SmsMessage> temp;
    temp = await telephony
        .getInboxSms(columns: [SmsColumn.ADDRESS, SmsColumn.BODY]);
    setState(() 
      _messages = temp;
    );
  

  @override
  Widget build(BuildContext context) 
    // getMessages();

    return Scaffold(
      appBar: appBar("OffQuiz"),
      body: _messages.length != 0
          ? ListView(
              children: _messages
                  .map((quiz) => QuizCard(
                        quiz: quiz,
                      ))
                  .toList(),
            )
          : Center(
              child: Column(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  Text(
                    "Please reload to fetch the latest messages",
                    style: TextStyle(
                        fontSize: 20,
                        fontWeight: FontWeight.w400,
                        color: Colors.grey),
                  ),
                ],
              ),
            ),
      floatingActionButton: FloatingActionButton(
        onPressed: _getMessages,
        child: Icon(
          Icons.refresh,
          color: Colors.white,
        ),
      ),
    );
  


【问题讨论】:

尝试使用flutter run --release命令在发布模式下调试应用 @prahack flutter run --release 确实在调试设备上安装了已发布的 apk,但我不确定如何进行调试,如果您分享一个文档的链接来解释如何使用上述命令进行调试。 【参考方案1】:

以下方法对我有用,但您可以尝试以下方法,它很可能在大多数情况下都有效。

    添加 android/app/proguard-rules.pro
#Flutter Wrapper
-keep class io.flutter.app.**  *; 
-keep class io.flutter.plugin.**   *; 
-keep class io.flutter.util.**   *; 
-keep class io.flutter.view.**   *; 
-keep class io.flutter.**   *; 
-keep class io.flutter.plugins.**   *; 
-keep class androidx.lifecycle.**  *;  
-keep @interface com.google.gson.annotations.SerializedName
-keep @interface com.google.gson.annotations.Expose
-keepattributes *Annotation*
 #https://github.com/flutter/flutter/issues/58479
 #https://medium.com/@swav.kulinski/flutter-and-android-obfuscation-8768ac544421
    在应用级 build.gradle 中为 buildTypes 添加 proguard
buildTypes 
release 
    profile 
        matchingFallbacks = ['debug', 'release']
    
minifyEnabled true
useProguard true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release


lintOptions 
  disable 'InvalidPackage'
  checkReleaseBuilds false

    编辑 MainActivity.kt(主要活动 kotlin 文件):
import androidx.annotation.NonNull;
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity: FlutterActivity() 
     override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) 
      GeneratedPluginRegistrant.registerWith(flutterEngine);
  

【讨论】:

以上是关于Flutter 发布的 apk 不工作,但调试 apk 工作正常的主要内容,如果未能解决你的问题,请参考以下文章

将flutter从master切换到stable后无法构建发布apk

在 Debug 模式下工作正常 vs Build APK 不工作,Flutter

Flutter 应用程序无法在 apk-release 中运行,但可以在调试模式下运行(即使在授予 Internet 权限后)

调试 APK 工作时签名的 APK 文件不工作

调试 APK 工作正常,包中的 APKS 工作正常,但发布包不能正常工作

Flutter Release apk 无法正常工作?