1. 注册日志回调函数
qInstallMessageHandler(outputMessage);
解决方法
Android
环境下直接不重定向日志,经过后期调试应该是 dynamic_static 转换失败导致。
#ifndef __ANDROID__
qInstallMessageHandler(outputMessage);
#endif
2. 单例上锁,新增了 Android 版本直接返回 0
由于 Android 下没有创建文件和写文件的权限,所以导致程序崩溃。
int UpdateManager::getProcDetect()
{
#ifdef __ANDROID__
// Android 下由于权限问题无法创建文件,会失败(Android 下无需文件锁定)
return 0;
#endif
const char* procLock = "proclock_upcnc";
int fd = -1;
#ifdef WIN32
fd = 0;
#else
do
{
fd = open(procLock, O_RDWR | O_CREAT, (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH));
if (fd < 0)
{
break;
}
struct flock fl;
fl.l_type = F_WRLCK;
fl.l_start = 0;
fl.l_whence = SEEK_SET;
fl.l_len = 0;
int ret = fcntl(fd, F_SETLK, &fl);
if (-1 == ret)
{
close(fd);
fd = -1;
break;
}
} while (false);
#endif // WIN32
return fd;
}
解决方法
直接判断 Android 环境下返回 0
3. 获取模块指针失败,直接使用裸指针导致程序崩溃
CmdApp::CmdApp(QObject* parent, const QString& path, QQmlApplicationEngine* engine)
: QObject(parent)
, m_cfgApp(nullptr)
, m_irsMgr(nullptr)
, m_engine(engine)
, m_rootPath(path)
, m_translator(nullptr)
, m_autoCheckUpdate(false)
, m_exitUpdate(false)
,m_remoteUpdate(false)
{
m_cfgApp = GetPluginInstance(IAppCfg, _MODNAME_APPCFG);
m_irsMgr = GetPluginInstance(IRSMgr, _MODNAME_RSERVICES);
QString lan = "中文";
// 上面获取 m_cfgApp 失败,这里直接使用导致程序崩溃
m_cfgApp->getCurrentLanguage(lan);
// 启动默认加载语言
switchLanguage(lan);
// ...
}
通过追踪发现是由于下面语句中 dynamic_cast
转换失败导致。
#define GetPluginInstance(x, y) dynamic_cast<x *>(Singleton::GetModuleManager()->GetModule(y))
解决方法
将该问题解决后,执行 qInstallMessageHandler(outputMessage);
也不再崩溃。
- 将
dynamic_cast
改为static_cast
后程序不再崩溃。
#define GetPluginInstance(x, y) static_cast<x *>(Singleton::GetModuleManager()->GetModule(y))