天天看點

Android.bp條件編譯一.概要二.Android.bp介紹三.go編譯腳本

一.概要

    我們修改代碼的時候經常會有一些共線的機器,我們隻想進指定的機器或者指定的分支,在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"

,

"android.hardwa[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調件編譯也很簡單了

繼續閱讀