work-record

2025年7月25日

  1. 周报
  2. mch的bug
  3. RS的sendmessage

2025年7月24日

  1. 定位MR2空调RS出包的问题
    7.7号 Optimize initial time2从这开始
  2. 完善接口文档
  3. 配合RS的解决模块穿插问题,在unload中detach脚本 完成初版 17点48分

mch的新bug 2957 应该是由于自动调节风向时不可以被打断导致

2025年7月18日

  1. 好烦 国内空调出包
  2. 海外空调出包
  3. 周报

2025年7月17日

  1. mc问题
  2. 国内空调包

2025年7月17日

  1. mcbug
  2. qz需求

2025年7月15日

  1. MCHbug,滑动过程中出风口关闭了,但是滑块仍显示
  2. 修改国内出风口开启点击区域不对的问题,以及合入其他相关bug
  3. 了解renderdoc抓帧

// add message to queue
AddMessageToQueue(MSG_AcController_setWindMode, "256;0");
AddMessageToQueue(MSG_AcController_setWindMode, "272;0");
AddMessageToQueue(MSG_AcController_setWindMode, "512;0");
AddMessageToQueue(MSG_AcController_setWindMode, "528;0");
AddMessageToQueue(MSG_AcController_setWindMode, "1024;0");
这个消息队列只传控制风的模式,不要传风口开关,因为这是绑死在程序中的,MR2的这里要修改 发的消息都会慢一拍

2025年7月14日

  1. MCH的bug 主要是等引擎
  2. RS导出资源怎么又有问题 新引擎啊啊啊啊

2025年7月12日

加班

  1. 定位crash 问题

2025年7月11日

  1. 解决MCHbug---转引擎
  2. MCH改代码出包---等引擎
  3. 周报,包含RS出包无法加启动图

14点38分

  1. RS出包,粒子和闪退问题

2025年7月10日

  1. 国内量产包
  2. RS监听消息

触屏操作不生效是因为byd::EngineExtensions::RayCastScene(mSceneTree, (int)x, (int)y, nodes);不成功,nodes为零

2025年7月9日

  1. MC出包---end
  2. 海外SQ问题---end
  3. MR合入代码---end

2025年7月8日

  1. RS架构出包
  2. MCH解决性能问题出包

2025年7月7日 一

  1. 海外SQ出包--->end
  2. RS架构--->诡异
  3. MC等引擎

2025年7月5日

  1. ridter
  2. 海外sq启动图---end
  3. MR2前后排切换
  4. RS框架

关于异步加载

在Update里检查材质加载状态有效是因为:
初始化过程和渲染循环是分开的。初始化函数(Init)只执行一次,而Update函数会在每一帧都被调用。
当您在Init中启动异步任务后,如果在同一个Init函数中等待该任务完成(通过mMaterialLoading.wait()),这就变成了同步操作,失去了异步的意义。
而在Update中检查,您可以使用非阻塞的方式(如mMaterialLoading.wait_for(std::chrono::seconds(0)))来查询任务状态,不会阻塞主线程。
这样做的效果是:
初始化函数快速完成并返回
材质在后台线程加载
每一帧检查材质是否加载完成
当加载完成时,应用材质变更
这种模式让主线程可以继续执行其他工作(如渲染、处理输入等),而不必等待材质加载完成,从而提高了应用程序的响应性和初始化速度。

2025年7月4日

  1. 海外SQ右舵--->end--->新增场景
  2. RS架构出包
  3. 定位解决MC/MR车型在新版本引擎中出风口不显示的bug

15点02分

  1. MC出风口丢失问题定位

2025年7月3日

  1. RS架构出包
  2. 异步加载--->end

2025年7月2日

RS架构出包
4. 异步加载
5. RS出包
2. 新版本引擎无法显示出风口
3. 加一个全局的mAreaid--->end

  1. 海外空调crashbug

2025年7月1日

  1. 海外空调crash 偶现
  2. MC的crash的bug
  3. 黑屏bug
  • 关闭风口时需要关闭粒子发射速率,否则,切换前后排会使得关闭的风口冒出粒子

16点56分

  1. 海外空调crashbug
  2. 新版本引擎无法显示出风口
  3. 加一个全局的mAreaid
  4. 异步加载

2025年6月30日 周一

  1. 解决黑屏问题,
  2. 修复测试测出的MC的问题
  3. 解决国内HT空调的问题

2025年6月27日

  1. 黑屏bug,mesh加载逻辑优化--->end
  2. 安卓浅色模式后排吹面风不对--->居然好了
  3. 绿净切换完前后排之后会打开--->end
  4. 国内HT ktx优化--->我发现都一个德行,在最后一下会顿一下

周报:

  1. 开发MC车型并出包
  2. 修复MR车型bug
  3. 修复国内空调bug并出包

出aar的包

2025年6月26日

  1. MC出包
  2. 看代码学习
  3. 出现一个bug导出后 后排风 没加载到

13点48分

  1. 吹风模式

  2. 发现自动调节风向,输入不同时间,速度不一样

2025年6月25日

  1. 开发MC

13点37分

  1. CI---->不搞
  2. 风量调节问题 --->end

2025年6月24日

  1. 开发MC

黑屏时间长--->end

14点28分

  1. 修复风量调节的逻辑
  2. 增加UI滑块的材质切换

2025年6月23日 周一

  1. 解决bug,国内和MR--end
  2. 开发MC

14点48分

  1. 修改MR2bug

2025年6月20日

  1. 合入国内bug----end
  2. MR出包
  3. 把所有的项目都搬到G盘
  4. HT加载慢
  5. MR F:\imgui\imgui_air_condition\Export\0620MR\launcher\build\outputs\apk\debug 构思

13点47分

  1. HT加载慢---->初步定位资源加载慢

2025年6月19日

  1. 合入国内bug

  2. develop-ht茂南的修改

  3. 看看CI出包的

  4. 更新jira

  5. 海外HT方向调节问题

  6. MR更新引擎引入新问题--->end

2025年6月18日

  1. 解决MRbug--->end 就是风口材质用错了
  2. 国内空调还有一个问题,UI缩放--->end 用了新方案,上下黑色,只渲染1280x720
  3. QZ量产,从根上改---->end

14点51分

  1. CI出包
  2. 海外回退车体图更新,出包

2025年6月17日

  1. 看MR的bug,不是raycast,就是raycast
  2. 学习回调函数
  3. 修复国内切换中英文UI缩放

2025年6月16日 一

  1. MR出包--->完成,但是还有bug,raycast
  2. 学习回调函数
  3. 安装clang-format---->end
  4. QZ5.0量产--->end
  5. 海外HT更换启动图----要改的挺多---->中控副驾启动图都要换除了调了相机还调整了车体图---->待验证
  6. 将各个单分支的修改合入合包的主干,因为现在主干是合包---->等通知吧,尤其develop太乱了

2025年6月13日

  1. 出5.0qz主干包---更换jar包
  2. MR手动调整风向
  3. 海外HT右舵副驾漏了一个风口材质---->下周四
  4. HT三厢扶手屏分辨率问题
  5. qz5.1即develop-qz变成量产了

2025年6月12日

  1. MR的bug要不要立即修
  2. 改造RS架构
  3. 前后排切换更换ktx--->end

13点42分

  1. rs导出
    server
    resource
    sdk client
    影响启动方式不一样

  2. 学习回调函数

2025年6月11日

  1. MR出包---->有崩溃
  2. sendmessage写好了,出包的时候再换
  3. QZ5.0量产新需求
    吹窗的效果开关逻辑,仅跟随主驾控制。
    QZ 这个实车上 是不会发副驾吹窗ID 的。
    动效侧 识别到主驾侧的吹窗ID 通知时,同步关联副驾吹窗的动效,开关,冷热风

2025年6月10日

  1. RS架构在MR车型---->影响启动方式
  2. 前后排切换更换ktx,

