调试方法

安卓调试与Google play打包提交
通过Android Studio进行调试

生成文件
  1. 打包我们的项目,将他生成为APK包
  2. 这时我们项目路径下会生成\Intermediate目录
    打开Android Studio Launcher
    点击左上角的open,就可以打开UE为我们生成的安卓项目
    在这里插入图片描述

C:\YourProjectName\Intermediate\Android\APK\Gradle(UE4的路径)
C:\YourProjectName\Intermediate\Android\arm64\Gradle(UE5的路径)

再进入run =》Edit Configurations,将调试类型改为Dual
在这里插入图片描述

转到 LLDB启动命令,选项卡,按下 加号(plus)输入以下信息
命令脚本导入

"C:\PathToYourUE4EngineInstall\Engine\Extras/LLDBDataFormatters\UE4DataFormatters_2ByteChars.py"

当显示要选择的设备的时候,确定即可,之后选择run下的debug app即可开始调试
在这里插入图片描述

现在,打开项目的任意一个.cpp文件,并将断点添加到要调试的行,然后运行调试
配置完成之后就可以在代码中去打断点,下面代码就停到了这里
在这里插入图片描述

下方同时有很多工具可以方便我们去调试
在这里插入图片描述

总结:这其实是一种调试的方式,但是我们更多的是在windows上将项目调试好,之后打包放在安卓中查看效果

遇到的问题:在生成调试的android文件夹,我们使用的为3.5.3的版本生成的,但是他的项目并不能使用
解决方法:直接升级最新的android版本,项目即可构建成功

Android设备直接启动(不需要打包)

前置条件

  1. 启动开发者模式
  2. 在开发者选项中启动USB调试
    设置好之后就可以直接在这里去启动
    在这里插入图片描述
    在这里插入图片描述

通过window工具生成日志

下载ADB工具包
https://dl.google.com/android/repository/platform-tools-latest-windows.zip
测试手机是否连接(手机需要开启USB调试功能)
CMD进入下载的文件夹,输入adb devices查看连接的设备
在这里插入图片描述

调试指令

adb logcat -b main -v time *:E >app.log

具体使用到的命令解析:

  1. -b Android中的日志缓冲区 : system缓冲区 - 与系统相关的日志信息, radio缓冲区 - 广播电话相关的日志信息, events缓冲区 - 事件相关的日志信息, main缓冲区 - 默认的缓冲区;
  2. -v time 可以打印出时间
  3. *:E 这个为过滤选择,
    – V : Verbose (明细);
    – D : Debug (调试);
    – I : Info (信息);
    – W : Warn (警告);
    – E : Error (错误);
    – F : Fatal (严重错误);
    – S : Silent(Super all output) (最高的优先级, 可能不会记载东西);

最后为输出的路径 》log.app代表输入到当前文件
注:可以通过 adb logcat --help 来获取详细的信息
C:\Users\Administrator\Desktop\adb>adb logcat --help
Usage: logcat [options] [filterspecs]
options include:
-s Set default filter to silent.
Like specifying filterspec ‘*😒’
-f Log to file. Default to stdout
-r [] Rotate log every kbytes. (16 if unspecified). Requires -f
-n Sets max number of rotated logs to , default 4
-v Sets the log print format, where is one of:

brief process tag thread raw time threadtime long

-c clear (flush) the entire log and exit
-d dump the log and then exit (don’t block)
-t print only the most recent lines (implies -d)
-g get the size of the log’s ring buffer and exit
-b Request alternate ring buffer, ‘main’, ‘system’, ‘radio’
or ‘events’. Multiple -b parameters are allowed and the
results are interleaved. The default is -b main -b system.
-B output the log in binary
filterspecs are a series of
[:priority]

where is a log component tag (or * for all) and priority is:
V Verbose
D Debug
I Info
W Warn
E Error
F Fatal
S Silent (supress all output)

’ means ':d’ and by itself means :v

If not specified on the commandline, filterspec is set from ANDROID_LOG_TAGS.
If no filterspec is found, filter defaults to ‘*:I’

