Android.bp条件编译

一.概要

    我们修改代码的时候经常会有一些共线的机器,我们只想进指定的机器或者指定的分支,在Android.mk中可以直接使用if来做判断,但是到了Android.bp中就无法在bp文件中使用条件编译了,本文将教会你怎么让bp文件也支持条件编译

 

二.Android.bp介绍

 

http://androidxref.com/9.0.0_r3/xref/frameworks/native/services/sensorservice/Android.bp

//cc_library_shared编译的是lib

cc_library_shared {

    // 模块名字

    name: "libsensorservice"

     

    // 依赖的源码

    srcs: [

        "BatteryService.cpp",

        "CorrectedGyroSensor.cpp",

        "Fusion.cpp",

        "GravitySensor.cpp",

        "LinearAccelerationSensor.cpp",

        "OrientationSensor.cpp",

        "RecentEventLogger.cpp",

        "RotationVectorSensor.cpp",

        "SensorDevice.cpp",

        "SensorDeviceUtils.cpp",

        "SensorDirectConnection.cpp",

        "SensorEventConnection.cpp",

        "SensorFusion.cpp",

        "SensorInterface.cpp",

        "SensorList.cpp",

        "SensorRecord.cpp",

        "SensorService.cpp",

        "SensorServiceUtils.cpp",

        "EllipticFusionSensorManager/EllipticFusionSensorManager.cpp",

        "EllipticFusionSensorManager/TableTopSensor.cpp",

        "EllipticFusionSensorManager/ProximityFusionSensor.cpp",

        "EllipticFusionSensorManager/SnapFusionSensor.cpp",

        "EllipticFusionSensorManager/MuteFusionSensor.cpp",

        "EllipticFusionSensorManager/PhoneMotionSensor.cpp",

        "EllipticFusionSensorManager/ParseFusionSensorConfig.cpp",

        "SensorControl.cpp",

    ],

 

    // 依赖的目录

    local_include_dirs: ["EllipticFusionSensorManager"],

    // 编译的一些flag

    cflags: [

        "-DLOG_TAG=\"SensorService\"",

        "-Wall",

        "-Werror",

        "-Wextra",

        "-fvisibility=hidden",

        "-DHAS_SENSOR_CONTROL"

    ],

    // 依赖的共享库

    shared_libs: [

        "libcutils",

        "libhardware",

        "libhardware_legacy",

        "libutils",

        "liblog",

        "libbinder",

        "libsensor",

        "libsensorprivacy",

        "libcrypto",

        "libbase",

        "libhidlbase",

        "libhidltransport",

        "libhwbinder",

        "libfmq",

        "[email protected]",

        "[email protected]",

    ],

    

    // 依赖的静态库

    static_libs: ["[email protected]"],

 

    // our public headers depend on libsensor and libsensorprivacy

    // 导出的共享库

    export_shared_lib_headers: ["libsensor""libsensorprivacy"],

}

 

bp编译一般需要指定:

一.模块性质,是库还是可执行文件

cc_library_shared/cc_binary

二.依赖的编译文件:

srcs

三.依赖的共享库

shared_libs

四.指定编译的flags:

cflags

五.依赖的静态库

static_libs

三.go编译脚本

    其实go也是去填充上边的值而已,我把上边的bp文件翻译成了go:

Android.bp

// 这里必须要配置,指定要去编译的go文件

bootstrap_go_package {

    // name and pkgPath need to  according to your module

    name: "soong-sensorservice",

    pkgPath: "android/soong/sensorservice",

    deps: [

        "blueprint",

        "blueprint-pathtools",

        "soong",

        "soong-android",

        "soong-cc",

        "soong-genrule",

    ],

    srcs: [

          // 指定你的go编译文件

          "sensorService.go",

    ],

    pluginFor: ["soong_build"],

}

 

subdirs = [

    "hidl"

]

cc_sensor_library_shared {

    // 库名字

    name: "libsensorservice",

}

go

package sensorservice

 

import (

        "android/soong/android"

        "android/soong/cc"

        "fmt"

)

 

var (

    isMiui bool

)

 

func init() {

    // 注册cc_sensor_library_shared, 指定要调用的方法入口sensorService_LibraryFactory

    android.RegisterModuleType("cc_sensor_library_shared", sensorService_LibraryFactory)

}

 

func sensorService_LibraryFactory() (android.Module) {

    // 库编译要获取LibrarySharedFactory, 可执行文件编译要获取DefaultsFactory(这一步很重要)

    module := cc.LibrarySharedFactory()

    android.AddLoadHook(module, sensorService_Defaults)

    return module

}

 

func sensorService_Defaults(ctx android.LoadHookContext) {

    type props struct {

            // 定义Android.bp中的各个字段

            Cflags []string

            Srcs []string

            Include_dirs []string

            Shared_libs []string

            Local_include_dirs []string

            Static_libs []string

            Export_shared_lib_headers []string

        }

 

        p := &props{}

        // 初始化环境配置,做不同版本的判断

        initEnvironment(ctx)

        // 获取scrs配置

        p.Srcs = getSrcs(ctx)

        // 获取local_include_dirs配置

        p.Local_include_dirs = getLocalIncludeDirs(ctx)

        // 获取local_include_dirs配置

        p.Cflags = getCflags(ctx)

        // 获取shared_libs配置

        p.Shared_libs = getSharedLibs(ctx)

        // 获取static_libs配置

        p.Static_libs = getStaticLibs(ctx)

        // 获取include_dirs配置

        p.Include_dirs = getIncludeDirs(ctx)

        // 获取export_shared_lib_headers配置

        p.Export_shared_lib_headers = getExportSharedLibHeaders(ctx)

 

                 // 上边写的配置,不需要全写在go中,只需要把条件编译的代码放进来就可以了,其他的还是配置在Android.bp中

        ctx.AppendProperties(p)

}

 