13点50分

  1. sendmessage
  2. MR出包

2025年6月9日 周一

  1. 空调bug,包括美术的ht修改--->BYD2445,推至develop-ht
    前后排切换更换ktx,
    分辨率不对导致的UI缩放
  2. MR的测试按钮---end
  3. RS架构在MR车型---->影响启动方式
  4. QZ的不对,加接口啥的

QZ空实现接口,要换jar包--->end
降低SDK版本
UI位置不对

qz5.0 主干 量产 ----->5.0单包出了量产包验证

  1. 更换jar包空实现onStart(),onStop();2. 调整minSdkVersion 为25

qz5.1 一个分支出合包

对应的jar包已更换完,空实现了start和stop
等待确认sdk版本是否降级

修改分辨率:
adb root
adb shell wm size 1920x1080

修改位置:com/gritworld/gritmobile/client/GritEngine.java com/gritworld/gritmobile/activity/GritPlayerActivity.java文件

2025年6月6日

  1. 2462 切换中英文后空调UI会进行缩放---->看中英文切换干了什么,可能是改变了窗口大小
  2. 2461 频繁点击温度调节,即启动销毁,导致黑屏
  3. 2440 0x9B空调开启时偶现不展示车体图---->类似crash
  4. 什么卡顿,改造序列帧为ktx
  5. BYD-2445ht改完放在ht分支后面合入

16点29分

  1. 修改海外crash 内存分配不足bug---->修改消息队列增加最大长度限制;修改splitString函数中字符串类型为string_view
    file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/19465_develop-oversea/

qz变成量产了 没

杨宇的0514的那个不能用了,引擎中没那个方法了 why
周报:

  1. QZ单包与合包出包
  2. 解决海外sf的crash问题
  3. 国内HT_SZ出主干包
  4. 定位并解决byd反馈的0508量产包的多个bug

2025年6月5日

  1. 海外SFbug 不一定解决,有分析
  2. HT_SZ出包
  3. QZ出包

滑块问题未彻底解决,SZ的和HT三厢扶手屏有冲突,后续合入时再调整

14点14分

  1. 确认调节风口为什么没有立即下发角度
  2. 海外crash为什么会发那么多的消息

3D 架构需要采用 render service 架构,至少需要同时支持 4 个 3D 动效场景同时显示。 这个是啥,问建超

2025年6月4日

  1. 海外SFbug 不一定解决,有分析
  2. 国内HT_SZ出量产包

2407 sfcrash 优先在看--->改了一部分感觉不完美
2456 sfcrash
2086 HT三厢前后排卡顿----之前茂南解决了一次没和
2218 中英文切换 ---->老问题,一直没解决,
2232 中英文切换 ---->老问题,一直没解决,
2444 已有结论 ---- 双击打开出风口不顺畅
2443 D3更换车体图 ----美术配合
2441 SZA8空调设置为“避人吹”手动调节电动出风口时,“避人吹”开关需要置灰-----有结论
2440 0x9B空调开启时偶现不展示车体图---->类似crash
2050 SZA8风口方向上下滑块不能滑动到顶部和底部---->end 横竖滑块不一样长,不能仅用水平滑块长度
2462 切换中英文后空调UI会进行缩放---->看中英文切换干了什么,可能是改变了窗口大小 解压有密码

  1. QZ出包

2025年6月3日

  1. QZ单包---->有方案了
  2. 海外SFbug
  3. ht_sz出量产--->end

SZ分支 16 19 20 21 27 28
HT分支 21 30

ht和ht_sz 差 45c2da9547be768e92c8e83e0964ded673fb2d3e
sz和ht_sz 差 587b50073005566a59bddb2c37f5d69fe86f7635

# 2025年6月1日
  1. QT版本空调Bug
  2. QZ单包需求
  3. MR车型空调开发

海外主干即量产

2025年5月31日

Bug

  1. 2407 海外SF 128 crash闪退一次
  2. 2040 0x9B空调开启时偶现不展示车体图
  3. 2041 SZA8空调设置为“避人吹”手动调节电动出风口时,“避人吹”开关需要置灰
  4. 2047 D4风口联动开启,动效先关后开---->之前看log定位到是,风口正常打开但是同步了实车信号
  5. 2050 SZA8风口方向上下滑块不能滑动到顶部和底部

2025年5月30日

  1. imgui空调出包
  2. 海外出量产包----主干变为量产包了
  3. QZ出压测包

周报:

  1. QZ_SQ合包
  2. 海外空调包
  3. imgui空调出包

2025年5月29日

  1. 烦死了imgui

2025年5月28日

  1. 海外出包

19184

2025年5月27日

  1. 0408 HT25两厢-->已改,等后续副驾修改--->end---->SZ副驾驶滑块UI
  2. develop-oversea 海外sf右舵,19039---->已出---->海外sz不对在改--->拆分了副驾----->海外SQ相机位置修改,SZ滑块UI----->出包就行
  3. QZ-SQ合包 19106

Ht25 682d9e2dba7dbf21ddd1329e7e9f1b9eaf44a10e这个位置回退,不要美术的东西

本地QZ合包 F:\project\bydDomestic\Export\QZ\launcher\build\outputs\apk\debug\AirConditioner_fps30_v1.0.0-250527_1851_debug.apk 给测试

2025年5月26日 一

  1. QZ合包--->已出
  2. 0408 HT25两厢-->已改,等后续副驾修改--->end
  3. develop-oversea 海外sf右舵,19039---->已出---->海外sz不对在改--->拆分了副驾

我能做的已经ok,导出安卓工程,可能Java层还要写

将风口材质手动加入

把develop-sz的修改没合入,居然也没被发现!!!

2025年5月25日

3D旋转的本质:如果直接旋转 mWindComp,旋转中心可能不是你想要的点,容易出现模型“绕错轴”或“漂移”。
通过包一层空节点,把旋转中心“搬”到你想要的位置,所有旋转都在 mRotateComp 上做,mWindComp 只负责显示。
这样拖拽时,只需修改 mRotateComp 的旋转属性(如欧拉角、四元数),风口模型就能正确地围绕自身中心点旋转,实现风向的3D调整。

2025年5月23日

  1. 周报

  2. 完成QZ车型并出包

  3. 定位1453空调bug

  4. 更新HT三厢车体图以及解决后排屏出风口点不动的bug,SZ风效等问题,出包ht_sz合包

  5. 满足BYD提出的新需求,点击空白区域发送一个信号给上层,来控制UI

  6. 完成空调的接口的文档,测试端需要

  7. 完成海外SF右舵开发,并出包

  8. imgui引擎上开发MR车型

  9. 国内HT两厢系列的初始出风叠加了,可能是X轴数据弄反了,三厢是好的@杨凯(杨凯)---问题

S:\DevelopmentSH\gm-cicd\DailyBuild\develop\60091\GWEDITOR\release 引擎位置
S:\DevelopmentSH\gm-cicd\DailyBuild\develop\59682\GWEDITOR\release 可以的

其他的赶5月底(MR2、Qz合包、海外SF右舵、Ht两厢)

QZ合包可以直接出,除雾风材质不受影响

2025年5月22日

  1. 将sz和ht分支的合入develop 有冲突---end

更新完启动图待出包
qz/sq合包 file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/18948_develop-qz/
qz单包 file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/18949_develop-qz/

分辨率 render view

0408包 18937 file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/18937_develop_ht_sz_0408/

你这边在空调模块的工作清单有这些:我按优先级顺序写的
1、MR2(接口与引擎侧对接)--节点528
2、Qz配合出包(目前应该就是debug阶段了)--节点528
3、BYD提出的屏幕点击逻辑----这个是不是又要出包给他们HT&SZ?
4、接口文档-----这个是内部测试要用的
5、海外SF右舵--节点603

2025年5月21日

将0408启动图更新到develop
然后将sz和ht分支的合入develop 有冲突

  1. 先将0408分支的问题解决----完成HT三厢车体图更新出包,解决后排屏点不动的bug

