Android.bp中添加條件判斷編譯方式

背景:

馬哥學員朋友以前在vip群里,有問道如何在Android.bp中添加條件判斷,在工作中經常需要一套代碼兼容發貨目標版本,即代碼都是公共的一套,但是需要用這一套代碼集成到各個產品設備上
在這里插入圖片描述

但是這個產品設備可能面臨比較多的情況,例如有以下幾種:

1、產品設備可能面臨android大版本的差異,新老版本的api可能都有差異,都寫到代碼中無法編譯通過

2、產品本身有一些特別定制的功能,可能面臨只是在某些機型有這個功能

在這里插入圖片描述
面臨上面要適配多個機型差異的問題,大家可能第一時間會想到用不同的代碼分支不就行了么,但是大家注意如果用不同的代碼分支同時意味著每個分支的代碼你都需要進行維護,維護工作量極大,也就是經常可能修改了一個bug,做了一個新需求,你不得不同步一遍到多個分支,這樣一旦機型多了,差異多了,你的維護成本會越來越多。

所以使用分支差異來管理是不可取的,一般還是希望一個公共分支可以實現對多個機型的適配,那么這個該怎么實現呢?
這個其實也需要分情況來進行考慮,主要有2種情況:

情況1:代碼層面可以區分,通過相關產品類型屬性值等代碼端走不同的分支

情況2:代碼編譯依賴api或者庫都有差異,即會有編譯上的差別情況,那么這種就一定需要通過Android.mk,Android.bp中進行相關的條件判斷才可以

下面我們主要針對情況2的編譯差異進行講解相關方法。

Android.mk配置條件判斷

Android.mk這個實現判斷編譯比較簡單

1 獲取當前安卓版本號?

通過$(PLATFORM_VERSION)獲取系統版本值,例如:
13對應Android 13(Tiramisu),14對應Android 14(UpsideDownCake)?

2? 條件分支實現?
使用ifeq/else根據版本號選擇依賴文件

案例1:使用不通過的依賴jar

# 示例:Android 13及以上使用新JAR,低版本使用舊JAR
ifeq ($(PLATFORM_VERSION),13)LOCAL_JAVA_LIBRARIES := new_sdk_jar
elseLOCAL_JAVA_LIBRARIES := legacy_sdk_jar
endif

案例1:使用不通過的依賴代碼文件夾

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)# Android 14使用新功能類,其他版本使用兼容類
ifeq ($(PLATFORM_VERSION),14)LOCAL_SRC_FILES := $(LOCAL_PATH)/src/new_feature/*.java
elseLOCAL_SRC_FILES := $(LOCAL_PATH)/src/compat/*.java
endifLOCAL_MODULE := my_library
include $(BUILD_JAVA_LIBRARY)

Android.bp配置條件判斷

Android.mk是可以直接有條件判斷,但Android.bp中的條件判斷相對就復雜的多,下面是整個源碼:
目錄結構如下:
test@test:~/aosp/get_display_ids$ tree

.
├── aidl
│   └── android
│       └── hardware
│           └── display
│               ├── DisplayInfo.aidl
│               └── IDisplayManager.aidl
├── Android.bp  ---核心bp文件
├── src
│   ├── DisplayBase.cpp
│   ├── DisplayBase.h
│   ├── main1.cpp  --sdk版本大于33的編譯的cpp文件
│   └── main.cpp  --sdk版本小于等于33的編譯的cpp文件
└── version.go ---主要判斷版本然后控制編譯不同cpp的go文件5 directories, 9 files

邏輯都在version.go文件核心源碼(完整源碼分享vip群中)
在這里插入圖片描述

再看看Android.bp

// add start
bootstrap_go_package {name: "soong-version",pkgPath: "android/soong/version",deps: ["soong-android","soong-cc",],srcs: ["version.go",],pluginFor: ["soong_build"],
}filegroup {name: "libdms_client_aidl",srcs: ["aidl/**/*.aidl"],path: "aidl"
}cc_library {name: "libdms_client",srcs: [ "src/DisplayBase.cpp",":libdms_client_aidl"],aidl: {export_aidl_headers: true,local_include_dirs: ["aidl"],},export_include_dirs: ["src",],shared_libs: ["libbinder","liblog","libutils",],
}cc_version_binary {name: "version_defaults",
}
// add endcc_binary {name: "get_display_ids",defaults: ["version_defaults"],//依賴version_defaultsshared_libs: ["libbinder","liblog","libutils","libdms_client",],
}