If not specified with -v, format is set from ANDROID_PRINTF_LOG
or defaults to “brief”

打开输出我们的文件即可
在这里插入图片描述

通过手机生成日志

例子:红米K30 pro
在我的设备 =》全部参数 =》处理器(连点5下)
手机系统就会生成一个5~10分钟的bug报告
在这里插入图片描述

Android日志的阅读
log等级的划分:

  1. Log.v:这里的v代表Verbose啰嗦的意思,对应的log等级为VERVOSE。采用该等级的log,任何消息都会输出。
  2. Log.d:这里的d代表Debug调试的意思,对应的log等级为DEBUG。采用该等级的log,除了VERBOSE级别的log外,剩余的4个等级的log都会被输出。
  3. Log.i:这里的i代表information,为一般提示性的消息,对应的log等级为INFO。采用该等级的log,不会输出VERBOSE和DEBUG信息,只会输出剩余3个等级的信息。
  4. Log.w:w代表warning警告信息,一般用于系统提示开发者需要优化android代码等场景,对应的等级为WARN。该级别log,只会输出WARN和ERROR的信息。
  5. Log.e:e代表error错误信息,一般用于输出异常和报错信息。该级别的log,只会输出该级别信息。一般Android系统在输出crassh等致命信息的时候,都会采用该级别的log。
    个人理解:这样子划分有助于调试的时候筛选关键的信息,合理的筛选出需要的信息
    简单的将一条log分析一下
    在这里插入图片描述

通过log就能很准确的定位到原因和位置

Google play 打包提交

基本概念

在打包提交的时候,我们还应该有一些基本的概念才能更好的帮助我们去理解

  1. obb文件:是一个数据包文件,他是谷歌平台发行软件时候的一种标准,不过从2021年开始,Google已经全面使用abb文件,obb文件已经退出了历史的舞台
  2. AAB文件:AAB文件是经过签名的二进制文件,通常用于发布的产品。优点是小
  3. SDK:则为软件开发工具包,这里使用的则为安卓SDK开发的工具包
  4. JDK:Java Development ToolKit(Java开发工具包)
  5. NDK:是安卓平台对针对C++库的一个支持,就是C++的一个开发工具包

UE设置生成AAB文件

在project=》platforms=》android=》app bundles可以选择分割包的类型
在这里插入图片描述

PS:上面解释了AAB文件比传统的apk包要小,其主要原因就是他将apk包分成了很多部分,他会根据手机的类型动态的加载,所以下面的选项是

  1. 是否生成AAB文件
  2. 是否生成支持全部类型的APK包
  3. 是否分割出二进制包
  4. 是否分割出语言包
  5. 是否分割出像素密度包
    其实这些还是比较难以理解,下面来看一下AAB文件的结构

AAB文件结构

在这里插入图片描述