2025年5月20日

  1. 写一下API文档
  2. 继续mr车型开发
  3. 后排屏bug--->end
    d673df01afc9687f0cc102994d983e01a2da8873 这个删多了

明天

将0408启动图更新到develop
然后将sz和ht分支的合入develop 有冲突

2025年5月19日

  1. qz出包--->end
  2. 1453空调bug
  3. imgui--->16点02分 我看这个 先看双击出风口以及拖拽调节风向的逻辑 正好这里还没有实现

13点30分

  1. 新增一个接口 传信号
  2. 修改sz--->改完了,存在develop中了,有好多不需要pick 由于develop启动图落后同步

2025年5月16日

  1. HT_SZ出包--->end
  2. 1453空调bug
  3. qz车型

周报

  1. 分析1439空调bug_sz卡滞问题,已经将分析意见反馈给BYD待其复测
  2. 开发QZH新车型
  3. 更新HT三厢车体图并出包
  4. 开发MR车型

20250519今日【主干包】更新:

【QZH】新增QZH车型

file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/18758_develop-qz/

2025年5月15日

  1. 还是新空调

14点19分

  1. 理一下引擎包
    3. 杨宇修复回弹---wqx 主干 没要
    2. 移除openssl---Release_BYD_2022 主干
    1. 书山修复黑屏---wqx 不要上量产,其实上了
      出主干要手动更新引擎路径 \docs.sh.gritworld.local\Company\DevelopmentSH\gm-cicd\Builds\Release\BYD\2022\60106\WIN\RELEASE

2025年5月14日

  1. 国内HT三厢更新
  2. 空调修复引擎bug出包,问一下要不要换CI的引擎--->先不出

15点13分

  1. HT三厢车体图更新完毕

20250514今日【主干包】更新:

【SZ】修复海外SZ副驾驶屏幕左右黑边问题:

【HT】HT三厢更新车体图 10系 中控屏 副驾屏 扶手屏
30系 中控屏 副驾屏 左右头枕屏 扶手屏
优化部分出风口贴图大小

file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/18626_develop_ht_sz_0408/

//call before grit player construct
    private void setGritplayerExternalpath()
    {
        File internalDir = getFilesDir();
        Log.i("GritPlayer", "internal writeable path: " + internalDir.getAbsolutePath());
        File externalDir = getExternalFilesDir(null);
        Log.i("GritPlayer", "external writeable path: " + externalDir.getAbsolutePath());
        GritPlayer.setExternalReadPath(internalDir.getAbsolutePath());
    }

2025年5月13日

  1. sz卡滞问题--->复测
  2. 新空调烦
  3. 将项目push到我的gitlab--->失败放弃

16点11分

  1. QZH新车型

2025年5月12日

  1. 新空调烦

13点35分

  1. sz卡滞问题
  2. 将图片加载和引擎启动放在一个容器,让图片在主线程不依赖引擎直接加载--->后面

2025年5月10日 周六

  1. 修改启动图逻辑,使其在引擎之前,加快时间
    ---->按要求搞定但是效果不明显,只快了十几毫秒

2025年5月9日

  1. 研究一下upslider那里的作用
  2. 把引擎和项目打包发到网盘,周末研究
  3. 周报

关于滑块的修改出问题了再改 UserModule\source\private\OutletBeh.cpp:510

bool IsRcs = atoi(BydSingleton::Instance()->GetDeviceData(DEVICE_TYPE).c_str()) == AC_DEVICE_RCS_ID;
if ((mOutletId == MIDDLE_LS_FACE_MASK || mOutletId == MIDDLE_RS_FACE_MASK || mOutletId == MIDDLE_METER_LS_FACE_MASK || mOutletId == MIDDLE_METER_RS_FACE_MASK) && IsRcs)
{
    total -= 1.5;
}
  1. 增加xml文件和activity文件,方便出压测包
  2. 修改启动图逻辑,使其在引擎之前--->未完成

show time!! use time 显示时间

周报:

  1. 完成在国内HT扶手屏放大后加遮罩,调整滑块UI长度后,出量产包
  2. 增加xml文件和activity文件,方便出压测包--->待验证
  3. 修改启动图逻辑,使其在引擎之前--->未完成

2025年5月8日

  1. 还是按层次写,始终都要用到

14点16分

  1. 搞完ht扶手屏加遮罩以及调整滑块--出量产包ht_250508
  2. 1430卡的bug
  3. 等出问题了改一下spalsh那里的逻辑,有点乱
  4. 国内新增qz车型,类似sq,一个中控前后排

2025年5月7日 周三

  1. 在新引擎上实现空调--->先在一层上实现功能

  2. 加阴影遮罩
    看看遮罩Mask---->18点51分,大概找见遮罩的位置了
    UserModule\source\private\CarInteriorBeh.cpp#694 这里不可以渐变,
    --->这里不对,要跟随相机位置变化,绑在时间轴上,UserModule\source\private\CarInteriorBeh.cpp:1022

  3. git reflog show --date=local --all | grep cora/20250507_HTRCS 查看分支源头

2025年4月29日

  1. 用新引擎出一个apk给修竹测
  2. imgui引擎的空调,只有一个场景,加一些粒子开关,风口开关的功能

13点42分

  1. 修复右舵出风口角度---->end
    都怪用了cherry-pick 全搞乱了,byd乱测
    修复右舵出风口角度;
    修改右舵滑块位置;
    补充当未指定车型时选取中控和附加启动图的逻辑(健壮性);
    删除非11D和14B车型时,mLeftRudder必为true的逻辑,由于未考虑非法车型ID;
  2. 弄云桌面

2025年4月28日

  1. 海外HT修复序列帧车体图,以及副驾驶按钮问题出包--->还是车体图有问题
  2. 先弄云桌面,再看新空调,差距还多的啊

13点28分

  1. 新引擎的空调--->先不管场景加载了,先看--->张嘴问,不用切其他场景只需要实现一个场景的一些功能即可
  2. 将引擎的修改合入到htsz sq的拆包上--->end 要用修复后的引擎,不过要等加完日志

2025年4月27日

  1. 看看黑屏问题,新修改的 --->end
    file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/18107_develop/ 黑屏复现的
    file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/18110_develop/ 修复后的包
  2. 新引擎开发空调

14点50分

  1. 在单独分支上开发,不要cherry-pick到主干分支,而是merge过去!!!!!!!!---->只有量产的时候再cherry-pick 剩下的用merge,记住
  2. 海外HT右舵,剩下的都是美术的问题
  3. 修改国内sz副驾驶黑边,到拆包sz_ht_0408 以及develop_sz
  4. registAcCallback changeModeSkin onMultiWindowModeChanged updateConfigurationChanged//都是干嘛的 好像用到了,是用来发送消息的

单例模式和工厂模式

设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路,他不是语法规定,而是一套用来提高代码可复用性、可维护性、可读性、稳定性以及安全性的解决方案。

后面国内空调的修改都在拆包后的版本中修改

2025年4月26日

  1. 本地出aar流程,aar,apk脚本作用
    • 看一下显卡是什么版本,怎么被使用的
  2. CI出包流程
    • 有三个ac_classes.jar文件需要替换 apk_testaar_base\ac_classes.jar apk_base\ac_classes.jar aar_base\ac_classes.jar

明早记得发:
250425今日 【主干包】更新:

HT右舵需求制作
SQ的吹风形态优化
HT初始出风角度调整
HT吹风口动销优化
收到极限角度有效角度范围外,风口角度动效保持不变

file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/18091_develop-oversea/

  1. 新引擎的空调

4. aar学习

AAR(Android Archive)包是 Android 开发中用于封装和分发可重用组件的一种文件格式。它类似于 Java 中的 JAR 包,但专为 Android 设计,支持包含代码、资源、清单文件及其他 Android 特有的配置。