aosp13上驗證結果
代碼差異:
在這里插入圖片描述

編譯時候:
在這里插入圖片描述
執行時候:

在這里插入圖片描述

aosp14上驗證結果
代碼差異:
在這里插入圖片描述

編譯時候:
在這里插入圖片描述
執行時候:

在這里插入圖片描述
因為aosp14版本是sdk為34

更多framework實戰開發干貨,請關注下面“千里馬學框架”

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

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

相關文章

swift ui基礎

一個樸實無華的目錄 今日學習內容:1.三種布局(可以相互包裹)1.1 vstack(豎直):先寫的在上面1.1 hstack(水平):先寫的在左邊1.1 zstack(前后)&…

第16屆藍橋杯單片機模擬試題Ⅲ

試題 代碼 sys.h #ifndef __SYS_H__ #define __SYS_H__#include <STC15F2K60S2.H> //sys.c extern unsigned char UI; //界面標志(0濕度界面、1參數界面、2時間界面) extern unsigned char time; //時間間隔(1s~10S) extern bit ssflag; //啟動/停止標志…

Node.js中URL模塊詳解

Node.js 中 URL 模塊全部 API 詳解 1. URL 類 const { URL } require(url);// 1. 創建 URL 對象 const url new URL(https://www.example.com:8080/path?queryvalue#hash);// 2. URL 屬性 console.log(協議:, url.protocol); // https: console.log(主機名:, url.hos…

Java接口性能優化面試問題集錦:高頻考點與深度解析

1. 如何定位接口性能瓶頸&#xff1f;常用哪些工具&#xff1f; 考察點&#xff1a;性能分析工具的使用與問題定位能力。 核心答案&#xff1a; 工具&#xff1a;Arthas&#xff08;在線診斷&#xff09;、JProfiler&#xff08;內存與CPU分析&#xff09;、VisualVM、Prometh…

WheatA小麥芽:農業氣象大數據下載器

今天為大家介紹的軟件是WheatA小麥芽&#xff1a;專業純凈的農業氣象大數據系統。下面&#xff0c;我們將從軟件的主要功能、支持的系統、軟件官網等方面對其進行簡單的介紹。 主要內容來源于軟件官網&#xff1a;WheatA小麥芽的官方網站是http://www.wheata.cn/ &#xff0c;…

Python10天突擊--Day 2: 實現觀察者模式

以下是 Python 實現觀察者模式的完整方案&#xff0c;包含同步/異步支持、類型注解、線程安全等特性&#xff1a; 1. 經典觀察者模式實現 from abc import ABC, abstractmethod from typing import List, Anyclass Observer(ABC):"""觀察者抽象基類""…

CST1019.基于Spring Boot+Vue智能洗車管理系統

計算機/JAVA畢業設計 【CST1019.基于Spring BootVue智能洗車管理系統】 【項目介紹】 智能洗車管理系統&#xff0c;基于 Spring Boot Vue 實現&#xff0c;功能豐富、界面精美 【業務模塊】 系統共有三類用戶&#xff0c;分別是&#xff1a;管理員用戶、普通用戶、工人用戶&…

Windows上使用Qt搭建ARM開發環境

在 Windows 上使用 Qt 和 g++-arm-linux-gnueabihf 進行 ARM Linux 交叉編譯(例如針對樹莓派或嵌入式設備),需要配置 交叉編譯工具鏈 和 Qt for ARM Linux。以下是詳細步驟: 1. 安裝工具鏈 方法 1:使用 MSYS2(推薦) MSYS2 提供 mingw-w64 的 ARM Linux 交叉編譯工具鏈…

Python爬蟲教程011:scrapy爬取當當網數據開啟多條管道下載及下載多頁數據

文章目錄 3.6.4 開啟多條管道下載3.6.5 下載多頁數據3.6.6 完整項目下載3.6.4 開啟多條管道下載 在pipelines.py中新建管道類(用來下載圖書封面圖片): # 多條管道開啟 # 要在settings.py中開啟管道 class DangdangDownloadPipeline:def process_item(self, item, spider):…

Mysql -- 基礎

SQL SQL通用語法&#xff1a; SQL分類&#xff1a; DDL: 數據庫操作 查詢&#xff1a; SHOW DATABASES&#xff1b; 創建&#xff1a; CREATE DATABASE[IF NOT EXISTS] 數據庫名 [DEFAULT CHARSET字符集] [COLLATE 排序規則]&#xff1b; 刪除&#xff1a; DROP DATABA…

