android 浏览器插件开发 - Log

转载请注明出处:http://blog.youkuaiyun.com/awebkit


    android中的插件开发中的示例代码已经给我们说明了如何打log,参看示例代码main.cpp

[cpp]  view plain copy
  1. for (int i = 0; i < argc; i++) {  
  2.     if (!strcmp(argn[i], "DrawingModel")) {  
  3.         if (!strcmp(argv[i], "Bitmap")) {  
  4.             model = kBitmap_ANPDrawingModel;  
  5.         }     
  6.         else if (!strcmp(argv[i], "Surface")) {  
  7.            model = kSurface_ANPDrawingModel;  
  8.         }     
  9.         gLogI.log(kDebug_ANPLogType, "------ %p DrawingModel is %d", instance, model);  
  10.         break;  
  11.     }     
  12. }     
    我们可以使用gLogI.log打印调试信息。

    gLogI的定义如下

[plain]  view plain copy
  1. ANPLogInterfaceV0           gLogI;  

     ANPLogInterfaceV0的定义如下(Android_npapi.h)

[cpp]  view plain copy
  1. struct ANPLogInterfaceV0 : ANPInterface {  
  2.     /** dumps printf messages to the log file 
  3.         e.g. interface->log(instance, kWarning_ANPLogType, "value is %d", value); 
  4.      */  
  5.     void (*log)(ANPLogType, const char format[], ...);  
  6. };  
       该结构的赋值如下(ANPLogInterface.cpp)
[cpp]  view plain copy
  1. static void anp_log(ANPLogType logType, const char format[], ...) {  
  2.     va_list args;  
  3.     va_start(args, format);  
  4.   
  5.     android_LogPriority priority;  
  6.     switch (logType) {  
  7.         case kError_ANPLogType:  
  8.             priority = ANDROID_LOG_ERROR;  
  9.             break;  
  10.         case kWarning_ANPLogType:  
  11.             priority = ANDROID_LOG_WARN;  
  12.             break;  
  13.         case kDebug_ANPLogType:  
  14.             priority = ANDROID_LOG_DEBUG;  
  15.             break;  
  16.         default:  
  17.             priority = ANDROID_LOG_UNKNOWN;  
  18.             break;  
  19.     }  
  20.     LOG_PRI_VA(priority, "plugin", format, args);  
  21.   
  22.     va_end(args);  
  23. }  
  24.   
  25. void ANPLogInterfaceV0_Init(ANPInterface* value) {  
  26.     ANPLogInterfaceV0* i = reinterpret_cast<ANPLogInterfaceV0*>(value);  
  27.   
  28.     i->log = anp_log;  
  29. }  
    而LOG_PRI_VA的调用关系如下 

[plain]  view plain copy
  1. LOG_PRI_VA@Log.h  
  2. android_vprintLog@Log.h  
  3.  __android_log_vprint@Log.h  
  4. __android_log_write@logd_write.c  
  5. write_to_log@logd_write.c  
  6. __write_to_log_init@logd_write.c  
  7. __write_to_log_kernel@logd_write.c  
  8. writev@uio.c  


    注:

    1. 插件的打印信息的channel为plugin

    2. android系统据我所知,只有如下log会受到是否打开DEBUG的影响

         LOGV*  LOG_FATAL*