这个批处理文件 prepare_AC_AAR.bat 主要用于自动化配置和构建 Android 库(AAR),以下是其详细分析:


作用概述

  1. 配置 Android 工程路径:通过用户输入或默认路径设置工程目录,确保路径有效性。
  2. 修改 SDK 和 CMake 路径:将引擎路径转换为适合 local.properties 的格式,写入配置文件。
  3. 清理与替换文件
    • 删除旧代码、资源文件和冗余目录。
    • 拷贝新的 Java 代码、依赖库(JAR)、构建脚本(Gradle)和清单文件(AndroidManifest.xml)。
  4. 执行 Gradle 构建:最终调用 assembleRelease 生成 AAR 包。

详细步骤解析

1. 设置基础路径

set basePath=..\aar_base
  • 定义 basePath 变量,指向存放模板文件的目录 ..\aar_base(如 Java 代码、Gradle 脚本等)。

2. 获取 Android 工程路径

set /p AndroidPath=<./AndroidPath
  • 从当前目录的 AndroidPath 文件中读取预设的工程路径。
  • 验证路径有效性
    if NOT exist %AndroidPath%/local.properties (
        set /p AndroidPath=请输入引擎路径 [默认 %AndroidPath%]: || set AndroidPath=%AndroidPath%
    )
    
    • 如果 local.properties 不存在,提示用户输入路径(默认使用历史值)。
    • 最终将路径保存到 AndroidPath 文件中,以便复用。

3. 配置 SDK 和 CMake 路径

set /p EnginePath=<./EnginePath
set converted_path=%EnginePath:\=\\%       ! 转义反斜杠为双反斜杠
set converted_path=%converted_path::=\:%   ! 替换冒号为转义格式(适配属性文件)
echo sdk.dir=%converted_path%\\editor_data\\export\\GWSource\\android\\Tools\\Sdk >%basePath%\local.properties
echo cmake.dir=%converted_path%\\tools\\cmake >>%basePath%\local.properties
  • EnginePath 文件读取引擎路径,处理后写入 local.properties
  • 路径转换逻辑
    • \\\:避免 Windows 路径中的转义问题。
    • :\::可能用于适配 Unix 风格路径(如 CMake 配置)。

4. 文件清理与替换

4.1 删除旧代码和资源
rd /s/q %AndroidPath%\launcher\src\main\java      ! 递归删除 Java 目录
rd /s/q %AndroidPath%\launcher\libs              ! 删除依赖库
del /s/q %AndroidPath%\gritLibrary\src\main\java\com\gritworld\gritmobile\activity\*.*  ! 删除 Activity 代码
  • /s/q 表示静默递归删除,无确认提示。
4.2 拷贝新文件
xcopy %basePath%\java %AndroidPath%\gritLibrary\src\main\java /Y /S /I  ! 拷贝 Java 代码
xcopy %basePath%\ac_classes.jar %AndroidPath%\gritLibrary\libs /Y       ! 拷贝 JAR 依赖
xcopy %basePath%\AndroidManifest.xml %AndroidPath%\gritLibrary\src\main /Y  ! 替换清单文件
  • /Y 覆盖现有文件,/S 包含子目录,/I 假定目标为目录。
4.3 替换构建脚本
xcopy %basePath%\build.gradle %AndroidPath%\gritLibrary /Y      ! 库模块构建脚本
xcopy %basePath%\launcher-build.gradle %AndroidPath%\launcher\build.gradle /Y  ! 启动模块脚本
xcopy %basePath%\project_build.gradle %AndroidPath%\build.gradle /Y           ! 项目级脚本
4.4 清理资源文件
del /s/q %AndroidPath%\gritLibrary\src\main\res\values\*.*       ! 删除 values 资源
del /s/q %AndroidPath%\gritLibrary\src\main\assets\Data\GFXResource\textures\*.*  ! 删除纹理
rmdir /s/q %AndroidPath%\gritLibrary\src\main\assets\Data\plugins  ! 删除插件目录
  • 删除无用资源以减小 AAR 包体积。

5. 执行 Gradle 构建

cd %AndroidPath%
.\gradlew assembleRelease --stacktrace
pause
if NOT ["%errorlevel%"]==["0"] pause
  • 切换到工程目录,执行 assembleRelease 生成 Release 版 AAR。
  • --stacktrace 用于输出详细错误信息。
  • 错误处理缺陷
    • if NOT ["%errorlevel%"]==["0"] pause 语法不标准,应改为 if %errorlevel% neq 0 pause

潜在风险与改进建议

  1. 路径空格问题:未用引号包裹路径,可能导致含空格的路径解析失败。
  2. 错误处理不足:Gradle 构建失败后仅简单暂停,可增加回滚或日志记录。
  3. 资源删除风险:递归删除命令(如 rd /s/q)可能误删重要文件,建议添加路径校验。
  4. 路径转义逻辑:替换 :\: 的用途需确认,可能在某些场景导致路径错误。

总结

该脚本通过自动化配置、文件替换和资源清理,简化了 AAR 的构建流程,适用于需要频繁打包的场景。其核心逻辑清晰,但需注意路径处理和删除操作的安全性,建议在关键步骤添加日志和错误恢复机制。

5. CI学习

CI/CD 自动化执行流程解读
从日志中可以看出,整个 CI/CD 流程分为以下几个阶段:

  1. 环境准备
    执行器类型: 使用 shell 执行器(具体为 PowerShell)。

操作系统: Windows(运行在 GWSHAQAEDA004 节点)。

编码设置: 设置 UTF-8 编码(chcp 65001),避免中文字符乱码。

  1. 代码获取
    检出代码: 从 Git 仓库拉取 develop-oversea 分支的最新提交 5bcfa3f5。

清理文件: 删除临时目录(如 Export/、Log/)和锁定文件(index.lock),确保构建环境干净。

  1. 执行构建脚本 (tools/deploy.py)
    脚本 deploy.py 的步骤如下:

a. 获取最新编辑器
从网络路径 \docs.gritworld.cn\Company\DevelopmentSH\gm-cicd\BYD_Editor\Airconditioner\release2022new.zip 下载或更新编辑器。

设置编辑器路径到环境变量 GW_EDITOR_PATH。

b. 导出项目
启动编辑器(GEditor.exe),通过自动化操作打开项目并执行导出:

修改项目配置(如设置 scriptbackend 为 cpp)。

打开部署窗口并设置参数(如最大化窗口)。

等待项目导出到 Export 目录。

c. 后处理
修改 Android 路径和引擎路径。

删除无用文件(如 medias 目录)。

修改版本号(将版本名设置为 V0425 和 0425Main)。

d. 构建 AAR 和 APK
使用 Gradle 构建 AAR(成功)。

构建 APK 失败:在 :launcher:compileReleaseJavaWithJavac 任务中因 RIGHT_DRIVER_SEAT 符号缺失导致编译失败。

  1. 错误处理与清理
    日志提示 BUILD FAILED in 13s,随后执行 after_script 清理临时文件。

最终作业状态为失败(exit status 1)。

  • git fetch --all 拉取远程仓库,更新--->常应对fatal: bad object问题

2025年4月25日

  1. 周报
  2. 差启动图和初始角度--->end

周报:

  1. 完成新增海外HT的右舵,出包进行测试
  2. 配合解决SZ空调黑屏问题
  3. 修改海外SZ/HT的出风口初始角度
  4. 修改调整风口角度逻辑

调整海外HT副驾驶左右按钮逻辑

16点26分

  1. CI出包,识别不到jar包
    调整SZ的初始风口角度

2025年4月24日

  1. 继续完成右舵
  2. 改初始角度
  3. 改调节角度逻辑--->end

13点28分

  1. 改初始角度--->有难度--->解决 SetAutoAngleX()这个就是设置角度的所谓接受角度,调角度,不要被这个auto迷惑
  2. 如何对按钮进行控制的--point

