返回

Qt5开发安卓调试工具(adb shell input和adb shell screencap应用)

后端

一、前言

最近的物联网项目之前说过是安卓机顶盒的软探针项目,目前项目前期基本开发完了,这个时候就涉及到维护问题了,维护的时候由于是远程维护,不可能每次都去现场,对于现场的维护人员也不可能培训成为软件开发工程师,这就需要提供一个远程调试工具。

这个远程调试工具的目的是让维护人员通过这个工具可以远程查看设备的屏幕和远程控制安卓设备,这个维护工具的开发就用到了adb的input和screencap命令。

二、Qt程序框架选择

调试工具使用Qt来开发,在选择Qt版本的时候首先想到的是Qt6,但是这次选择的版本是Qt5,为什么不选Qt6呢?

首先查看了Qt6官方网站,发现Qt6还没有正式版,都是预览版,我们开发工具一般都是要求稳定的版本,既然Qt6还没有正式版,那就肯定不能使用Qt6了,当然也不可能用预览版,万一Qt6稳定版本出来的时候和现在的预览版本不兼容怎么办,重构工作量太大,所以果断放弃使用Qt6。

既然不使用Qt6那就只能使用Qt5了,但是Qt5开发安卓还是存在一些坑的,例如:

  • Qt5版本高于5.12的话就编译不过了,这个需要修改Qt源码来解决。
  • Qt5使用Qt Android Extras的时候还需要额外配置安卓的环境变量,这个需要配置一下。
  • Qt5还要修改ndk的版本,因为安卓10之后,谷歌不再支持ndk版本低于21的了,所以需要把Qt5使用的ndk改成21以上的版本。

三、Qt5框架修改

Qt5编译报错:

/Users/zhaojinfeng/Qt5.15.2/5.15.2/clang_64/bin/qmake -o Makefile /Users/zhaojinfeng/workplace/QtAndoridDemo/QtAndoridDemo.pro
/Users/zhaojinfeng/workplace/QtAndoridDemo/QtAndoridDemo.pro:27: warning: obsolete syntax used
process_begin:create_makefile_first
/Users/zhaojinfeng/Qt5.15.2/5.15.2/clang_64/bin/qmake -o Makefile /Users/zhaojinfeng/workplace/QtAndoridDemo/QtAndoridDemo.pro
The process "/Users/zhaojinfeng/Qt5.15.2/5.15.2/clang_64/bin/qmake" exited with code 1.
Error while building/deploying project QtAndoridDemo (kit: Desktop Qt 5.15.2 clang 64bit)
When executing step 'qmake'

从报错信息中可以看出,编译报错的原因是使用了过高的Qt版本,由于当前最新的稳定版本是5.15.2,而Qt5.12之后编译安卓就会报错了,这就意味着只能把Qt5版本降到5.12了。

Qt5.12安卓编译报错:

/Users/zhaojinfeng/Qt5.12.11/5.12.11/clang_64/bin/qmake -o Makefile /Users/zhaojinfeng/workplace/QtAndoridDemo/QtAndoridDemo.pro
/Users/zhaojinfeng/workplace/QtAndoridDemo/QtAndoridDemo.pro:69: error: Expected identifier before '.' token
Linking CXX shared library /Users/zhaojinfeng/workplace/QtAndoridDemo/build-QtAndoridDemo-Desktop_Qt_5_12_11_clang_64bit-Debug/libQt5AndroidExtras.5.12.11.dylib
/Users/zhaojinfeng/workplace/QtAndoridDemo/build-QtAndoridDemo-Desktop_Qt_5_12_11_clang_64bit-Debug/libQt5AndroidExtras.5.12.11.dylib: building for macOS-x86_64 but attempting to link with file built for macOS-arm64

从报错信息中可以看出,编译报错的原因是库的兼容性问题,提示x86_64和arm64的问题,Qt的安卓版本是只支持arm64的,x86_64是macos电脑使用的,那肯定编译不过了。

所以修改Qt的configure选项如下:

./configure -opensource -confirm-license -release -nomake examples -nomake demos -no-qt3support -no-scripttools -no-rpath -no-cups -no-nis -nomake tools -nomake docs -nomake man -nomake qtdeclarative -no-sql-sqlite -no-xcb -no-xcb-xlib -no-dbus -no-gtkstyle -no-glib -no-cups -nomake mkspecs/features/styleplugins -no-phonon -no-phonon-backend -no-qml-debugger -no-multimedia -no-macextras -platform linux-g++-64 -fast -no-use-gold-linker -no-exceptions -no-opengl -no-pch -no-openssl -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-avx2 -no-neon -no-armvfp -no-neon-fp-armv8 -no-neon-fp16-armv8 -no-float16 -no-linuxfb -no-libjpeg -no-libpng -no-harfbuzz-ng -no-freetype -no-harfbuzz -no-glib -no-xcb -no-xcb-xlib -no-xkbcommon -nomake tools -nomake demos -no-kms -skip qtwebkit -no-dbus -no-xcb -no-xcb-xlib -no-xkbcommon -no-xinput2 -no-selinux -no-mount -no-openal -no-icu -no-libxcb -extra-cxxflags=-isystem/usr/local/opt/llvm/include -extra-ldflags=-L/usr/local/opt/llvm/lib

修改之后,果然顺利编译成功了。

四、Qt5和安卓环境变量配置

Qt5编译安卓报错:

-DQT_RCC_TEST=OFF \
-DQT_SQL_QSQLITE_DRIVER=OFF \
-DQT_SQL_TOPSQLITE=OFF \
-DQT_GUI_LIB=ON \
-DQT_GUI_CONFIG=ON \
-DQT_NETWORK_LIB=ON \
-DQT_NETWORK_CONFIG=ON \
-DQT_LOCATION_LIB=ON \
-DQT_LOCATION_CONFIG=ON \
-DQT_XML_LIB=ON \
-DQT_XML_CONFIG=ON \
-DQT_XMLPATTERNS_LIB=ON \
-DQT_XMLPATTERNS_CONFIG=ON \
-DQT_WEBKIT_LIB=ON \
-DQT_WEBKIT_CONFIG=ON \
-DQT_WEBKITWIDGETS_LIB=ON \
-DQT_WEBKITWIDGETS_CONFIG=ON \
-DQT_WEBENGINE_LIB=ON \
-DQT_WEBENGINE_CONFIG=ON \
-DQT_WEBENGINEWIDGETS_LIB=ON \
-DQT_WEBENGINEWIDGETS_CONFIG=ON \
-DQT_WIDGETS_LIB=ON \
-DQT_WIDGETS_CONFIG=ON \
-DQT_QUICK_LIB=ON \
-DQT_QUICK_CONFIG=ON \
-DQT_QUICKWIDGETS_LIB=ON \
-DQT_QUICKWIDGETS_CONFIG=ON \
-DQT_MULTIMEDIA_LIB=ON \
-DQT_MULTIMEDIA_CONFIG=ON \
-DQT_MULTIMEDIAWIDGETS_LIB=ON \
-DQT_MULTIMEDIAWIDGETS_CONFIG=ON \
-DQT_DATAVIS3D_LIB=ON \
-DQT_DATAVIS3D_CONFIG=ON \
-DQT_GRAPHICS_EFFECT_LIB=ON \
-DQT_GRAPHICS_EFFECT_CONFIG=ON \
-DQT_SVG_LIB=ON \
-DQT_SVG_CONFIG=ON \
-DQT_QML_LIB=ON \
-DQT_QML_CONFIG=ON \
-DQT_QUICKTESTS_LIB=