【04】AI輔助編程完整的安卓二次商業實戰-尋找修改替換新UI首頁圖標-菜單圖標-消息列表圖標-優雅草伊凡

【04】AI輔助編程完整的安卓二次商業實戰-尋找修改替換新UI首頁圖標-菜單圖標-消息列表圖標-優雅草伊凡

引言

本次二開布局沒有變,但是下一次整體布局會有變,不過本次開發發現朋友圈跳轉功能的流程步驟也做了一定的變化。原生項目復雜就復雜于就算一個顏色的改動可能都比較麻煩,不像普通web項目或者vue項目,其次原生項目安卓Android的環境配置是很復雜的,很多人 第一步可以搞一周 甚至一個月都搞不成功,再次之前說了可以用trae輔助我們編程,但是真正的開發和調試還是得Android studio 離開Android studio 原生安卓項目也是沒法運行的,至少trae滿足不了,vs要滿足也比較麻煩,本篇改顏色和主頁圖標,本項目代碼 毫不夸張的說 就是WhatsApp的初期代碼,歷史大概有15年了。

項目技術棧

優雅草蜻蜓I即時通訊水銀版 - 技術棧列表

概述:本項目是一個基于微服務架構的現代即時通訊解決方案。2025年8月進行了大規模技術升級與重構,并于8-9月期間集中進行兼容性調整與Bug修復,旨在提升系統穩定性、可維護性和未來擴展性。


一、 移動客戶端 (Android)
  • 開發語言: Java
  • 開發模式: 原生開發
  • 兼容性底座: 最低支持 Android API 5 (Android 5.0)
  • 核心框架升級:
    • 項目已從原生的 Android Support 庫全面升級到 AndroidX,以獲得更好的性能和維護性。
  • 推送集成:
    • 集成 極光推送 (JPush) SDK,用于處理應用在后臺或進程被殺時的消息離線推送。

二、 服務端 (Backend)
  • 核心語言: Java
  • 主要框架: Spring Boot
    • 用于構建和編排所有業務邏輯和業務流程,提供RESTful API接口,是連接各個微服務的核心樞紐。
  • JDK 版本:
    • 當前版本: JDK 1.8
    • 未來計劃: 已有明確計劃升級至 JDK 17(因時間安排暫未執行,旨在獲得新的語言特性和性能提升)。

三、 微服務與基礎設施 (Microservices & Infrastructure)

本次升級的核心是將單體服務拆解為獨立、可擴展的微服務。

  1. 即時通訊服務:
    • 協議: XMPP (Extensible Messaging and Presence Protocol)
    • 實現: 獨立部署的 XMPP 服務,負責最核心的點對點、群組聊天等實時消息分發。
  1. 消息回執服務:
    • 實現: Tigase Server 7.1.3
    • 職責: 專門處理消息的已發送、已送達、已閱讀等狀態回執,確保消息的可達性。
  1. 消息隊列服務:
    • 組件: RocketMQ 4.3.2 (rocketmq-all-4.3.2)
    • 職責: 處理服務間的異步通信、流量削峰、任務隊列等,保證系統的高可用和高性能。
  1. 上傳服務:
    • 實現: 獨立制作的 Upload 服務
    • 職責: 專門處理圖片、文件、語音等附件的上傳、存儲和管理,與主業務邏輯解耦。
  1. 推送服務:
    • 實現: 獨立制作的 Push 服務
    • 集成: 內部封裝了 極光推送 SDK,負責將消息通過系統通道推送給Android客戶端。
  1. 緩存與隊列服務:
    • 組件: Redis
    • 職責: 用作高速緩存,提升訪問速度;同時處理臨時消息隊列和會話狀態存儲。

四、 數據存儲 (Data Storage)
  1. 主數據庫:
    • 組件: MongoDB
    • 版本升級: 已從舊的 3.4.0 成功升級至 4.0 版本。
    • 用途: 存儲非結構化的聊天記錄、用戶動態、群組信息等海量數據,利用其靈活的Schema特性適應IM業務的快速迭代。
  1. 關系型數據庫:
    • 可能選項: MySQL8.0 下一步做改進的。
    • 可能用途: 存儲用戶賬戶、好友關系、群組列表等結構化數據。