2025年4月23日

  1. 昨天肝到了一点多,还没提加班
  2. 台式远程控制笔记本,建立局域网共享文件夹
  3. 为啥我本地出包不行--->没有修改release2022\DeviceAssets\里面的几个info文件

13点57分

  1. 一定问一下在哪个分支上出包,出什么包
  2. 前后排切换卡顿
  3. HT出风口初始角度--->美术
  4. 基本成型,调节风口角度的时候出来的一个ui是在哪设置---->SetHTSliderScale();

2025年4月22日

  1. SQ HT_SZ拆包包体大小有问题,重新删除后出包,测试对--->end
  2. 右舵开发基本完成
  3. 今天需要输出一个国内空调量产包,当前量产包目前还是出合包(HT&SZ&SQ)。量产包的内容合入【HT25款的需求】和【HT三厢车体图偏大的bug修复】
  4. 国内SQ拆包 file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/17866_develop_sq_0408/--->废弃
    HT_SZ拆包 file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/17869_develop_ht_sz_0408/--->废弃
    看aar,也是一种压缩格式

13点33分

  1. 国内空调量产包--->end 完成
  2. 评估新车型MCHF/MCHG  七至八天
  3. 对于这个项目的疑问点,风效,风的大小 触摸拖拽
    当⽤⼾触控⻛效时,进⼊调节⽅式,并且触控的⻛效暂时不响应上报的⻆度(以防⽌⻛效偏离⼿势),当操作结束后,触控的⻛效⻆度调节到最新⻆度,最终保持⻛效移动到最新⻆度---->拖动的时候不发送坐标,到最后再发送,之看不动
  4. 空调CI出包只需要替换引擎路径,因为都在一个云服务器上
  5. 如何杀死安卓进程,只需要修改activity中的onpause函数

2025年4月21日 周一

  1. 解决昨天的右舵--->jar包应该只是用在Android工程中,而我先保证windows模拟成功
    SUPPORT_RSE_SCREEN这个有作用
  2. 可能得问他们要一下新的jar包,包含控制左舵右舵的变量---->貌似白干?如何控制左右舵

13点31分

  1. 确认一下出风口是如何初始化的
  2. 不要老是自己想 问清楚
  3. libs中的jar包在库中的哪存着?--->在apk_base这里面
  4. 拆包注意拆之前拆之后的大小

2025年4月20日

  1. 给海外也增加副驾未指定车型的问题--->不要轻易在主干上修改
  2. 检查2205需求,对出风口角度---->一毛一样
  3. 研究右舵,第一版,貌似不是很easy
 private void initDeviceDataButtonList() {
        Log.d("TimeLine", "------------------initDeviceDataButtonList----");
        LinearLayout buttonContainer = new LinearLayout(this);
        buttonContainer.setOrientation(LinearLayout.VERTICAL);
        buttonContainer.setBackgroundColor(Color.WHITE);
        buttonContainer.setElevation(20);

        //车型ID
        List<IdData> CarModeIdDataList = new ArrayList<>();
        //CarModeIdDataList.add(new IdData("SQ 0x9B", 0x9B));
        //CarModeIdDataList.add(new IdData("SQ 0x117", 0x117));
        CarModeIdDataList.add(new IdData("海外SQ 0x0126", 0x0126));
        CarModeIdDataList.add(new IdData("海外SF 0x011C", 0x011C));
        CarModeIdDataList.add(new IdData("海外SF 0x0128", 0x0128));
        //CarModeIdDataList.add(new IdData("HT 0XAA(两厢)", 0XAA));
        //CarModeIdDataList.add(new IdData("HT 0XAB(两厢)", 0XAB));
        //CarModeIdDataList.add(new IdData("HT 0XD3(三厢)", 0XD3));
        //CarModeIdDataList.add(new IdData("HT 0XD4(三厢)", 0XD4));
        CarModeIdDataList.add(new IdData("海外HT 0x11D(两厢)", 0x11D));
        CarModeIdDataList.add(new IdData("海外HT 0x14B(两厢)", 0x14B));
        CarModeIdDataList.add(new IdData("SZ 0xA8", 0xA8));
        CarModeIdDataList.add(new IdData("SZ 0xA9", 0xA9));

        Spinner carModeIdButton = new Spinner(this);
        LinearLayout.LayoutParams spinnerParams = new LinearLayout.LayoutParams(
                0,  // 宽度为0
                LinearLayout.LayoutParams.WRAP_CONTENT,  // 高度自适应
                1.0f  // 权重为1
        );
        carModeIdButton.setLayoutParams(spinnerParams);
        carModeIdButton.setPadding(12, 12, 12, 12);
        carModeIdButton.setBackgroundResource(android.R.drawable.btn_default);

        ArrayAdapter<IdData> adapter = new ArrayAdapter<IdData>(
                this,
                android.R.layout.simple_spinner_item,
                CarModeIdDataList
        ) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                TextView view = (TextView) super.getView(position, convertView, parent);
                view.setText(getItem(position).name);
                view.setGravity(Gravity.CENTER);
                return view;
            }

            @Override
            public View getDropDownView(int position, View convertView, ViewGroup parent) {
                TextView view = (TextView) super.getDropDownView(position, convertView, parent);
                view.setText(getItem(position).name);
                view.setGravity(Gravity.CENTER);
                return view;
            }
        };
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        carModeIdButton.setAdapter(adapter);
        carModeIdButton.setSelection(cIndex);
        mCarModeId = CarModeIdDataList.get(cIndex).Id;
        carModeIdButton.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                IdData selected = (IdData) parent.getItemAtPosition(position);
                mCarModeId = selected.Id;
                cIndex = position;
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {}
        });

        // 屏幕ID
        List<IdData> DeviceTypeDataList = new ArrayList<>();
        DeviceTypeDataList.add(new IdData("前排屏", DeviceType.AC_DEVICE_IVI_ID));
        DeviceTypeDataList.add(new IdData("副驾屏", DeviceType.AC_DEVICE_FSE_ID));
        DeviceTypeDataList.add(new IdData("后排屏", DeviceType.AC_DEVICE_RSE_ID));
        DeviceTypeDataList.add(new IdData("后排左侧屏", DeviceType.RSE_LEFT_AREA_ID));
        DeviceTypeDataList.add(new IdData("后排右侧屏", DeviceType.RSE_RIGHT_AREA_ID));
        DeviceTypeDataList.add(new IdData("扶手屏", DeviceType.AC_DEVICE_RCS_ID));

        Spinner DeviceTypeButton = new Spinner(this);
        DeviceTypeButton.setLayoutParams(spinnerParams);
        DeviceTypeButton.setPadding(12, 12, 12, 12);
        DeviceTypeButton.setBackgroundResource(android.R.drawable.btn_default);

        ArrayAdapter<IdData> adapter2 = new ArrayAdapter<IdData>(
                this,
                android.R.layout.simple_spinner_item,
                DeviceTypeDataList
        ) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                TextView view = (TextView) super.getView(position, convertView, parent);
                view.setText(getItem(position).name);
                view.setGravity(Gravity.CENTER);
                return view;
            }

            @Override
            public View getDropDownView(int position, View convertView, ViewGroup parent) {
                TextView view = (TextView) super.getDropDownView(position, convertView, parent);
                view.setText(getItem(position).name);
                view.setGravity(Gravity.CENTER);
                return view;
            }
        };
        adapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        DeviceTypeButton.setAdapter(adapter2);
        DeviceTypeButton.setSelection(cIndex);
        mDeviceType = DeviceTypeDataList.get(cIndex).Id;
        DeviceTypeButton.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                IdData selected = (IdData) parent.getItemAtPosition(position);
                mDeviceType = selected.Id;
                cIndex = position;
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {}
        });

        // 第一行:两个下拉框
        LinearLayout firstRow = new LinearLayout(this);
        firstRow.setOrientation(LinearLayout.HORIZONTAL);
        firstRow.addView(carModeIdButton);
        firstRow.addView(DeviceTypeButton);
        buttonContainer.addView(firstRow);

        // 第二行:左舵和支持触摸按钮
        Button rudderButton = new Button(this);
        rudderButton.setText("左舵");
        rudderButton.setLayoutParams(spinnerParams);
        mLeftRudder = true;
        rudderButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Button button = (Button) v;
                mLeftRudder = !mLeftRudder;
                if (mLeftRudder) {
                    button.setText("左舵");
                } else {
                    button.setText("右舵");
                }
            }
        });

        Button touchButton = new Button(this);
        touchButton.setText("支持触摸");
        touchButton.setLayoutParams(spinnerParams);
        mSupportDoubleOpenSwitch = true;
        touchButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Button button = (Button) v;
                mSupportDoubleOpenSwitch = !mSupportDoubleOpenSwitch;
                if (mSupportDoubleOpenSwitch) {
                    button.setText("支持触摸");
                } else {
                    button.setText("不支持触摸");
                }
            }
        });

        LinearLayout secondRow = new LinearLayout(this);
        secondRow.setOrientation(LinearLayout.HORIZONTAL);
        secondRow.addView(rudderButton);
        secondRow.addView(touchButton);
        buttonContainer.addView(secondRow);

        // 第三行:两排和座椅风格按钮
        Button rowButton = new Button(this);
        rowButton.setText("两排");
        rowButton.setLayoutParams(spinnerParams);
        mIsThreeRow = false;
        rowButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Button button = (Button) v;
                mIsThreeRow = !mIsThreeRow;
                if (mIsThreeRow) {
                    button.setText("三排");
                } else {
                    button.setText("两排");
                }
            }
        });

        List<IdData> SeatStyleDataList = new ArrayList<>();
        SeatStyleDataList.add(new IdData("七座", 0));
        SeatStyleDataList.add(new IdData("六座", 2));

        Button SeatStyleButton = new Button(this);
        SeatStyleButton.setLayoutParams(spinnerParams);
        IdData sData = SeatStyleDataList.get(sIndex);
        SeatStyleButton.setText(sData.name);
        mSeatStyle = sData.Id;
        SeatStyleButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                sIndex++;
                sIndex = sIndex % SeatStyleDataList.size();
                IdData data = SeatStyleDataList.get(sIndex);
                Button button = (Button) v;
                button.setText(data.name);
                mSeatStyle = data.Id;
            }
        });

        LinearLayout thirdRow = new LinearLayout(this);
        thirdRow.setOrientation(LinearLayout.HORIZONTAL);
        thirdRow.addView(rowButton);
        thirdRow.addView(SeatStyleButton);
        buttonContainer.addView(thirdRow);

        // 第四行:RSE支持按钮
        Button supportRseButton = new Button(this);
        supportRseButton.setText("不支持RSE");
        supportRseButton.setLayoutParams(spinnerParams);
        mSupportRseScreen = false;
        supportRseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Button button = (Button) v;
                mSupportRseScreen = !mSupportRseScreen;
                if (mSupportRseScreen) {
                    button.setText("支持RSE");
                } else {
                    button.setText("不支持RSE");
                }
            }
        });

        Button startButton = new Button(this);
        startButton.setText("启动");
        startButton.setLayoutParams(new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.WRAP_CONTENT
        ));
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new Handler(Looper.getMainLooper()).post(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            ViewGroup rootView = findViewById(android.R.id.content);
                            if (mDeviceDataButtonLinearLayout != null) {
                                rootView.removeView(mDeviceDataButtonLinearLayout);
                            }
                            initEngine();
                        } catch (Exception e) {
                            throw e;
                        }
                    }
                });
            }
        });

        LinearLayout fourthRow = new LinearLayout(this);
        fourthRow.setOrientation(LinearLayout.HORIZONTAL);
        fourthRow.addView(supportRseButton);
        buttonContainer.addView(fourthRow);

        // 添加启动按钮
        buttonContainer.addView(startButton);

        ViewGroup rootView = findViewById(android.R.id.content);
        mDeviceDataButtonLinearLayout = buttonContainer;
        rootView.addView(buttonContainer);
    }