實操(環境變量)Linux

環境變量概念 我們用語言寫的文件編好后變成了程序&#xff0c;./ 運行的時候他就會變成一個進程被操作系統調度并運行&#xff0c;運行完畢進程相關資源被釋放&#xff0c;因為它是一個bash的子進程&#xff0c;所以它退出之后進入僵尸狀態&#xff0c;bash回收他的退出結果&…

torch.cat和torch.stack的區別

torch.cat 和 torch.stack 是 PyTorch 中用于組合張量的兩個常用函數&#xff0c;它們的核心區別在于輸入張量的維度和輸出張量的維度變化。以下是詳細對比&#xff1a; 1. torch.cat (Concatenate) 作用&#xff1a;沿現有維度拼接多個張量&#xff0c;不創建新維度 輸入要求…

深入解析@Validated注解:Spring 驗證機制的核心工具

一、注解出處與核心定位 1. 注解來源 ? 所屬框架&#xff1a;Validated 是 Spring Framework 提供的注解&#xff08;org.springframework.validation.annotation 包下&#xff09;。 ? 核心定位&#xff1a; 作為 Spring 對 JSR-380&#xff08;Bean Validation 2.0&#…

2025年認證杯數學建模競賽A題完整分析論文(含模型、可運行代碼)(共32頁)

2025年認證杯數學建模競賽A題完整分析論文 目錄 摘要 一、問題分析 二、問題重述 三、模型假設 四、 模型建立與求解 4.1問題1 4.1.1問題1解析 4.1.2問題1模型建立 4.1.3問題1樣例代碼&#xff08;僅供參考&#xff09; 4.1.4問題1求解結果分析&#xff08…

Google A2A協議,是為了戰略性占領標準?

一、導讀 2025 年 4 月 9 日&#xff0c;Google 正式發布了 Agent2Agent&#xff08;A2A&#xff09;協議。 A2A 協議致力于打破智能體之間的隔閡&#xff0c;讓它們能夠跨越框架和供應商的限制&#xff0c;以一種標準化、開放的方式進行溝通與協作 截止到現在&#xff0c;代…

Ansible:roles角色

文章目錄 Roles角色Ansible Roles目錄編排Roles各目錄作用創建 roleplaybook調用角色調用角色方法1&#xff1a;調用角色方法2&#xff1a;調用角色方法3&#xff1a; roles 中 tags 使用實戰案例 Roles角色 角色是ansible自1.2版本引入的新特性&#xff0c;用于層次性、結構化…

MCU的USB接口作為 USB CDC串口輸出

引用&#xff1a; https://microchip-mplab-harmony.github.io/usb_apps_device/apps/usb_uart_bridge_dual/readme.html STM32 USB使用記錄&#xff1a;使用CDC類虛擬串口&#xff08;VCP&#xff09;進行通訊_stm32 usb使用記錄:使用cdc類虛擬串口(vcp)進行通訊-CSDN博客 前…

深度解析強化學習:原理、算法與實戰

深度解析強化學習:原理、算法與實戰 0. 前言1. 強化學習基礎1.1 基本概念1.2 馬爾科夫決策過程1.3 目標函數1.4 智能體學習過程2. 計算狀態值3. 計算狀態-動作值4. Q 學習4.1 Q 值4.2 使用 Q 學習進行 frozen lake 游戲4.3. frozen lake 問題4.4 實現 Q 學習小結系列鏈接0. 前…

UE5藍圖之間的通信------接口

一、創建藍圖接口 二、雙擊創建的藍圖接口&#xff0c;添加函數&#xff0c;并重命名新函數。 三、在一個藍圖&#xff08;如玩家角色藍圖&#xff09;中實現接口&#xff0c;如下圖&#xff1a; 步驟一&#xff1a;點擊類設置 步驟二&#xff1a;在細節面板已經實現的接口中…

2025 年“認證杯”數學中國數學建模網絡挑戰賽 A題 小行星軌跡預測

近地小行星&#xff08; Near Earth Asteroids, NEAs &#xff09;是軌道相對接近地球的小行 星&#xff0c;它的正式定義為橢圓軌道的近日距不大于 1.3 天文單位&#xff08; AU &#xff09;的小行星。 其中軌道與地球軌道最近距離小于 0.05A 且直徑大于 140 米的小行星被…