總結與技術亮點
  • 架構現代化: 從可能存在的單體架構成功轉型為微服務架構,服務間通過 RocketMQ 和 HTTP API 進行通信,解耦徹底。
  • 技術債務清理: 積極處理歷史技術債務,包括 AndroidX 遷移MongoDB 大版本升級,為未來開發鋪平道路。
  • 專業化分工: 每個核心功能(通訊、上傳、推送、回執)都由獨立服務承擔,職責單一,更易于擴展、部署和故障排查。
  • 成熟組件選型: 選用 RocketMQ, Redis, Tigase 等經過大規模實踐驗證的中間件,保證了系統底層的穩定性和可靠性。
  • 明確的發展規劃: 已有清晰的 JDK 17 升級計劃,顯示出團隊對技術演進的前瞻性。

詳細步驟解析

上一篇我們看了 資源管理器,但是沒有把內容列出來,

本項目中的圖片靜態資源主要存儲在以下位置:

  1. 1.
    mipmap系列目錄 :
    • 主要用于存放應用圖標和啟動相關圖標,按不同屏幕分辨率分類
    • 具體位置: g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\mipmap-xxx (包括hdpi、mdpi、xhdpi、xxhdpi、xxxhdpi等)
    • 包含內容:應用功能圖標、底部導航欄圖標、用戶頭像圖標等多種UI圖標資源
  1. 2.
    drawable系列目錄 :
    • 主要用于存放各種界面元素的圖片資源,同樣按不同屏幕分辨率分類
    • 具體位置: g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\drawable-xxx (包括hdpi、mdpi、xhdpi、xxhdpi、xxxhdpi等)
    • 包含內容:聊天背景圖片、表情圖片、按鈕圖標、文件類型圖標、視頻控制圖標等
  1. 3.
    drawable目錄 :
    • 主要用于存放XML格式的drawable資源定義文件
    • 具體位置: g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\drawable
    • 包含內容:形狀定義(如圓角矩形、圓形)、狀態選擇器、漸變背景等XML配置資源

經過檢索查看了 資源所在目錄,

然后我們目前先來改首頁底部的四個圖標,我們需要查看這些 圖標 到底是代碼直接寫的 還是用的圖片,因為原生的話也有可能直接畫的。

其次把UI本頁的切圖全部拿到先

經過研究查看,四個菜單欄圖標是圖片實現方式,那就很好辦了

底部四個菜單欄圖標的實現方式

通過查看代碼,我已了解到底部四個菜單欄圖標(消息、聯系、發現、我的)的實現方式,以下是詳細說明:

實現架構

  1. 1.
    基礎布局實現
    • 使用 RadioGroup 和 RadioButton 組件構建底部導航欄
    • 布局文件: layout_main_footbar.xml
    • 包含四個可見的 RadioButton ,分別對應四個菜單項
  1. 2.
    樣式定義
    • 應用 SkMainTabStyle 樣式統一控制按鈕外觀
    • 樣式文件: styles.xml
    • 樣式設置包括寬度、高度、內邊距、背景、文本顏色和大小等屬性

圖標實現方式

    • 答案:是的,四個圖標都是使用圖片實現的。

具體實現細節:

  1. 1.
    圖片資源引用
    • 每個菜單項圖標通過 drawableTop 屬性引用對應的 drawable 資源
    • 四個圖標分別引用 tab_chat_normal_bg 、 tab_group_normal_bg 、 tab_find_normal_bg 和 tab_my_normal_bg
  1. 2.
    狀態切換機制
    • 每個圖標都使用 selector 選擇器文件定義不同狀態的顯示
    • 例如 tab_chat_normal_bg.xml 中定義了兩種狀態:
<selector 
xmlns:android="http://schemas.
android.com/apk/res/android"><item android:drawable="@mipmap/tab_chat_new" android:state_checked="true" android:state_enabled="true" /><item android:drawable="@mipmap/tab_chat_normal_nor_new"/>
</selector>
  1. 3.
    圖片資源存儲
    • 圖標圖片資源存儲在 mipmap 目錄下
    • 每個圖標有兩種狀態的圖片文件:
      • 選中狀態: tab_chat_new.png 、 tab_group_new.png 、 tab_find_new.png 、 tab_my_new.png
      • 未選中狀態: tab_chat_normal_nor_new.png 、 tab_group_normal_nor_new.png 、 tab_find_normal_nor_new.png 、 tab_my_normal_nor_new.png

通知指示器

  • 每個菜單項旁邊都有一個用于顯示通知數量的 TextView
  • 這些指示器默認是不可見的( android:visibility=”invisible” ),可以通過代碼動態顯示和設置數字