14点00分

2025年4月18日

  1. 截图还是用png格式,因为保留更多细节,而且也不是很大,不过1MB
  2. 周报
  3. 和罗导确认一下那个bug,详细描述一下是什么问题
  4. 修改login界面的选车与屏幕的样式--->end
  5. 统计车型,屏幕,分辨率
  6. git restore . //撤销工作区未add 的文件 git clean -dfx //删除未跟踪文件

13点26分

  1. 统计车型,屏幕,分辨率--->发现启动图这里好乱--->整理完毕
  2. 国内空调拆包ht_sz车型 file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/17793_develop_ht_sz_0408/

周报:
海外出包:

  1. 海外新增SF车型,修复海外SQ问题,出量产包
  2. 删除SF后排资源,分别出主干和量产包
  3. 新增海外SZ车型,修复海外SZ副驾驶屏幕左右黑边问题出主干包
    国内出包:
  4. 国内【HT】副驾屏UI位置调整 HT三厢扶手屏幕相机调整 HT25中排出风口调整 替换HT三厢扶手屏贴图 30系扶手屏车体图替换 SQ出风口优化 两厢更新副驾 出主干包,
  5. 出风口调整,出量产包
  6. 完成国内空调SQ和HT-SZ的拆包
  7. 新增HT25两厢0x188和0x18c 修复当车型ID未指定,而屏幕类型为副驾屏时的bug HT三厢扶手屏空调背景车体图偏大 出量产包

修改login界面的选车与屏幕的样式
统计车型,屏幕,分辨率,整理成表格

2025年4月17日

  1. 有个bug--->更启动图有关,解决bug一定要先本地复现--->修复

13点27分

  1. 确认了包体减小的原因--->end
  2. @杨凯(杨凯)今天微信群里提到国内空调主干版本的HT车型0X118 副驾屏启动,应用首次车型图显示不正确问题解决后。将如下修改点/需求合入量产出一个包,今天要发给BYD@卢修竹(Bambo)@武利(武利)
    1、新增HT25款车型的需求(中控+副驾),今天提的问题记得解决
    2、HT三厢扶手屏空调背景车体图偏大(上次只修改了主干版本,没有合入到量产)--->end
  3. 右舵
  4. 新车型UR
  5. 本地出apk--->不用了
import android.widget.Spinner;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import android.widget.AdapterView;

// 创建 Spinner
Spinner carModeSpinner = new Spinner(this);

// 设置布局参数
LinearLayout.LayoutParams spinnerParams = new LinearLayout.LayoutParams(
        LinearLayout.LayoutParams.MATCH_PARENT,  // 宽度匹配父容器
        LinearLayout.LayoutParams.WRAP_CONTENT   // 高度自适应
);
int marginVertical = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        8,  // 上下边距 12dp
        getResources().getDisplayMetrics()
);
int marginHorizontal = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        300,  // 左右边距 300dp(根据需求调整)
        getResources().getDisplayMetrics()
);
spinnerParams.setMargins(marginHorizontal, marginVertical, marginHorizontal, marginVertical);
carModeSpinner.setLayoutParams(spinnerParams);

// 设置内边距和背景
int padding = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        12,  // 内边距 12dp
        getResources().getDisplayMetrics()
);
carModeSpinner.setPadding(padding, padding, padding, padding);
carModeSpinner.setBackgroundResource(android.R.drawable.btn_default);

// 关键:自定义适配器,强制文本居中
ArrayAdapter<IdData> adapter = new ArrayAdapter<IdData>(
        this,
        android.R.layout.simple_spinner_item,
        CarModeIdDataList
) {
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        TextView view = (TextView) super.getView(position, convertView, parent);
        view.setText(getItem(position).name);
        view.setGravity(Gravity.CENTER); // 强制文本居中
        return view;
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        TextView view = (TextView) super.getDropDownView(position, convertView, parent);
        view.setText(getItem(position).name);
        view.setGravity(Gravity.CENTER); // 下拉列表文本居中
        return view;
    }
};
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
carModeSpinner.setAdapter(adapter);

