Flutter 发布的 apk 不工作但调试 apk 工作正常
Flutter released apk is not working but debug apk is working fine
_getMessages()
函数用于从 phone 中获取 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,
),
),
);
}
}
以下对我有用,但您可以尝试以下,它很可能在大多数情况下都有效。
- 添加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
- 将混淆器添加到应用级别的 buildTypes build.gradle
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(主activity 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);
}
}
_getMessages()
函数用于从 phone 中获取 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,
),
),
);
}
}
以下对我有用,但您可以尝试以下,它很可能在大多数情况下都有效。
- 添加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
- 将混淆器添加到应用级别的 buildTypes build.gradle
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(主activity 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);
}
}