Delphi 11.1 Android应用闪屏后崩溃 编译无错(10.4.2迁移问题)
Delphi 10.4.2 迁移至 Delphi 11.1 Android 端启动崩溃问题
问题现象
- 原项目基于Delphi 10.4.2开发,目标API 29;升级到Delphi 11.1、目标API 30后,已参照公开方案执行
revert system files操作,编译阶段零错误 - APK部署到Android设备后,闪屏展示结束立即崩溃,Development、Application Store两种编译配置均可稳定复现,覆盖不同厂商设备、多个Android版本,并非仅出现在Android 11系统
- 同项目在Delphi 11.1下编译Windows版本运行完全正常,项目未使用任何第三方组件,全部采用Delphi官方自带组件
已提供的排查参考材料
单元引用代码
uses System.SysUtils, System.UITypes, System.UIConsts, System.Classes, FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs, FMX.ListBox, FMX.StdCtrls, FMX.Edit, FMX.objects, FMX.Graphics, {$IFDEF MSWINDOWS} IdContext,IdBaseComponent, IdComponent,IdCustomTCPServer, IdTCPServer, IdStack,IdIPWatch, {$ENDIF} {$IFDEF ANDROID} Androidapi.Helpers, Androidapi.JNIBridge, androidapi.JNI.JavaTypes, androidapi.JNI.Net, Androidapi.JNI.GraphicsContentViewText, {$ENDIF} FMX.ListView, FMX.ListView.Appearances, FMX.Grid, FMX.Memo, REST.Authenticator.Basic, REST.Authenticator.OAuth, REST.Client, FMX.ListView.Types, FMX.ListView.Adapters.Base, IPPeerClient, FMX.ScrollBox, FMX.Layouts, FMX.Controls.Presentation, System.Rtti, Data.Bind.Components, Data.Bind.ObjectScope, FMX.Grid.Style, REST.Types, FMX.Memo.Types ;
AndroidManifest 配置
<?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.madmartian.SimpleHomeController" android:versionCode="41" android:versionName="41" android:installLocation="auto"> <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="30" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <queries> </queries> <application android:persistent="False" android:restoreAnyVersion="False" android:label="SimpleHomeController" android:debuggable="true" android:largeHeap="False" android:icon="@drawable/ic_launcher" android:theme="@android:style/Theme.NoTitleBar" android:hardwareAccelerated="true" android:resizeableActivity="false" android:requestLegacyExternalStorage="true"> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:label="SimpleHomeController" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask"> <meta-data android:name="android.app.lib_name" android:value="SimpleHomeController" /> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="com.embarcadero.rtl.notifications.NotificationAlarm" /> </application> </manifest> <!-- END_INCLUDE(manifest) -->
迁移必做调整项
- 撤销
revert system files操作:这个操作是Delphi 11.x早期测试版的临时兼容方案,正式版11.1的Android系统库已经完成API 30适配,回滚系统文件会导致框架库版本不匹配,是闪屏后崩溃的最高发诱因。直接还原Delphi 11.1的原始系统文件,清理项目所有编译缓存后重新编译即可。 - 修正Manifest主题配置:当前使用的
@android:style/Theme.NoTitleBar是Android原生旧主题,Delphi 11.1的FMX框架初始化时要求必须匹配自带主题,否则会在Activity加载阶段直接崩溃,替换为@style/Embarcadero.FMX.NoTitleBar。 - 补全Activity的configChanges参数:API 30新增了多个配置变更触发场景,当前配置缺少
smallestScreenSize|screenLayout|uiMode|density参数,补全后可避免初始化阶段配置变更触发的Activity异常重启。 - 补充FileProvider节点:Delphi 11.1的RTL在Android端初始化时会校验FileProvider,当前Manifest缺少对应节点会直接导致启动崩溃,需要在
<application>节点内添加如下配置:<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/fileprovider_paths" /> </provider> - 修正单元引用大小写:uses段里的
FMX.objects单元名首字母小写,Delphi 11.1在Android平台采用LLVM编译链,对单元名大小写校验比10.4.2严格,改为官方标准命名FMX.Objects,避免链接时找不到单元实现。 - 补全必要权限:如果用到网络状态检测逻辑,除了已有的
ACCESS_WIFI_STATE,还需要添加android.permission.ACCESS_NETWORK_STATE权限,API 30下缺少该权限调用网络相关API会直接抛异常。 - 彻底清理旧编译产物:删除项目目录下所有平台的输出文件夹(Android、Win32、Win64等),删除
.dproj.local、.identcache本地缓存文件,避免10.4.2版本编译的中间文件被打包进新APK导致异常。
内容的提问来源于stack exchange,提问作者Mad Martian
相关产品推荐
相关产品推荐