func initEnvironment(ctx android.LoadHookContext) {

    // 判断该路径是否存在

    v,error := PathExists("miui/frameworks/base/v29/native/libmqsas")

    // 初始化isMiui变量

    if (v && error != nil) {

        isMiui = true

        fmt.Println("sensorService = is Miui")

    else {

        isMiui = false

        fmt.Println("sensorService = isn't Miui")

    }

}

 

func getCflags(ctx android.BaseContext) ([]string) {

    var cflags []string

 

    cflags = append(cflags, "-DLOG_TAG=\"SensorService\"")

    cflags = append(cflags, "-Wall")

    cflags = append(cflags, "-Werror")

    cflags = append(cflags, "-Wextra")

    cflags = append(cflags, "-fvisibility=hidden")

    cflags = append(cflags, "-DHAS_SENSOR_CONTROL")

 

    if (isMiui) {

        cflags = append(cflags, "-DSENSOR_DATA_COLLECTION")

    }

 

    return cflags

}

 

func getExportSharedLibHeaders(ctx android.BaseContext) ([]string) {

    var libs []string

 

    libs = append(libs, "libsensor")

    libs = append(libs, "libsensorprivacy")

 

    return libs

}

 

func getLocalIncludeDirs(ctx android.BaseContext) ([]string) {

    var localDirs []string

 

    localDirs = append(localDirs, "EllipticFusionSensorManager")

 

    return localDirs

}

 

func getIncludeDirs(ctx android.BaseContext) ([]string) {

    var dirs []string

 

    if (isMiui) {

        dirs = append(dirs, "miui/frameworks/base/v29/native/libmqsas")

    }

 

    return dirs

}

 

func getStaticLibs(ctx android.BaseContext) ([]string) {

    var libs []string

 

    libs = append(libs, "[email protected]")

 

    return libs

}

 

func getSrcs(ctx android.BaseContext) ([]string) {

    var srcs []string

 

    srcs = append(srcs, "BatteryService.cpp")

    srcs = append(srcs, "CorrectedGyroSensor.cpp")

    srcs = append(srcs, "Fusion.cpp")

    srcs = append(srcs, "GravitySensor.cpp")

    srcs = append(srcs, "LinearAccelerationSensor.cpp")

    srcs = append(srcs, "OrientationSensor.cpp")

    srcs = append(srcs, "RecentEventLogger.cpp")

    srcs = append(srcs, "RotationVectorSensor.cpp")

    srcs = append(srcs, "SensorDevice.cpp")

    srcs = append(srcs, "SensorDeviceUtils.cpp")

    srcs = append(srcs, "SensorDirectConnection.cpp")

    srcs = append(srcs, "SensorEventConnection.cpp")

    srcs = append(srcs, "SensorFusion.cpp")

    srcs = append(srcs, "SensorInterface.cpp")

    srcs = append(srcs, "SensorList.cpp")

    srcs = append(srcs, "SensorRecord.cpp")

    srcs = append(srcs, "SensorService.cpp")

    srcs = append(srcs, "SensorServiceUtils.cpp")

    srcs = append(srcs, "EllipticFusionSensorManager/EllipticFusionSensorManager.cpp")

    srcs = append(srcs, "EllipticFusionSensorManager/TableTopSensor.cpp")

    srcs = append(srcs, "EllipticFusionSensorManager/ProximityFusionSensor.cpp")

    srcs = append(srcs, "EllipticFusionSensorManager/SnapFusionSensor.cpp")

    srcs = append(srcs, "EllipticFusionSensorManager/MuteFusionSensor.cpp")

    srcs = append(srcs, "EllipticFusionSensorManager/PhoneMotionSensor.cpp")

    srcs = append(srcs, "EllipticFusionSensorManager/ParseFusionSensorConfig.cpp")

    srcs = append(srcs, "SensorControl.cpp")

 

    return srcs

}

 

func getSharedLibs(ctx android.BaseContext) ([]string) {

    var libs []string

 

    libs = append(libs, "libcutils")

    libs = append(libs, "libhardware")

    libs = append(libs, "libhardware_legacy")

    libs = append(libs, "libutils")

    libs = append(libs, "liblog")

    libs = append(libs, "libbinder")

    libs = append(libs, "libsensor")

    libs = append(libs, "libsensorprivacy")

    libs = append(libs, "libcrypto")

    libs = append(libs, "libbase")

    libs = append(libs, "libhidlbase")

    libs = append(libs, "libhidltransport")

    libs = append(libs, "libhwbinder")

    libs = append(libs, "libfmq")

    libs = append(libs, "[email protected]")

    libs = append(libs, "[email protected]")

 

    if (isMiui) {

        libs = append(libs, "libmqsas_v29")

    }

 

    return libs

}

 

通过上边的实例翻译,现在是不是觉得Android.bp调件编译也很简单了

你可能感兴趣的:(安卓系统,安卓应用)