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 权限后)