// 设置选中项和监听器
carModeSpinner.setSelection(cIndex);
mCarModeId = CarModeIdDataList.get(cIndex).Id;
carModeSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        IdData selected = (IdData) parent.getItemAtPosition(position);
        mCarModeId = selected.Id;
        cIndex = position;
    }

    @Override
    public void onNothingSelected(AdapterView<?> parent) {}
});

// 添加到容器
buttonContainer.addView(carModeSpinner);

2025年4月16日

  1. SZ车型
  2. 更新SQ的资源,重新打包
    国内SQ拆包 file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/17605_develop_sq_0408/

13点27分

  1. SZ车型的吹风模式有点难度---->我太牛了,大进展,14点06分,貌似搞定
    UserModule/source/private/CarInteriorBeh.cpp: 443 初始--->牛毛线,啥也不用改,白做
  2. SZ重做,不能随意cherrypick,容易混乱
  3. 试试序列帧加速

2025年4月15日

  1. 更新HT两厢副驾图,然后出包,紧急--->好像又要出量产包--->end
  2. 看代码!--->控制风开关,拖拽,变色
  3. git fetch origin /git branch -r
  4. 海外SZ新需求 --->风口调节和车体图
  5. 拆包合并出量产包问题--->end 没有拆,直接合入出量产包了,又加了吹风模式,拆除HT是因为怕有问题,笑话

13点31分

  1. SQHD出风口风量小,貌似之前已经解决了--->测试乌龙
  2. 出量产包
    git cherry-pick A^..B 包含A的连续commit
    直接cherry-pick merge--->但是没有独立的commit记录---->对于多个commit这样好
  3. SZ是单独mask

2025年4月14日 周一

10点41分

  1. 出国外空调量产包---->主干包只能在develop分支出,量产包只能在release分支出,一般出量产包不着急/量产分支,这个要等我们的主干版本他们验证ok,上他们量产线后,在那个版本的节点上拉出来一个分支,命名为量产分支--->end
  2. 要更新国内主干包的出包记录--->有一个启动图有问题,扶手屏的,--->分辨率不一致原因,确认扶手屏分辨率--->这貌似不是个问题,选错车型了,那么别的车型有扶手屏吗?没有的话,选择了会怎么样
    16点52分 改变了缩放模式,选别的车得有一个场景,不然会崩溃----end
  3. 211车型扶手屏的放大有黑边mask这个
  4. 海外SZ车型有崩溃问题--->引擎问题
  5. 反复拉起测试内存是否有上涨???---->11点35分 分析这个--->引擎侧的问题,老问题end

13点44分

  1. 海外空调测试excel里最后一点,反复拉起测试内存是否有上涨,这个是引擎的问题,老问题了,不用管听罗导的意思
  2. 如果遇到反复拉起测试,有黑屏,也是一样,引擎的老问题
  3. 移除SF后排资源,出主干包---end

只有三厢有头枕屏,扶手屏

  1. 看看遮罩Mask---->18点51分,大概找见遮罩的位置了
    UserModule\source\private\CarInteriorBeh.cpp#694

2025年4月11日

  1. 周报
    1. 国内空调新增HT两款车型HFEF,已完成并出主干包和压测包,测试通过
    2. 解决国内空调SQ和HT车型bug
    3. 解决海外SF车型和SQ车型空调的bug
    4. 完成国内空调SQ车型拆包
      下周
    5. 完成国内空调SZ和HT车型拆包
    6. 国内空调新增QZ车型
    7. 国内HT车型扶手屏启动图会放大问题
  2. 国内SQ问题
  3. 中英文切换黑屏?--->解决不了,和我无关

13点29分

  1. 出包
    难喽!!

  2. 国内空调可以通过这两个关键字查看启动时间海外没有做,需不需要加上

2025年4月10日

  1. 海外SF出包,主干和压测,要记录---->end
    • 逐渐把握节奏,更新了周一的国内出包记录,至于主干or量产,还是未知--->新功能都是出主干包(可以debug),然后去测,测完交给BYD,等BYD说没问题,可以发量产包,就再发一个量产包,如果量产包又出了问题,就修,再出修完的量产包
    • 出压测包的时候,改动Java代码在Android studio内改
  2. qz,新引擎,cmake--->不一定做,不要 拖着
	gw::render::GMaterial::CastTo<gw::render::GUnlitTextureMaterial>(frontBg->Children()[0]->CastTo<PlaneGeometry>()->GetMaterial())->SetTextureFromFile("UserResources/SZ_Mask/SZ_FrontRow.jpg");
	gw::render::GMaterial::CastTo<gw::render::GUnlitTextureMaterial>(midBg->Children()[0]->CastTo<PlaneGeometry>()->GetMaterial())->SetTextureFromFile("UserResources/SZ_Mask/SZ_RockRow.jpg");
	gw::render::GMaterial::CastTo<gw::render::GUnlitTextureMaterial>(backBg->Children()[0]->CastTo<PlaneGeometry>()->GetMaterial())->SetTextureFromFile("UserResources/SZ_Mask/SZ_backRow.jpg");
	//用于为场景中的不同背景平面设置对应的纹理贴图
	//类型安全转换:将通用材质(GMaterial)转换为无光照纹理材质(GUnlitTextureMaterial),确保支持纹理设置。

10点52分

  1. HT25副驾驶的图有修改,需要更新--->end 更新副驾启动图

13点27分

  1. 安装了虚拟机---->也就蓝叠强一些,但还是不行
  2. 国内SQ拆包 file://docs.gritworld.cn/Company/DevelopmentSH/gm-cicd/byd_airconditioner/17232_develop_sq_0408/

35fe5032696e291addffed370da9eb431a7078ca 1.7
34fb78c0c5f6a21a3c0438b253582c2d872b5641 1.14-2
c8497bdda673b1b1fbc7e62efffa7992f6f91ab5 1.14-1
3880d86aa5e0792d8a89685765dcca186fe69d58 1.21

  1. 海外SQ年久失修,需要和国内的一样,用cherry-pick拿过来修改,很方便,

    • git cherry-pick --abort 有冲突中止
    • git cherry-pick --continue 解决完冲突还卡在picking状态,
    • git cherry-pick 完直接就是commit完了,毕竟是直接拿过来commit
  2. 测试问题

海外SF 2个 --->end
SQ 3个 --->已解决
国内 SQ 一个
---都是美术

2025年4月9日

10点36分

  1. 帮忙python脚本 end ---> 学习一下

  2. 海外SF出包给测试--->end

    1. 14点18分 出了大问题 crash了---->Copy_Libs这个脚本使用了旧的库,删除就好了
    2. 又测出问题了,恨测试--->待修复,貌似是美术的
      1. 风口加注释,一类一行,先确认一下
    3. 国内HT也有问题,序列帧切换--->end 已没问题
  3. 昨天输出的国内空调主干包还需要更新下HT 25款的副驾车体图 --->end 貌似已经解决

  4. 闲了就看代码,分辨率那个设置不起作用啊

    1. SF (25.6, 14.4, 1) 16:9
    2. SQ HT SZ (25.6, 16.0, 1) 16:10

2025年4月8日

  1. 正则表达式
  2. 国外SF bug修复,代码修改----> 未做,但好像是改完了,就是那个恶心的FindAllWindMesh()需要搞明白--->验证

11点07分

  1. 看这个,解决FindAllWindMesh()
  2. 新需求,需评估时间---->0x011A QZH 25款混动
    • 几个功能点还需要再细看,还不是很清楚---->目前没有啥新功能点,还是一样的无动力发动机,和SQ一样,只不过可能需要在新引擎上做
