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.mzph.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 米的小行星被…