当前位置: 首页 > news >正文

UE4安卓打aab包时,同时存在“gradle”、“arm64/gradle”两个Gradle工程的原因

两个Gradle工程的现象

在出安卓aab包时,观察到存在以下两个Gradle工程:

1、Intermediate\Android\arm64\gradle (称为arm64的Gradle)

2、Intermediate\Android\gradle(称为根下的Gradle)

 

它们存在一些小的差异。下面是“为何有两个Gradle工程”的结论。

原因



1、假设指定了若干种架构,那么就会有多个子目录。在我们的例子中,仅存在 arm64目录。(以及根部的 gradle目录,这是你所知道的)

2、如果“差异不大”,UE4就会统一采用 gradle目录来打aab,来作为所有架构的aab。我们的例子中,就属于这种情况。代码里叫做“bCombinedBundleOK”,即统一打根部gradle来打出aab。

3、下面情况属于“差异大”:
● arm64目录缺乏它的gradle目录。代码搜“Source directory missing”
● arm64目录/Gradle目录的 “AndroidManifest.xml”在某些属性上存在差异,细节太细不用管。代码搜“AndroidManifest.xml files differ too much”
● arm64目录/Gradle目录的 “gradle.properties”在某些属性上存在差异,细节太细不用管。代码搜“Gradle projects differ too much”
● 有更加多的未知差异。代码搜“Gradle projects differ too much”

4、上面四种情况对应的日志都没搜到,说明 bCombinedBundleOK (差异不大)

结论:最终打出aab时,确实没用上 arm64 架构目录。打包只使用了gradle目录。

代码示意图

 

关键代码与日志

请打开UEDeployAndroid.cs:MakeApk() 方法,针对上图的一些代码,做下面的解释:

1、UnrealBuildTool.UEDeployAndroid.MakeApk()

打aab|apks 或打apk的入口函数。

2、foreach (Tuple<string, string, string> build in BuildList)

在我的项目案例中,只有 arm64 。接下来的若干代码要点,处在该循环中,实际上只跑了一次(即arm64)。

3、(在循环中)

                string UE4BuildPath = Path.Combine(IntermediateAndroidPath, Arch.Substring(1).Replace("-", "_"));
                // 这个值是:{项目}\Intermediate\Android\arm64

4、(在循环中)

// check to see if libUE4.so needs to be copied
if (BuildListComboTotal > 1 || FilesAreDifferent(SourceSOName, FinalSOName))
{ // 没有执行Log.TraceInformation("\nCopying new .so {0} file to jni folder...", SourceSOName);Directory.CreateDirectory(JniDir);// copy the binary to the standard .so locationFile.Copy(SourceSOName, FinalSOName, true);Log.TraceWarning("// *Gradle* SourceSOName {0} copy to ->>  FinalSOName {1}", SourceSOName, FinalSOName);//  SourceSOName D:\项目\Binaries\Android\项目-Android-Test-arm64.so 拷贝给:// D:\项目\Intermediate\Android\arm64\jni\arm64-v8a\libUE4.so ✔// 案例中,没有拷贝,被增量跳过了。File.SetLastWriteTimeUtc(FinalSOName, File.GetLastWriteTimeUtc(SourceSOName));
}// remove any read only flags
FileInfo DestFileInfo = new FileInfo(FinalSOName);
DestFileInfo.Attributes = DestFileInfo.Attributes & ~FileAttributes.ReadOnly;
File.SetLastWriteTimeUtc(FinalSOName, File.GetLastWriteTimeUtc(SourceSOName));Log.TraceWarning("// *Gradle* SourceSOName {0} DestApkName {1}, FinalSOName {2}", SourceSOName, DestApkName, FinalSOName);
// 实际是:2024-10-28 21:17:08:726 : WARNING:
// // *Gradle* SourceSOName D:\项目\Binaries\Android\项目-Android-Test-arm64.so
// DestApkName D:\项目\Binaries\Android\项目-Android-Test-arm64.apk,
// FinalSOName D:\项目/Intermediate\Android\arm64/jni/arm64-v8a/libUE4.so

拷贝libUE4.so,这是一个重要的符号表文件。

5、 (在循环中)

                File.Copy(Path.Combine(UE4BuildPath, "AndroidManifest.xml"), GradleManifest, true);
                // 应该是指: 项目\Intermediate\Android\arm64/AndroidManifest.xml 拷贝给  项目\Intermediate\Android\arm64\gradle\app\src\main\AndroidManifest.xml

AndroidManifest.xml 是什么?下面是AI的解答:

