Android 14兼容性问题求助:Delphi 12.1应用启动后报错
Android 14 32位设备兼容性警告问题排查与解决
问题背景
使用Delphi 12.1开发应用,配置minSdkVersion="23"、targetSdkVersion="34",采用默认类库。客户在32位Android 14设备上启动应用进入设置界面后,弹出警告:"This app isn't compatible with the latest version of Android"。应用尚未调用地图功能,但怀疑问题与新地图系统有关,无Android 14设备测试,Google官方文档未找到对应说明。
可能原因分析
- 32位应用适配限制:Android 14对32位应用的权限、库依赖检查更严格,部分旧版组件可能触发系统兼容性警告。
- Google Play服务版本过时:Manifest中配置的
com.google.android.gms.version="12451000"版本较旧,与Android 14的兼容性存在问题。 - 权限声明冲突:
MANAGE_EXTERNAL_STORAGE等权限在Android 14中的获取规则变更,或权限组合触发系统兼容性检测逻辑。 - 地图组件隐性依赖:虽未主动调用地图功能,但Manifest中配置的
com.google.android.geo.API_KEY及地图包查询,可能引入未适配Android 14的组件。 - resizeableActivity配置不符合要求:
android:resizeableActivity="false"不符合Android 14对多窗口适配的推荐标准,触发系统警告。
解决方案建议
更新Google Play服务版本
将Manifest中的com.google.android.gms.version替换为Delphi 12.1适配Android 14的最新版本号(可参考Delphi官方文档或SDK管理器中的对应版本)。优化权限声明
- 确认
MANAGE_EXTERNAL_STORAGE是否为必需权限,Android 14优先推荐使用MANAGE_MEDIA或分区存储方案,移除不必要的权限。 - 检查权限的
maxSdkVersion配置是否合理,避免权限在高版本系统中引发冲突。
- 确认
调整resizeableActivity配置
将android:resizeableActivity改为true,符合Android 14的多窗口适配要求:android:resizeableActivity="true"排查地图组件影响
暂时注释掉Manifest中的地图相关配置,测试警告是否消失:- 注释
<meta-data android:name="com.google.android.geo.API_KEY" ... /> - 注释
<queries>中的地图包声明
若警告消失,需更新地图依赖库至适配Android 14的版本。
- 注释
验证32位编译配置
确认Delphi的32位编译选项是否完全适配Android 14,检查NDK版本是否符合要求,避免使用已废弃的Native组件。
应用Manifest文件
<?xml version="1.0" encoding="utf-8"?> <!-- BEGIN_INCLUDE(manifest) --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="nz.sartrack.SARTrackApp" android:versionCode="1009" android:versionName="1.019C" android:installLocation="preferExternal"> <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="34" /> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_MEDIA_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.BLUETOOTH" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" android:maxSdkVersion="30" /> <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" /> <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" /> <uses-permission android:name="android.permission.BLUETOOTH_SCAN" /> <uses-permission android:name="android.permission.BROADCAST_STICKY" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE" /> <uses-permission android:name="android.permission.FOREGROUND_SERVICE_LOCATION" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MANAGE_MEDIA" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_SETTINGS" /> <uses-feature android:glEsVersion="0x00020000" android:required="true"/> <queries> <package android:name="com.google.android.apps.maps" /> </queries> <application android:persistent="False" android:restoreAnyVersion="False" android:label="SARTrack" android:debuggable="false" android:largeHeap="False" android:icon="@drawable/ic_launcher" android:theme="@style/AppTheme" android:hardwareAccelerated="true" android:resizeableActivity="false" android:requestLegacyExternalStorage="true"> <provider android:name="androidx.core.content.FileProvider" android:authorities="nz.sartrack.SARTrackApp.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths" /> </provider> <meta-data android:name="com.google.android.geo.API_KEY" android:value="XXXX" /> <meta-data android:name="com.google.android.gms.version" android:value="12451000" /> <uses-library android:name="org.apache.http.legacy" android:required="false" /> <service android:name="com.embarcadero.services.SARTrackService" android:exported="false" /> <!-- Our activity is a subclass of the built-in NativeActivity framework class. This will take care of integrating with our NDK code. --> <activity android:name="com.embarcadero.firemonkey.FMXNativeActivity" android:foregroundServiceType="location" android:exported="true" android:label="SARTrack" android:configChanges="orientation|keyboard|keyboardHidden|screenSize" android:launchMode="singleTask"> <!-- Tell NativeActivity the name of our .so --> <meta-data android:name="android.app.lib_name" android:value="SARTrackApp" /> <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) -->
内容的提问来源于stack exchange,提问作者Bart Kindt
相关产品推荐
相关产品推荐