實現特點

  1. 1.
    使用原生組件 :利用 Android 原生的 RadioGroup 和 RadioButton 實現底部導航欄
  2. 2.
    圖片切換機制 :通過 selector 實現選中和未選中狀態的圖標切換
  3. 3.
    樣式統一管理 :使用 SkMainTabStyle 統一管理所有標簽按鈕的樣式
  4. 4.
    通知功能支持 :內置通知數量顯示功能
    這種實現方式是 Android 應用中常見的底部導航欄實現方案,具有良好的兼容性和易用性。

找到后開始替換,我用一個簡單的方法對應命名到新版UI切圖復制粘貼 覆蓋

未選中的圖標圖 在另外的頁面才有,通訊錄頁面的切圖我們需要也下載下來。

git pull 拉了一些同事給的兼容性調整

重新編譯后發現效果已經呈現

不過也有警告

注: G:\clone\2025qingting—android\imagepicker\src\main\java\com\xzh\imagepicker\activity\ImagePreActivity.java使用或覆蓋了已過時的 API。
注: 有關詳細信息, 請使用 -Xlint:deprecation 重新編譯。

這個只能后面繼續處理

現在我們繼續替換聯系頁面的4個圖標,這個需要找一下,怎么找呢

搜索聯系頁面的相關文件,找到包含新朋友、標簽、商務號、黑名單按鈕的布局文件。

搜索聯系頁面的布局文件,找到包含這四個按鈕的界面定義。

在工作區搜索 ‘contacts|fragment_contacts|activity_contacts’

  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\pop_at_room_member.xml 31 - 31
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\item_recently_contacts.xml 21 - 21
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\item_recently_contacts.xml 29 - 29
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\item_course_contacts.xml 9 - 9
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\item_course_contacts.xml 16 - 16
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\item_course_contacts.xml 21 - 21
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\fragment_contacts.xml 263 - 263
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\fragment_contacts.xml 264 - 264
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\activity_search_friend.xml 38 - 38
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\activity_person_setting.xml 36 - 36

查看聯系頁面的主要布局文件,找到包含四個按鈕的部分。

skWeiChatBaidu\src\main\res\layout\fragment_contacts.xml 1 - 300

查找這四個按鈕引用的圖片資源文件的具體路徑。

在工作區搜索 ‘icon_xinhaoyou|icon_biaoqian|icon_shangwuhao|icon_heimingdan’

  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\row_sort_gongzhonghao.xml 15 - 15
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\row_sort_friend_qun.xml 24 - 24
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\row_set_label_select.xml 28 - 28
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\row_set_label_select.xml 37 - 37
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\row_select_label.xml 28 - 28
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\row_select_label.xml

通過這里查看到路徑了

在“聯系”菜單頁面上方的四個按鈕圖片及其路徑如下:

  1. 1.
    新朋友按鈕:
    • 圖片名稱:icon_xinhaoyou.png
    • 路徑:g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\mipmap-xhdpi\icon_xinhaoyou.png
  1. 2.
    標簽按鈕:
    • 圖片名稱:icon_biaoqian.png
    • 路徑:g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\mipmap-xhdpi\icon_biaoqian.png
  1. 3.
    商務號按鈕:
    • 圖片名稱:icon_shangwuhao.png
    • 路徑:g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\mipmap-xhdpi\icon_shangwuhao.png
  1. 4.
    黑名單按鈕:
    • 圖片名稱:icon_heimingdan.png
    • 路徑:g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\mipmap-xhdpi\icon_heimingdan.png

像之前 一樣替換即可,

找聯系頁面的這個地方布局稍微有點變動但是改動不是很大

具體操作

另外這個的尺寸不對我們按照設計圖

是20pt左右的寬度,我們先下載切圖選最小尺寸的。


這個首先我們還是要找出圖片地址先替換圖片,

搜索消息頁面的主布局文件,找到右上角按鈕的實現。

在工作區搜索 ‘fragment_message|activity_message|layout_message_main’

找不到結果

搜索消息頁面相關的Java實現文件,找到右上角按鈕的代碼。