<think>嗯,用户想用QT5.14开发一个Android浏览器应用。首先,我需要确认QT在Android平台上是否支持浏览器相关的组件。记得Qt有WebEngine模块,这个应该是基于Chromium的,可以用来嵌入网页内容。不过得确认一下在Android上是否可用。然后,用户可能需要配置开发环境。比如安装Qt5.14的时候,是否选择了Android的套件,比如NDK、SDK还有JDK这些。这些是必须的,否则无法编译和部署到Android设备上。可能需要指导用户如何安装和配置这些工具。 接下来,创建一个基本的Qt Quick项目,因为QtQuick比较适合移动应用的UI开发。然后,在QML中使用WebEngineView组件来显示网页内容。这个组件是不是在Android上需要特殊的权限或者设置呢?比如网络权限,可能需要修改AndroidManifest.xml文件。另外,示例代码部分需要展示如何嵌入一个浏览器视图。可能需要一个简单的QML文件,里面包含WebEngineView,并设置其url属性。比如加载百度或者谷歌首页。同时,要注意处理Android的后退按钮事件,让浏览器可以返回上一页。还要考虑Qt的版本是否支持WebEngine在Android上。可能有些版本的Qt对Android的支持有限制,需要查看文档确认。比如Qt5.14的WebEngine模块是否在Android上可用,或者是否有已知的问题。 用户可能还需要一些高级功能,比如地址栏输入、前进后退按钮,这些可以通过QML的TextInput和Button组件来实现,绑定到WebEngineView的相应属性和方法上。比如,当用户输入URL后,更新WebEngineView的url;点击后退按钮时调用goBack()方法。 编译和部署到Android设备时,可能需要配置签名,生成APK。QtCreator有集成的工具,但用户可能需要指导如何配置构建步骤,选择正确的Android套件,处理可能的依赖问题。 另外,引用中的内容提到Qt Creator的功能和WebAssembly插件,但用户的需求是Android应用,所以可能不需要WebAssembly,除非有特殊需求。不过引用中的高德地图示例可能对浏览器应用中的地图功能有帮助,但当前用户的问题主要是浏览器本身,可能暂时不需要。最后,生成相关问题,比如性能优化、处理触摸事件、混合开发等,帮助用户进一步深入。同时提醒用户注意WebEngine在移动端的资源消耗,比如内存占用较大,可能需要优化。</think>根据您使用Qt 5.14开发Android浏览器应用的需求,以下是分步骤实现方案: ### 一、环境准备 1. 安装Qt 5.14时勾选`Android ARMv7`组件 2. 配置Android SDK/NDK(建议SDK API Level≥21,NDK r20b) 3. 安装JDK 8并配置JAVA_HOME环境变量 4. 验证Qt Creator的Android设置:`工具 > 选项 > Kits > Android` ### 二、核心实现代码 ```qml // main.qml import QtQuick 2.12 import QtQuick.Controls 2.12 import QtWebEngine 1.8 ApplicationWindow { visible: true width: 360 height: 640 WebEngineView { id: webview anchors.fill: parent url: "https://m.baidu.com" onLoadingChanged: { if (loadRequest.status === WebEngineView.LoadSucceededStatus) { console.log("加载完成:", loadRequest.url) } } } // Android返回键处理 Connections { target: Qt.inputMethod onVisibleChanged: { if (!Qt.inputMethod.visible) { webview.triggerWebAction(WebEngineView.Stop) } } } } ``` ### 三、关键配置项 1. 在.pro文件中添加: ```qmake QT += quick webengine webenginewidgets android { ANDROID_PACKAGE_SOURCE_DIR = $$PWD/android OTHER_FILES += $$PWD/android/AndroidManifest.xml } ``` 2. 创建`android/AndroidManifest.xml`: ```xml <?xml version="1.0"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.qtproject.example" android:versionCode="1" android:versionName="1.0"> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <application android:name="org.qtproject.qt5.android.bindings.QtApplication" android:hardwareAccelerated="true"> <activity android:name="org.qtproject.qt5.android.bindings.QtActivity" android:configChanges="orientation|uiMode|screenLayout|screenSize|smallestScreenSize|layoutDirection|locale|fontScale|keyboard|keyboardHidden|navigation" android:launchMode="singleTop"> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.BROWSABLE"/> <category android:name="android.intent.category.DEFAULT"/> <data android:scheme="http"/> <data android:scheme="https"/> </intent-filter> </activity> </application> </manifest> ``` ### 四、功能扩展建议 1. 添加导航控件: ```qml Row { anchors.top: parent.top Button { text: "←" onClicked: webview.goBack() } TextField { id: addressBar width: 240 onAccepted: webview.url = text } Button { text: "→" onClicked: webview.goForward() } } ``` 2. 支持文件上传: ```cpp // 在Qt C++代码中重写WebEngineProfile WebEngineProfile* profile = WebEngineProfile::defaultProfile(); profile->setHttpUserAgent("Mozilla/5.0 (Linux; Android 10) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Mobile Safari/537.36"); ``` ### 五、已知限制和解决方案 1. **WebEngine组件体积**:基础APK大小约30MB,可通过`android:extractNativeLibs="true"`优化 2. **硬件加速**:需在AndroidManifest中声明`android:hardwareAccelerated="true` 3. **内存限制**:建议在Application类中添加`android:largeHeap="true"`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值