`AndroidManifest.xml` 文件是 Android 应用程序项目中的一个关键配置文件。它位于应用项目的根目录下,并定义了应用的元数据、组件、所需权限、硬件和软件功能需求等信息。以下是 `AndroidManifest.xml` 文件通常包含的内容:
1. **包名** (`package`): 应用程序的唯一标识符,通常是反向的域名格式。
```xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.myapp">
```
2. **应用标签** (`<application>`): 这是 `AndroidManifest.xml` 的主要部分,包含应用的所有组件和属性。
- **应用名称** (`android:label`): 显示给用户的应用名称。
- **应用图标** (`android:icon`): 应用的图标资源。
- **主题** (`android:theme`): 应用的主题样式。
3. **活动** (`<activity>`): 应用中的一个界面屏幕,通常用于与用户交互。
- **意图过滤器** (`<intent-filter>`): 定义了哪些意图可以启动该活动,例如默认启动的 `MAIN` 动作和 `LAUNCHER` 类别。
4. **服务** (`<service>`): 执行后台操作的组件。
5. **广播接收器** (`<receiver>`): 用于响应系统级广播的组件。

6、(在循环中)

CleanCopyDirectory(Path.Combine(UE4BuildPath, "assets"), Path.Combine(UE4BuildGradleMainPath, "assets")); // D:\项目\Intermediate\Android\arm64 /assets 等  拷贝给   项目\Intermediate\Android\arm64 / gradle/src/mainCleanCopyDirectory(Path.Combine(UE4BuildPath, "res"), Path.Combine(UE4BuildGradleMainPath, "res"));CleanCopyDirectory(Path.Combine(UE4BuildPath, "src"), Path.Combine(UE4BuildGradleMainPath, "java")); // Path.Combine(UE4BuildGradleAppPath, "src", "main");

Intermediate\Android\arm64/assets (res,src) 等  拷贝给
Intermediate\Android\arm64/gradle/src/main/assets (res,java)

7、

foreach (string Filename in SourceFiles) // 这些文件是  D:\项目\Intermediate\Android\arm64\gradle  中的文件
{ ……Log.TraceWarning("// *Gradle* (4016), Filenam: {0}", Filename); // 几乎遍历了每一个arm64里的文件  D:\项目\Intermediate\Android\arm64\gradle\app\src\main\libs\x86_64\libtgpa.soif (!File.Exists(DestFilename)){ File.Copy(Filename, DestFilename);}// 其中// Source是 Intermediate/Android\arm64\gradle 中的文件// Dest是 Intermediate/Android\gradle 中的同名文件if (Filename.EndsWith("AndroidManifest.xml")){... 某些关键点的比对,省略bCombinedBundleOK = false; // 若确认差异很大,就认定为“不可CombindBundle”Log.TraceInformation("AndroidManifest.xml files differ too much to combine for single AAB: '{0}' != '{1}'", Filename, DestFilename);break;}…… gradle.properties的比对,同上,若差异很大,可能认定为“不可CombindBundle”。…… 其它原因差异很大,可能认定为“不可CombindBundle”。省略…… 
}

从 arm64\gradle 复制文件给 根gradle。并判断是否“差异大”。

8、

if (bCombinedBundleOK)
{

        UnrealBuildTool.UEDeployAndroid.CreateRunGradle()
创建 rungradle.bat

         RunCommandLineProgramWithExceptionAndFiltering()
打印 Making .aab with Gradle..
调用Gradle打包

} else { 略 }

在我的项目案例中,根gradle和arm64/gradle “差异不大”,将会打在根gradle文件夹。

http://www.lryc.cn/news/472362.html

相关文章:

  • 淘宝API接口( item_get- 淘宝商品详情查询)
  • Soanrquber集成Gitlab 之 gitlab用户配置和身份验证
  • 沪深A股上市公司数据报告分析
  • Elasticsearch Search Template 搜索模板
  • 2024年10月-2025年5月 Oracle 19c OCM 考试安排
  • VMware虚拟机安装KailLinux系统
  • G2 基于生成对抗网络(GAN)人脸图像生成
  • R学习笔记-单因素重复测量方差分析
  • HTML练习题:彼岸的花(web)
  • (蓝桥杯C/C++)——常用库函数
  • GPT-Sovits-2-微调模型
  • 【数据结构 | PTA】懂蛇语
  • Python——自动化发送邮件
  • MTKLauncher_布局页面分析
  • C#实现隐藏和显示任务栏
  • 基于springboot+vue实现的公司财务管理系统(源码+L文+ppt)4-102
  • rnn/lstm
  • 袋鼠云产品功能更新报告12期|让数据资产管理更高效
  • MATLAB——入门知识
  • C#从零开始学习(用户界面)(unity Lab4)
  • Axure PR 9 多级下拉清除选择器 设计交互
  • 分布式项目pom配置
  • 2. Flink快速上手
  • Java-I/O框架06:常见字符编码、字符流抽象类
  • 计算机网络-MSTP的基础概念
  • P1037 [NOIP2002 普及组] 产生数
  • 【分布式知识】分布式对象存储组件-Minio
  • 跨平台开发支付组件,实现支付宝支付
  • API 接口:为电商行业高效发展注入强劲动力
  • Golang的跨平台开发