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

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
else
    LOCAL_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
else
    LOCAL_SRC_FILES := $(LOCAL_PATH)/src/compat/*.java
endif

LOCAL_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 end

cc_binary {
    name: "get_display_ids",
    defaults: ["version_defaults"],//依赖version_defaults
    shared_libs: [
        "libbinder",
        "liblog",
        "libutils",
        "libdms_client",
    ],
}

aosp13上验证结果
代码差异:
在这里插入图片描述

编译时候:
在这里插入图片描述
执行时候:

在这里插入图片描述

aosp14上验证结果
代码差异:
在这里插入图片描述

编译时候:
在这里插入图片描述
执行时候:

在这里插入图片描述
因为aosp14版本是sdk为34

更多framework实战开发干货,请关注下面“千里马学框架”

相关文章:

  • LeetCode 题目 「二叉树的右视图」 中,如何从「中间存储」到「一步到位」实现代码的优化?
  • Ubuntu-搭建nifi服务
  • PHM学习软件|PHM预测性维护系统
  • JVM初探——走进类加载机制|三大特性 | 打破双亲委派SPI机制详解
  • Cesium.js(5):坐标转换
  • 如何使用Python调试学习两数之和算法
  • 物联网|无人自助台球厅源码|哪些框架支持多设备连接?
  • 成为一种国家战略范畴的新基建的智慧园区开源了
  • Interaction Toolkit 跳跃功能详解
  • 【C++初学】课后作业汇总复习(二)函数重载与类的成员函数重载,默认参数值函数——认识多态 - Toggle
  • AIDD-人工智能药物设计-大语言模型在医学领域的革命性应用
  • 03-框架篇 面试题-mk
  • k8s通过service标签实现蓝绿发布
  • LabVIEW中VI Scripting 特定对象解析
  • 7-c语言中的数组
  • TQTT_KU5P开发板教程---实现流水灯
  • 【技术】Ruby 生态概念速查表,通过对比nodejs生态(入门)
  • Linux 网络编程套接字
  • GIS-AI 融合引擎架构:智慧景区导览系统的毫秒级响应与千级并发优化实战
  • javaSE学习(前端基础知识)
  • 一个刚有官网的公司怎么做网站运营/百度推广登陆平台
  • 直播类网站开发/网络营销个人感悟小结
  • 网站建设div设置圆角/抖音seo排名系统哪个好用
  • 天津网站建设价位/怎么注册一个网站
  • 网站 位置导航/搜狗站长平台打不开
  • wordpress生产静态页面/浙江企业seo推广