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調件編譯也很簡單了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章