如何在Qt上进行安卓开发(实体安卓机和模拟器)
Taiga_ 2024-09-07 11:05:03 阅读 65
目录
Android环境准备安装和配置配置QtCreator实际运行用USB线连接实体安卓机用模拟器
Android
环境准备
使用QT自带的管理工具(Qt Maintenance)先下载Qt的Android环境并安装:
安装完成后Qt关于Android开发的套件(Kit)可能会是有红色感叹号不能使用的;此时需要下载JDK、SDK并配置环境变量;
下载Java8的JDK:下载链接
可能需要甲骨文的账号,注册一个就好了;下载位置在网页中间部分,注意别下错了;
下载安卓的SDK:下载链接
NDK可以后续自动下载,这里暂不需要手动下载,容易下错版本;
安装和配置
注意:以下所有安装路径不要有中文!
安装JDK:
一直下一步就好了;
可以更改安装位置,开发工具可选功能默认不要动;
安装进度条跑完之后会出现JRE的安装界面,直接和JDK安装到同一目录下就好:
配置系统环境变量:
新建一个系统变量,变量名填<code>JAVA_HOME;变量值是刚刚安装的JDK的路径;
然后配置jar库的路径,同样新建一个系统变量;变量名填<code>CLASSPATH;变量值填.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar
然后依次点击确定;
配置用户环境变量(可选)
这里选择配置一下用户的环境变量,方便后面使用命令行不需要进目录;
把<code>xxxxx\android-sdk-windows\platform-tools和xxxxx\android-sdk-windows\tools\bin
新建到Path
里;
方便后续使用adb
和sdkmanager
命令;
安装AndroidSDK;
解压到空目录,然后运行SDK Manager.exe
需要等进度条跑完后,只安装下面两个:
默认最前面的两个最新的安装就行;
安装完成后进入<code>tools/bin/目录,在这里打开命令行工具,输入./sdkmanager.bat --help
查看管理工具是否可用:
如果是CMD命令行,则进到相应的目录运行,例如我这里安装到D盘,则:
<code>d:cd xxxx复制你的链接xxxx\android-sdk-windows\tools\bin
sdkmanager --help
如果提示没有sdkmanager
则把下面内容拷贝到bin
目录新建的记事本文件中,然后改名为sdkmanager.bat
,然后重复之前步骤运行;
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem sdkmanager startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%..
@rem Add default JVM options here. You can also use JAVA_OPTS and SDKMANAGER_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Dcom.android.sdklib.toolsdir=%~dp0\.."code>
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\lib\sdklib-25.3.0-dev.jar;%APP_HOME%\lib\layoutlib-api-25.3.0-dev.jar;%APP_HOME%\lib\dvlib-25.3.0-dev.jar;%APP_HOME%\lib\repository-25.3.0-dev.jar;%APP_HOME%\lib\gson-2.2.4.jar;%APP_HOME%\lib\commons-compress-1.8.1.jar;%APP_HOME%\lib\httpclient-4.1.1.jar;%APP_HOME%\lib\httpmime-4.1.jar;%APP_HOME%\lib\common-25.3.0-dev.jar;%APP_HOME%\lib\kxml2-2.3.0.jar;%APP_HOME%\lib\annotations-25.3.0-dev.jar;%APP_HOME%\lib\annotations-12.0.jar;%APP_HOME%\lib\jimfs-1.1.jar;%APP_HOME%\lib\httpcore-4.1.jar;%APP_HOME%\lib\commons-logging-1.1.1.jar;%APP_HOME%\lib\commons-codec-1.4.jar;%APP_HOME%\lib\guava-18.0.jar
@rem Execute sdkmanager
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS% -classpath "%CLASSPATH%" com.android.sdklib.tool.SdkManagerCli %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable SDKMANAGER_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%SDKMANAGER_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
如果有对应的Usage,则忽略这步;
完成上面所有步骤后,依次运行下面的命令。(需要按顺序执行,如果需要同意协议则输入y
,注意目录需要换成自己所安装的SDK的目录,例如"D:\xxxxx\xxxxx\android-sdk-windows")这里的例子是用CMD输入的:
sdkmanager "build-tools;30.0.2" --sdk_root="你安装的sdkmanager的目录"code>
sdkmanager "ndk;21.3.6528147" --sdk_root="你安装的sdkmanager的目录"code>
sdkmanager "platform-tools" --sdk_root="你安装的sdkmanager的目录"code>
sdkmanager "platforms;android-30" --sdk_root="你安装的sdkmanager的目录"code>
sdkmanager "cmdline-tools;latest" --sdk_root="你安装的sdkmanager的目录"code>
sdkmanager "extras;google;usb_driver" --sdk_root="你安装的sdkmanager的目录"code>
安装完成就可以了(忽略警告,如果出现done就代表OK)
补充说明:可以用sdkmanager --list
命令看是否上述包都装好了,例如:
配置QtCreator
到QtCreator的首选项中去设置刚刚装上的JDK和SDK的路径:
然后检测一下所需SDK正常情况,第一次设置点击右边的<code>SetUpSDK会弹出:
配置一下即可,自动下载所缺失的包;
配置完成后,如果出现下面的错误:
则是刚刚安装的<code>Android SDK Command-line Tools版本太高了,重新使用下面链接下载并替换android-sdk-windows/cmdline-tools/latest/
文件夹里所有的内容即可:
"sdk_tools_url": {
"linux": "https://dl.google.com/android/repository/commandlinetools-linux-9123335_latest.zip",
"linux_sha256": "0bebf59339eaa534f4217f8aa0972d14dc49e7207be225511073c661ae01da0a",
"windows": "https://dl.google.com/android/repository/commandlinetools-win-9123335_latest.zip",
"windows_sha256": "8a90e6a3deb2fa13229b2e335efd07687dcc8a55a3c544da9f40b41404993e7d",
"mac": "https://dl.google.com/android/repository/commandlinetools-mac-9123335_latest.zip",
"mac_sha256": "d0192807f7e1cd4a001d13bb1e5904fc287b691211648877258aa44d1fa88275"
}
例如这里是Windows平台则使用:https://dl.google.com/android/repository/commandlinetools-win-9123335_latest.zip
可能需要科学上网可以下载快一点;
或者使用自带的SDKManager下载:
所有配置好的状态:
然后下载<code>OpenSSL,这里不用点Download OpenSSL
,直接去网站下好就行(实测配置了git,科学上网下几次也没成),下载网址:
KDAB/android_openssl: OpenSSL scripts and bins for Android (useful for Qt on Android apps) (github.com)
下载完成后也在SDK安装目录中创建文件夹openSSL
,然后把解压的内容拷贝进去,最后在Qt Creator中设置位置(上图有);
最后可以看到Kit构建套中关于安卓的已经正常了:
实际运行
选择安卓的构建套件新建一个工程;第一次构建会自动下载<code>gradle构建工具,建议使用科学上网或者直接下好对应版本导入到编译报错提示的目录中;
网址:Gradle Distributions目录:C:\Users\XXXXX\.gradle\wrapper\dists\gradle-5.6.4-bin\xxxxxxxxxxxxx(这里是一长串字符串)\
然后直接把下好的压缩包移动到这个文件夹中,不用解压,然后重新编译就好了;版本有可能不同,注意对应,比如我用到是gradle-8.3-bin
和gradle-5.6.4-bin
; 编译时Qt会自动选择Android SDK中已经安装的最新的API版本;
用USB线连接实体安卓机
刚刚安装的extras;google;usb_driver
就是为了使用USB连接安卓机;首先在安卓机中打开开发者选项
(自行搜索不同机型如何打开),允许USB调试
、USB安装应用
等给一系列权限;
可能其他版本QtCreator会有提示连入的设备,但是打开<code>设备查看当前的设备都是可以显示的,例如:
然后在构建套件中选择运行的设备,这里选择实体安卓机QtCreator就会把编译好的app通过USB安装到安卓机中运行,日志、Debug啥的可以Creator中查看的;
对与不同版本(我的是12.0.2)的Creator也可以在下面切换运行的设备:
然后编译运行,就能直接在实体安卓机中测试了;
用模拟器
这里使用夜神模拟器:夜神安卓模拟器,或者其他带有adb功能的模拟器都行,有的模拟器需要打开ADB调试功能;
安装完成后,还需要进行一些设定,否则 qtcreator 无法正确连接到设备(老版本 qtcreator 是可以自动连接,但更新到 10.0.2 之后的版本,需要手动连接)
首先检查安卓SDK的<code>adb版本和模拟器的adb
是不是一致的:
到刚刚安装的SDK目录xxxxx\android-sdk-windows\platform-tools
中用cmd或者power shell打开(具体怎么跳转目录和运行就不说了,上面说过):
.\adb.exe --version
然后进入模拟器安装目录<code>xxxxx\Nox\bin,运行:
.\nox_adb.exe version
:
可能会发现不一致的情况,然后把模拟器中的nox_adb.exe
复制备份一下nox_adb_backup.exe
;
把SDK中的adb.exe
拷贝过来更名为nox_adb.exe
,其实就是让模拟器的adb
和SDK的一致;
下图是完成后的:
然后连接到模拟器:
先打开模拟器,不同的模拟器可能用的不同的序列号(IP)和端口,这点可以网上查到,例如夜神模拟器的就是<code>127.0.0.1:62001;同样需要在模拟器目录打开命令行输入:.\nox_adb.exe connect 127.0.0.1:62001
执行完后再输入:adb devices
这里的adb是之前配的全局环境变量的,也就是SDK的adb.exe
,如果没配置环境变量也可以执行对应目录的adb;
然后打开Qt Creator(这里用的版本:12.0.2):
可以看到和模拟器的安卓机是一致且可以使用的;
新建一个项目前的准备(Qt Kits 配置)
在用Qt新建一个安卓项目前,需要知道所用的模拟器是什么CPU架构的:
使用<code>adb shell getprop ro.product.cpu.abi命令查看:
关于这个请查看:Android设备的Architecture架构:arm64-v8a armeabi-v7a
模拟器大多数都是<code>x86架构的,所以我这里在Qt的套件这里克隆一个专门的x86/x86_64
构建套件,其实使用自带检测的也可以:
然后新建一个项目,Qt Quick或者GUI任意一个都行;
注意:这里的<code>ABIs一定要对应上CPU架构,不然会报错!
全选也可以,或者单独选对应的也可以,如果全选则编译出来的app因兼容问题会比较大;
默认的构建套件可能会选择<code>arm64-v8a这个最新的,如果想在模拟器中编译运行则会报错:
编译运行
然后编译运行,Qt就会自动把你的应用装到模拟器中了;
忽略错误并运行:
参考连接:
【安卓】Windows下Qt for Android开发环境搭建 博客园 (cnblogs.com)【Qt】最详细教程,如何从零配置Qt Android安卓环境Qt | Qt For Android、Qt5.14.2安卓开发环境搭建详细步骤记录:Qt Creator 10配置安卓开发环境QT5.15.2搭建Android编译环境及使用模拟器调试(全)Qt 5.15.1 Android开发环境搭建 - 知乎 (zhihu.com)Android设备的Architecture架构:arm64-v8a armeabi-v7a - 知乎 (zhihu.com)使用adb connect命令连接多个Android设备(WIFI方式)-CSDN博客
Qt 5.15.1 Android开发环境搭建 - 知乎 (zhihu.com)
Android设备的Architecture架构:arm64-v8a armeabi-v7a - 知乎 (zhihu.com)使用adb connect命令连接多个Android设备(WIFI方式)-CSDN博客
上一篇: 【Python 已解决】TypeError: unsupported operand type(s) for +: ‘int’ and ‘str’ —— 深度解析与解决策略
下一篇: C/C++内存详解
本文标签
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。