You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FireMonkey开发的Android应用在俄无法运行问题排查求助

针对俄罗斯地区FireMonkey Android应用闪退问题的排查与解决方案

一、端口相关问题处理

220-239属于FTP协议关联的预留端口范围,俄罗斯多数ISP会对这类端口进行默认拦截或限制,且商用服务使用这类端口需向Roskomnadzor(俄罗斯联邦电信监管机构)备案,流程繁琐。最直接的解决方案是更换端口:选择非预留的通用端口(如8080、9000、8090这类DataSnap常用端口),先测试连通性,若问题解决则无需备案操作。

二、运营商与编译设置排查

运营商层面验证

俄罗斯部分ISP会通过深度包检测(DPI)拦截特定协议流量,可先通过基础TCP Socket测试设备到服务器端口的连通性,排除DataSnap协议本身被识别拦截的可能:

uses
  System.Sockets;

function TestPortConnectivity(Host: string; Port: Integer): Boolean;
var
  ClientSocket: TSocket;
  Addr: TSockAddrIn;
begin
  Result := False;
  ClientSocket := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  try
    Addr.sin_family := AF_INET;
    Addr.sin_port := htons(Port);
    Addr.sin_addr.S_addr := inet_addr(PAnsiChar(AnsiString(Host)));
    if connect(ClientSocket, @Addr, SizeOf(Addr)) = 0 then
      Result := True;
  finally
    CloseSocket(ClientSocket);
  end;
end;

调用该函数测试,若返回False则说明端口被拦截,需更换端口。

编译设置调整

  1. 权限检查:确保AndroidManifest.xml中添加必要网络权限,俄罗斯Android系统对权限缺失的容忍度极低,会直接导致闪退:
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  1. FireMonkey兼容性:关闭编译选项中的Use Android Native Widgets,该选项在俄罗斯部分旧设备上易引发兼容性崩溃。
  2. SDK版本适配:若测试设备多为Android 10及以下版本,将编译的目标SDK版本调整为29(Android 10),避免高版本API的兼容性问题。

三、俄罗斯地区特定配置调整

强制英文输入环境

通过代码强制应用内语言为英文,不受系统区域设置影响,避免因系统语言冲突引发的崩溃:

uses
  Androidapi.JNI.GraphicsContentViewText, Androidapi.JNI.JavaTypes,
  Androidapi.Helpers;

procedure ForceEnglishLocale;
var
  Config: JConfiguration;
  Locale: JLocale;
begin
  Locale := TJLocale.JavaClass.ENGLISH;
  Config := TAndroidHelper.Activity.getResources.getConfiguration;
  Config.setLocale(Locale);
  TAndroidHelper.Activity.getResources.updateConfiguration(Config,
    TAndroidHelper.Activity.getResources.getDisplayMetrics);
  
  // 强制输入法为英文
  var Imm := TJInputMethodManager.Wrap(
    TAndroidHelper.Context.getSystemService(TJContext.JavaClass.INPUT_METHOD_SERVICE));
  var Subtypes := Imm.getInputMethodSubtypeList(nil, True);
  for var I := 0 to Subtypes.size - 1 do
  begin
    var Subtype := TJInputMethodSubtype.Wrap(Subtypes.get(I));
    if Subtype.getLocale.equals(Locale.toString) then
    begin
      Imm.setCurrentInputMethodSubtype(Subtype);
      Break;
    end;
  end;
end;

在FormCreate或应用启动时调用此方法。

延长DataSnap连接超时

俄罗斯网络波动较大,默认超时设置易引发连接异常闪退,调整超时参数:

uses
  DataSnap.DSClientRest;

procedure ConfigureDSClientTimeout(DSClient: TDSRestClient);
begin
  DSClient.ConnectTimeout := 15000; // 15秒连接超时
  DSClient.ReadTimeout := 20000;    // 20秒读取超时
end;

全局异常捕获

添加全局异常捕获,保存错误日志以便定位闪退原因,避免无提示崩溃:

uses
  System.SysUtils, System.IOUtils;

procedure AppExceptionHandler(Sender: TObject; E: Exception);
begin
  var LogPath := TPath.Combine(TPath.GetDocumentsPath, 'crash_log.txt');
  TFile.AppendAllText(LogPath,
    Format('%s: %s'#13#10, [FormatDateTime('yyyy-mm-dd hh:nn:ss', Now), E.Message]));
  // 可添加弹窗提示,避免直接闪退
end;

initialization
  Application.OnException := AppExceptionHandler;

四、额外排查建议

  • 测试俄罗斯本地服务器的端口连通性,确认是否为跨区域网络问题;
  • 更换俄罗斯本地不同运营商的网络(移动数据、WiFi)测试,排查ISP针对性拦截;
  • 若后续需发布到俄罗斯应用商店,需确保隐私政策符合Roskomnadzor要求,避免合规性问题导致的应用异常。

内容的提问来源于stack exchange,提问作者zaaai bon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:41:03