从上图可以看出App Bundles文件格式,它包含Base Moudle和我们拆分的文件夹,并且每一个moudle都包含dex,manifest,res,resources.pb等文件,和APK的文件结构基本保持一致。base module和每个Dynamic Feature Module都包含各自的代码和资源,它们共同组成了apk文件的内容。
以下是更详细的列表,摘自官方文档

  • base/、feature1/ 和 feature2/:其中每个顶级目录都表示一个不同的应用模块。应用的基本模块始终包含在 App Bundle 的 base 目录中。不过,为每个功能模块的目录提供的名称由模块清单中的 split 属性指定。如需了解详情,请参阅功能模块清单。
  • asset_pack_1/ 和 asset_pack_2/:对于需要大量图形处理的大型应用或游戏,您可以将资产模块化处理为资源包。资源包因体积上限较高而成为游戏的理想之选。您可以按照三种分发模式(即,安装时分发、快速跟进式分发和按需分发)自定义如何以及何时将各个资源包下载到设备上。所有资源包都在 Google Play 上托管并从 Google Play 提供。如需详细了解如何将资源包添加到您的 app bundle,请参阅 Play Asset Delivery 概览。
  • BUNDLE-METADATA/:此目录包含元数据文件,其中包含对工具或应用商店有用的信息。此类元数据文件可能包含 ProGuard 映射和应用的 DEX 文件的完整列表。此目录中的文件未打包到您应用的 APK 中。
  • 模块协议缓冲区 (*.pb) 文件:这些文件提供了一些元数据,有助于向各个应用商店(如 Google Play)说明每个应用模块的内容。例如,BundleConfig.pb 提供了有关 bundle 本身的信息(如用于构建 app bundle 的构建工具版本),native.pb 和 resources.pb 说明了每个模块中的代码和资源,这在 Google Play 针对不同的设备配置优化 APK 时非常有用。
  • manifest/:与 APK 不同,app bundle 将每个模块的 AndroidManifest.xml 文件存储在这个单独的目录中。
  • dex/:与 APK 不同,app bundle 将每个模块的 DEX 文件存储在这个单独的目录中。
  • res/、lib/ 和 assets/:这些目录与典型 APK 中的目录完全相同。当您上传 App Bundle 时,Google Play 会检查这些目录并且仅打包满足目标设备配置需求的文件,同时保留文件路径。
  • root/:此目录存储的文件之后会重新定位到包含此目录所在模块的任意 APK 的根目录。例如,app bundle 的
    base/root/ 目录可能包含您的应用使用
    Class.getResource() 加载的基于 Java 的资源。这些文件之后会重新定位到您应用的基本 APK 和 Google Play 生成的每个多 APK 的根目录。此目录中的路径也会保留下来。也就是说,目录(及其子目录)也会重新定位到 APK 的根目录。
    Google play就是基于对AAB文件的处理,将文件拆分为多个维度的包,之后在用户安装的时候,Google paly 会获取用户手机的信息,然后根据拆分的包,为你组装出一个更小的包,其他的都会被剔除掉。

Google play的上传

https://www.jianshu.com/p/d3abf5f514bf(这个是教程链接,由于注册需要25美元,暂时使用官方工具进行模拟)

通过Bundletool模拟googleplay的行为

可以通过官方库安装Bundletool工具
同时我们需要配置好java的环境,来运行bundetool工具,jdk环境变量的设置
Bundletool参考链接:https://developer.android.com/studio/command-line/bundletool

使用Bundletool将AAB文件转为可以处理的.apks文件

java -jar bundletool-all-0.10.3.jar build-apks --bundle=app.aab --output=my_app.apks

下图是apks文件的解析

在这里插入图片描述在这里插入图片描述

他是分为两个目录的,分别为splits和standalones

  1. split目录,可以看出来它是对各个moudle在资源维度,ABI维度(应用二进制接口),还有语言维度的拆分,当我们将AAB文件交给Google play去处理的时候,他就会根据我们手机的语言,API,分辨率等生成一个最小的包安装到手机中
  2. standalones目录,还有一些手机是不支持多apk模式安装的,所以对于这些手机只能生成一个apk,这些满足了他们的需求
    通过install-apks命令将 APK 部署到连接的设备
    这一步就会将上述的包进行动态的组合,根据手机的设备信息来安装对应的apk
    java -jar bundletool-all-0.10.3.jar install-apks --apks=my_app.apks

根据aab文件生成一个全量apk
它支持所有的设备,不会去动态加载(这个包相对会大,在上面UE的选项中也可以选择去生成)
java -jar bundletool-all-0.10.3.jar build-apks --bundle=app.aab --output=all.apks --mode=universal

bundletool 能够针对 JSON 文件指定的设备配置生成一组 APK。如需首先为已连接的设备生成 JSON 文件,请运行以下命令:
bundletool get-device-spec --output=/tmp/device-spec.json

心得体会
  1. 一个接口怎么去使用,还是应该多去找示例代码,之后通过模仿就可以很快的用起来
  2. 问题的解决,应当多去搜索主要的关键字,并且附带上解决问题的主要特性,如UE,UPL,第三方库等
  3. 遇到问题卡住之后应当理性的分析,理清思路,确定真正需要的是什么,之后再对症下药的搜索
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