美文网首页Qt学习
Qt for Android 集成 Bugly 捕获错误

Qt for Android 集成 Bugly 捕获错误

作者: 蓝点工坊 | 来源:发表于2018-09-22 17:06 被阅读14次

    一.错误现象

    一个Qt 蓝牙程序,在Andorid第一次未扫描到设备就闪退,

    D BluetoothAdapter: cancelDiscovery
    D BluetoothAdapter: cancelDiscovery = true
    D BT8510  : (null):0 ((null)): qt.bluetooth.android: DeviceDiscoveryBroadcastReceiver::onReceive() - event: "android.bluetooth.adapter.action.DISCOVERY_FINISHED"
    
    Qt Android Fatal signal 11 (SIGSEGV), code 1, fault addr 0x63002d in tid 5248 (qtMainLoopThrea) 定位
    
    "org.qtproject.example" died.
    

    二.集成bugly 机制

    在Android原生下,使用各种统计和错误上报机制很常见,如umeng,bugly等.
    其中bugly 功能很强,而且NDK 报错功能,这样我们Qt C++错误可以直接提示出错类和方法, 这个为最终解决bug提供很好条件

    1. 准备条件,首在http://bugly.qq.com 注册成开发者,并注册一个Android应用
      image.png

    这里最关键是一个App ID 形如 "7b422b4b78"字符串.

    1. 在Qt 增加对Android 单独支持,首选建立一个Qt Android Template


      image.png

    成功后,在other file 会增加相应的Android支持


    image.png

    3.在Android项目增加相关值.
    bugly 官方集成文档
    https://bugly.qq.com/docs/user-guide/instruction-manual-android/?v=20180913155123
    3.1 增加引用库语句
    这里文档是针对Android studio 的model/build.gradle的.但Qt生成没有 ,可直接在build.gradle 修改也没问题,

    //对NDK支持,必加
    android {
        defaultConfig {
            ndk {
                // 设置支持的SO库架构
                abiFilters 'armeabi-v7a'  //<---注意这里要与Qt Android支持cpu一致
            }
        }
    }
    
    
    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        compile 'com.tencent.bugly:crashreport:latest.release' //手动增加的bugly的引用
        compile 'com.tencent.bugly:nativecrashreport:latest.release' ///手动增加的bugly NDK 的引用
    }
    

    3.2 增加一个QtApplication子类,用于全局初始化
    这里需要用到java相关知识,如果这个类包是 cn.bluedrum.则要手工创建 src/cn/bluedrum 目录(QtCreator 不会自动创建)
    在这个目录创建java文件

    package cn.bluedrum;
    import com.tencent.bugly.Bugly;
    import android.util.Log;
    
    //注意这里的基类,必须是QtApplication
    public class BDQApplication extends org.qtproject.qt5.android.bindings.QtApplication{
    
        @Override
            public void onCreate() {
                super.onCreate();
    
                  Log.d("BDQ","show front activity ");
    //这里对bugly进行初始化,里面是你申请的App ID
                 Bugly.init(getApplicationContext(), "7b422b4b78", true);
                
    
            }
    
    }
    
    

    3.3 修改AndroidManifest.xml

    增加对本Application类的引用,以及bugly所需要权限

      <application android:hardwareAccelerated="true" android:name="cn.bluedrum.BDQApplication" android:label="-- %%INSERT_APP_NAME%% --">
    
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.READ_LOGS" />
    

    然后编译接入wifi后即可在后台查看相关数据

    三.最终解决

    image.png

    因为支持ndk捕获,所以直接显示C++哪个类的方法出错,

    提示在HBluetoothManager::StopScan() 中的qDebug() <<出错
    代码如下:

    if(mScanState == WORK_SCAN){
            qDebug() << "work scan ,device "<< getCurrentDevice();  //<-造成段错误地方
            if(getCurrentDevice()==NULL)
               emit deviceConnectTimeout();
        }
    

    原因是getCurrentDevice() 为NULL直接赋给qDebug() <<NULL ; 即会造成段错误,(后来发现,一个对象指针没有赋初值NULL)
    改正很简单,

     if(mScanState == WORK_SCAN){
            
            if(getCurrentDevice()==NULL){
                 qDebug() << "work scan ,none device find. "; 
               emit deviceConnectTimeout();
            }
            else{
               qDebug() << "work scan ,device "<< getCurrentDevice()->getAddress(); 
            }
        }
    

    相关文章

      网友评论

        本文标题:Qt for Android 集成 Bugly 捕获错误

        本文链接:https://www.haomeiwen.com/subject/velxoftx.html