在工作區搜索 ‘消息頁面 右上角按鈕 功能菜單 加好友 掃一掃 收款’

  • MessageFragment.java 305 - 328
  • AddContactsActivity.java 434 - 448
  • InstantMessageConfirmNew.java 31 - 43
  • SelectNewContactsActivity.java 39 - 58
  • AddFriendActivity.java 167 - 177
  • XChatMessageListener.java 1936 - 1950
  • AddContactsActivity.java 349 - 360
  • SelectContactsActivity.java 670 - 688
  • SelectFriendsActivity.java 182 - 212
  • BasicInfoActivity.java 1136 - 1160
  • ChatActivity.java 516 - 540
  • ChatContentView.java 714 - 731
  • PaymentReceiptMoneyActivity.java 37 - 54
  • SendContactsActivity.java 131 - 144

在工作區搜索 ‘receipt_payment|scanning|add_friends|create_group’

  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rTW\strings.xml 388 - 388
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rTW\strings.xml 389 - 389
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rTW\strings.xml 390 - 390
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rTW\strings.xml 676 - 676
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rTW\strings.xml 1153 - 1153
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rTW\strings.xml 1183 - 1183
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rHK\strings.xml 391 - 391
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rHK\strings.xml 392 - 392
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rHK\strings.xml 393 - 393
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rHK\strings.xml 679 - 679
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rHK\strings.xml 1156 - 1156
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-zh-rHK\strings.xml 1186 - 1186
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-night\strings.xml 365 - 365
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-night\strings.xml 366 - 366
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-night\strings.xml 367 - 367
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-night\strings.xml 658 - 658
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-night\strings.xml 1136 - 1136
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-night\strings.xml 1166 - 1166
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-en\strings.xml 270 - 270
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-en\strings.xml 277 - 277
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-en\strings.xml 278 - 278
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-en\strings.xml 351 - 351
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-en\strings.xml 658 - 658
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-en\strings.xml 1134 - 1134
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values-en\strings.xml 1183 - 1183
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values\strings.xml 369 - 369
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values\strings.xml 370 - 370
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values\strings.xml 371 - 371
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values\strings.xml 662 - 662
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values\strings.xml 1140 - 1140
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\values\strings.xml 1170 - 1170
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\fragment_square.xml 140 - 140
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\item_sk_pay_receipt.xml 79 - 79
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\item_sk_pay_receipt.xml 84 - 84
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\popu_message.xml 23 - 23
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\popu_message.xml 47 - 47
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\popu_message.xml 65 - 65
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\popu_message.xml 72 - 72
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\popu_message.xml 87 - 87
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\popu_message.xml 105 - 105
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\popu_message.xml 121 - 121
  • g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\layout\activity_add_friend.xml 134 - 134

查看消息頁面右上角按鈕彈出菜單的布局文件,找到四個圖標的資源引用。

上面java邏輯要找到如何處理這個,從哪里引用基本上要找到這里

/*** 掃描他人付款碼,彈起收款界面*/
public class PaymentReceiptMoneyActivity extends BaseActivity {private String money, words;private TextView mTransferDescTv, mTransferDescClickTv;private String paymentCode;private EditText et_transfer;private KeyBoad keyBoad;private boolean isUiCreat = false;private ShouKuan mReceipt;private String content = "";private UserDefinedCircleImageView mAvatarIv;private TextView mNameTv;

skWeiChatBaidu\src\main\res\layout\popu_message.xml 1 - 150

查找這四個圖標在mipmap目錄中的具體路徑。

在工作區搜索 ‘icon_erweima_shoukuan|icon_saoyisao|icon_add_haoyou|icon_chuangjian_qunliao’

查看mipmap-xhdpi目錄中這四個圖標的具體路徑。

2025qingting—android\skWeiChatBaidu\src\main\res\mipmap-xhdpi

消息頁面右上角按鈕點擊后顯示的四個圖標的具體路徑如下:

  1. 1.
    收/付款圖標:位于 g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\mipmap-xhdpi\icon_erweima_shoukuan.png
  2. 2.
    掃一掃圖標:位于 g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\mipmap-xhdpi\icon_saoyisao.png
  3. 3.
    加好友圖標:位于 g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\mipmap-xhdpi\icon_add_haoyou.png
  4. 4.
    發起群聊圖標:位于 g:\clone\2025qingting—android\skWeiChatBaidu\src\main\res\mipmap-xhdpi\icon_chuangjian_qunliao.png
    這些圖標在 popu_message.xml 布局文件中通過 @mipmap/ 引用,并在 MessageFragment.java 中由右上角按鈕的點擊事件觸發顯示。

替換用小尺寸

我們再次運行看看效果,

效果已經出來了就是布局有限問題

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/97884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/97884.shtml
英文地址,請注明出處:http://en.pswp.cn/web/97884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

龍蜥8.10中spark各種集群及單機模式的搭建spark3.5.6(基于hadoop3.3.6集群)

先說最終的訪問端口&#xff0c;如我這里ip為172.20.94.37、172.20.94.38、172.20.94.39&#xff0c;主機名分別為&#xff1a;hadoop37、hadoop38、hadoop39. 最終訪問&#xff08;默認端口&#xff09;&#xff1a; hadoop webui 172.20.94.37:9870 hdfs 端口 8020 yarn 172.…

關于我重新學習 react 的第一遍

今天是25年9月11號&#xff0c;很久很久沒有學習前端知識了&#xff0c;坦誠來說還清楚記得在大學里因為前端技術第一次獲獎的心情&#xff0c;也清晰記得寫完第一篇博客后的心情&#xff0c;工作和運動給我最大程度的成就感。 打破自己 重新開始 完全地 版本一 25.9.11 文章目…

第2課:Agent系統架構與設計模式

第2課&#xff1a;Agent系統架構與設計模式 課程目標 理解Agent的基本概念和特性掌握多Agent系統的設計模式學習Agent通信協議和消息傳遞實踐創建簡單的Agent框架 課程內容 2.1 Agent基礎概念 什么是Agent&#xff1f; Agent是一個具有自主性、反應性、社會性和主動性的計…

Day42 51單片機中斷系統與8×8 LED點陣掃描顯示

day42 51單片機中斷系統與88 LED點陣掃描顯示一、51單片機引腳位操作 —— sbit 關鍵字 作用 sbit 是專用于 51 單片機架構的 C 語言擴展關鍵字&#xff0c;用于定義特殊功能寄存器&#xff08;SFR&#xff09;中的某一位&#xff0c;從而實現對單個 I/O 引腳的直接位操作。 示…

差分: 模板+題目

題目&#xff1a;【模板】差分 應用場景&#xff1a;快速解決將某一個區間所有元素加上 “一個數” 的操作。 第一步&#xff0c;預處理差分數組。 f[i] 表示&#xff1a;當前元素與前一個元素的差值 a[i] - a[i-1]; 但在題目中&#xff0c;我們其實可以不用到a[]這個數組…

GD32 Timer+ADC多通道+DMA+PWM調試記錄

本例記錄使用GD32307C開發板&#xff0c;實現以內部Timer1 CH1為觸發源&#xff0c;觸發ADC0的兩個通道&#xff0c;進行并行非連續采樣&#xff0c;病通過DMA傳輸采樣結果。同時輸出PWM&#xff0c;用來檢測Timer1 CH1的觸發周期。下面介紹具體實現過程&#xff1a;1. gpio初始…

阻塞 IO為什么叫BIO,非阻塞IO為什么叫NIO,異步IO為什么叫AIO

IOIO的核心就是數據傳輸&#xff0c;也就是程序與外部設備之間進行傳輸&#xff0c;通過IO的核心可以分為&#xff0c;文件IO和網絡IO文件IO交互的對象就是本地存儲設備&#xff0c;比方說讀寫本地文件。網絡IO交互的對象就是網絡設備&#xff0c;核心的應用場景就是網絡通信。…

10分鐘了解什么是多模態大模型

10分鐘了解什么是多模態大模型&#xff08;MM-LLMs&#xff09; 1. 什么是多模態 Multimodality 多模態&#xff08;Multimodality&#xff09;是指集成和處理兩種或兩種以上不同類型的信息或數據的方法和技術。在機器學習和人工智能領域&#xff0c;多模態涉及的數據類型通常…

通過DSL生成Jenkins流水線

代碼化管理 Jenkins 流水線&#xff08;Infrastructure as Code&#xff09; 版本控制&#xff1a;DSL 腳本可以像代碼一樣存入 Git、GitLab 等版本控制系統&#xff0c;所有任務配置的變更都有提交記錄&#xff0c;便于追溯歷史、回滾錯誤。協作效率&#xff1a;團隊成員可以通…

信號量主要API及綜合應用

1.信號量概述信號量是一個底層核心模塊【int】類型變量&#xff0c;記錄當前信號量數據。信號量 P 操作 (sem_wait)線程檢測對應信號量底層 int 數據數值&#xff0c;如果大于 0&#xff0c;當前線程獲得 CPU 執行權&#xff0c;同時將信號量底層 int 數據-1 操作。如果底層數據…

工業自動化領域的“超級跑車”:西門子TDC系統深度解析與實戰架構

工業自動化領域的“超級跑車”&#xff1a;西門子TDC系統深度解析與實戰架構 文章目錄 工業自動化領域的“超級跑車”&#xff1a;西門子TDC系統深度解析與實戰架構引言&#xff1a;當普通PLC遇到性能瓶頸第一章&#xff1a;認識TDC——它不是簡單的“大型PLC”1.1 TDC究竟是什…

MySQL高階查詢語句與視圖實戰指南

MySQL高階查詢語句與視圖實戰指南 文章目錄MySQL高階查詢語句與視圖實戰指南一、常用高階查詢技巧1. 按關鍵字排序&#xff08;ORDER BY&#xff09;基礎用法進階用法&#xff1a;多字段排序條件過濾2. 區間判斷與去重&#xff08;AND/OR DISTINCT&#xff09;區間判斷&#x…

解決Pytest參數化測試中文顯示亂碼問題:兩種高效方法

在使用Pytest進行參數化測試時&#xff0c;許多開發者都會遇到一個常見但令人頭疼的問題&#xff1a;當測試用例的ids參數包含中文字符時&#xff0c;控制臺輸出會出現亂碼。這不僅影響了測試報告的可讀性&#xff0c;也給測試結果的分析帶來了困難。本文將深入探討這個問題&am…

基于SpringBoot的校園流浪動物救助平臺【spring boot實戰項目、Java畢設、Java項目、Java實戰】

&#x1f496;&#x1f496;作者&#xff1a;計算機畢業設計小途 &#x1f499;&#x1f499;個人簡介&#xff1a;曾長期從事計算機專業培訓教學&#xff0c;本人也熱愛上課教學&#xff0c;語言擅長Java、微信小程序、Python、Golang、安卓Android等&#xff0c;開發項目包括…

利用kimi k2編寫postgresql協議服務端的嘗試

美團龍貓還是很有自知之明的 提問請用C編寫postgresql協議服務端&#xff0c;能接收psql客戶端或其他采用postgresql協議的工具的請求&#xff0c;實現將用戶請求打印在控制臺&#xff0c;并把回應發給客戶端回答 抱歉&#xff0c;我無法為您編寫完整的 PostgreSQL 協議服務端。…

醫療 AI 再突破:輔助診斷準確率超 90%,但落地醫院仍面臨數據安全與臨床信任難題

一、引言&#xff08;一&#xff09;醫療 AI 發展背景在數字化與智能化浪潮的席卷下&#xff0c;醫療領域正經歷著深刻變革&#xff0c;人工智能&#xff08;AI&#xff09;技術的融入成為這場變革的關鍵驅動力。近年來&#xff0c;醫療 AI 輔助診斷技術取得重大突破&#xff0…

Rocky Linux10.0安裝zabbix7.4詳細步驟

安裝Rocky Linux10.0系統 請參考Rocky Linux10.0安裝教程-CSDN博客 查看當前系統版本 cat /etc/*release 安裝數據庫 安裝zabbix之前&#xff0c;需要先安裝一個數據庫來承載zabbix的數據。這里我選擇在本機直接安裝一個MariaDB數據庫。 Rocky Linux10.0系統默認不包含MySQ…

JDBC插入數據

文章目錄視頻&#xff1a;JDBC插入數據環境準備寫插入數據屬性配置屬性配置視頻&#xff1a;JDBC插入數據 環境準備 MySQL環境 小皮面板 提供MySQL環境 寫插入數據 屬性配置 聲明變量 屬性配置 # . properties 是一個特俗的map 集合 # key : 字符串 value : 字符串…

GPU 服務器壓力測試核心工具全解析:gpu-burn、cpu-burn 與 CUDA Samples

在 GPU 服務器的性能驗證、穩定性排查與運維管理中,壓力測試是關鍵環節,可有效檢測硬件極限性能、散熱效率及潛在故障。以下從工具原理、核心功能、使用場景等維度,詳細介紹三款核心測試工具,幫助用戶系統掌握 GPU 服務器壓力測試方法。 一、GPU 專屬壓力測試工具:gpu-bu…

Python進程和線程——多線程

前面提到過進程是由很多線程組成的&#xff0c;那么今天廖老師就詳細解釋了線程是如何運行的。首先&#xff0c;&#xff0c;Python的標準庫提供了兩個模塊&#xff1a;_thread和threading&#xff0c;_thread是低級模塊&#xff0c;threading是高級模塊&#xff0c;對_thread進…