//4.2海外SF测试问题

m2066-----吹热风情况下,除雾风脚部风和左右侧风的颜色不一样   end
k2067-----SF前排后排互切的过程中是黑屏,没有过场动画  end me viewchangeplane
2068-----后排吹风风量调节小于7的情况下,可以看到有一个黑色阴影方框  xx
m2069---- 只打开前排一侧出风口时,可以看到靠近出风口的位置也会亮起   end
2070----后排出风的范围比实际的出风口的范围大  xx
k2071----刚进入SF空调时,会短暂出现一个白框     end  me  启动图
m2072----除雾风左侧靠近车框的位置有一条黑线,右侧没有 end 待验证
2073----吹脚风外侧黑色的范围很大,没有过渡效果  xx

16点13分

  1. 拆包 ---->新任务 原本147mb

    1. fatal: 'origin/develop-HT-SZ' is not a commit and a branch 'develop-HT-SZ' cannot be created from it----->在远程建了新分支,要更新到本地,实际上,git仓库分为本地仓库和远程仓库,我们用checkout命令是从本地仓库中找要检出的分支的。本地仓库只有在进行网络请求时才会跟远程仓库交互,比如fetch命令。
      所以要git fetch origin 和 git remote update origin --prune
  2. 又是学习git的一天

2025年4月7日 周一

  1. 出包。新需求增加春季新款HT车型----> 完成
  2. viewchangeplane的开关在海外上,貌似国内也会加--->加上了

14点35分

  1. 看是如何加的风口---->还是不明所以,那个改名字的没用到啊,数组加载就生效了--->2025年4月10日13点31分,目前结论是有一套固定的加载的,但是防止漏掉,所以再筛选一次

2025年4月3日

  1. 加一个开关判断 对于是否切换前后排---->试一下SQ和HT有无问题11点17分
  2. 加一下虚拟机
  3. 本地出基于新引擎的包,给测试测---->测完通过后,修改CI中引擎的压缩包,用于自动出包
  4. 新需求HT的

14点30分
三件事

  1. 出一个sq的量产包,不确定要不要拉新分支cherry-pick,写进出包记录
  2. 国内all-0403出一个量产包,写进出包记录----->第1点和第2点出了一个包
  3. 国外sfbug修复,代码修改---->未做

2025年4月2日

  1. 合入 出包 更新了答疑中的出包流程和出包记录

13点43分 完成

在新增SF车型前拉了一个新的海外空调分支release-oversea,用于cherry-pick

15点46分
切换前后排为毛是黑屏一下? 之前是好的,序列帧没设置,设置了还是有问题,记得一开始就是这样,跟引擎开关无关 --->有关,是一个viewchange

2025年4月1日

void OutletBeh::SetWindStrength(int state)
{
	mWindState = state;
	mOpacity = 0.4 + 0.6 / 6 * (state - 1.0);
	mAlphaConversionRange = 2.5 - (state - 1.0) * (2.25 / 6.0);
	mStartOpactiy = GetComponent()->GetOpacity();
	mTimeLineWindStrength.PlayFromStart();
	if (mCarType != CAR_TYPE::SQ && mCarType != CAR_TYPE::SF)//SQ不需要风速效果
	{
		if (mWindMeshVector.empty() == false && mWindMeshVector[0]->Children()[0]->Children().empty() == false)
		{
			mStartAlphaConversionRange = gw::render::GMaterial::CastTo<gw::render::GPhysicalMaterial>(mWindMeshVector[0]->Children()[0]->Children()[0]->CastTo<Mesh>()->GetMaterial())->GetAlphaConversionRange();
		}
		if (mWindComp != nullptr)
		{
			for (auto comp : mWindMeshVector)
			{
				std::string materialName = comp->ComponentName();
				if (!comp->Children()[0]->Children().empty())
				{
					auto pbr = gw::render::GMaterial::CastTo<gw::render::GPhysicalMaterial>(comp->Children()[0]->Children()[0]->CastTo<Mesh>()->GetMaterial());
					if (pbr == nullptr) continue;
					pbr->EnableAlphaConversion(true);
					pbr->SetForceTransparent(true);
					pbr->SetAlphaConversionIntensity(1.5);
					if (pbr->GetUTransformFunction("BASE") == gw::render::EUVTransformFunction::TILING_TRANSLATE &&
						pbr->GetVTransformFunction("BASE") == gw::render::EUVTransformFunction::TILING_TRANSLATE)
					{
						float speedV = mWindPbrMatUVSpeedMap[materialName].y * (0.4 + 0.6 / 6 * (state - 1.0));
						pbr->SetVTransform("BASE", gw::render::EUVTransformFunction::TILING_TRANSLATE, std::vector<float>{ pbr->GetVFuncParam("BASE")[0], speedV, 0.0, 0.0 });
					}
				}
			}
		}
	}
	if (mTreeComp == nullptr || mTreeComp->Children().empty())
	{
		SetVFXWindStrength(mTreeComp, mStartDuration2);
	}
	else
	{
		for (auto comp : mTreeComp->Children())
		{
			SetVFXWindStrength(comp, mStartDuration2);
		}
	}
	if (mAnionComp == nullptr || mAnionComp->Children().empty())
	{
		SetVFXWindStrength(mAnionComp, mStartDuration1);
	}
	else
	{
		for (auto comp : mAnionComp->Children())
		{
			SetVFXWindStrength(comp, mStartDuration1);
		}
	}
	if (mClickArea != nullptr)
	{
		mClickArea->SetScale((0.6 + 0.4 / 6 * (state - 1.0)) * mClickAreaX, mClickArea->GetScale().y, mClickArea->GetScale().z);
	}
}

10点00分

  1. 填完工时
  2. 基本梳理完设置风力大小的地方,有点复杂,颜色,透明度,材质变换

14点32分

  1. 出风模式超!!!--->没区别的原因1. 是否有限制被设置上?之前确定被设置上了,但是不可能仅仅就是设置完ID就没了吧
    if (mRotateComp == nullptr) return; 这个生效所以全部return了
    SQ没有旋转相关的东西,所以,他的mRotateComp是nullptr
    16点54分 还在看出风口模式,严重怀疑没做---->它的作用是限制手动拖风的范围,角度

  2. 方向调节1和2也是HT才有,但是是如何排除SQ的,--->很明显!而且是怎么实现的好神奇??

mTimeLineAutoAngleY.SetTotalTime(time); //设置时间
mTimeLineAutoAngleY.PlayFromStart(); //启动时间线
mTargetY = std::clamp(angle * -5, (float)mAirOutletAngle[3] * -5, (float)mAirOutletAngle[2] * -5);
mStartY = mTotalY;

//开始和结束用在SetCurrentAngleY,因为打断点的时候,先断在set autoangleY,继续则断在了SetCurrentAngleY这,很说明问题

  1. HT修改,但貌似不是空调,也改的不多

2025年3月31日一

在上海第一个工作日

上午配置电脑 仓库啥的
(报销不急,问财务)

13点40分

  1. 开始执行在台式上,看有什么问题

  2. 基本都满足条件了,git曹,还有遗留吹风模式,出风口模式

 //SF
        mImagePathMap.put(String.valueOf(0x011C) ,"Data/UserResources/SF/SFStart.jpg");
        mImagePathMap.put(String.valueOf(0x0128) ,"Data/UserResources/SF/SFStart.jpg");

CarModeIdDataList.add(new IdData("海外SF 0x011C", 0x011C));
CarModeIdDataList.add(new IdData("海外SF 0x0128", 0x0128));

出风口模式,还有风量调节,看到根

3.20入职

一、 海外HT出风口角度调节---->乌龙,已于要求的一致 endtime3.27
二、 增加新车型SF--->在测试 4.2
三、 节后HTEF和HTHF

posted @ 2025-03-31 13:34  無碍  阅读(51)  评论(0)    收藏  举报