android 10 较 android 9而言,使用了很多Android.bp文件替代Android.mk 文件 虽然有工具实现Android.mk转换为 Android.bp文件了
但如果mk文件编译中带有项目使用的宏实现动态编译如下:
vendor/sprd/platform/packages/apps/ValidationTools/Android.mk
ifneq ($(filter $(strip $(BOARD_HAVE_DTV)), MN88553 ), )
$(warning "revo ValidationTools add LOCAL_JNI_SHARED_LIBRARIES -- librevo_dtv -- !!")
LOCAL_JNI_SHARED_LIBRARIES += librevo_dtv
endif

vendor/sprd/platform/packages/apps/ValidationTools/jni/Android.mk
ifeq ($(strip $(BOARD_HAVE_DTV)),MN88553)
$(warning "librevo_dtv chip $(BOARD_HAVE_DTV)")
LOCAL_SRC_FILES     :=  \
    src/mn88553/jniutils.cpp \
    src/mn88553/libtuner55x.c \
    src/mn88553/libtuner55x_dvr.c \
    src/mn88553/mtvhal_drvif.c \
    src/mn88553/mtvhal_util.c \
    src/mn88553/test_isdbt.c \
    src/mn88553/tuner_ac.c \
    src/mn88553/test.c \
    src/mn88553/tuner_berper.c \
    src/mn88553/tuner_cn.c \
    src/mn88553/tuner_common.c \
    src/mn88553/tuner_dev.c \
    src/mn88553/tuner_dvr.c \
    src/mn88553/tuner_event.c \
    src/mn88553/tuner_init.c \
    src/mn88553/tuner_rom.c \
    src/mn88553/tuner_rssi.c \
    src/mn88553/tuner_rwreg.c \
    src/mn88553/tuner_sync.c \
    src/mn88553/tuner_tmcc.c \
    src/mn88553/tuner_tune.c \
    src/mn88553/tunerHwlLnx.c
endif
include $(BUILD_SHARED_LIBRARY)

此处就是实现动态编译的一个地方,如果带有dtv 功能就编译librevo_dtv 模块,否则不编译使用转换工具发现带有宏控制的地方被加了注释
也就是根本没有实现动态编译模块。针对此问题有如下两种解决方法
1.添加go语言编译脚本,实现动态控制编译项也就是预加载的项可以不加,生成的.so文件仅是个空壳。
如下所示
Android.bp 文件添加如下代码
cc_library_shared {
    name: "libjni_revo_dtv",
    defaults: ["libjni_revo_dtv_module"],
    sanitize: {
        misc_undefined: ["integer"],
    },
}

libjni_revo_dtv {
    name: "libjni_revo_dtv_module",
}

/// add start
bootstrap_go_package {
    // name and pkgPath need to  according to your module
    name: "soong-libjni_revo_dtv",
    pkgPath: "android/soong/libjni_revo_dtv",
    deps: [
        "blueprint",
        "blueprint-pathtools",
        "soong",
        "soong-android",
        "soong-cc",
        "soong-genrule",
    ],
    srcs: [
          // include new add .go file
          "libjni_revo_dtv.go",
    ],
    pluginFor: ["soong_build"],
}
同时新增一个.go 文件实现动态加载
libjni_revo_dtv.go

package libjni_revo_dtv

import (
        "android/soong/android"
        "android/soong/cc"
        "fmt"
)

var isLoad bool

func init() {
    // for DEBUG
    fmt.Println("init start")    
    android.RegisterModuleType("libjni_revo_dtv", Dtv_module_Factory)
}

func Dtv_module_Factory() (android.Module) {
  module := cc.DefaultsFactory()
    android.AddLoadHook(module, dynamic_load)
    return module
}

func dynamic_load(ctx android.LoadHookContext) {
    isLoad = globalDefaults(ctx)
    if (isLoad){
        type props struct {

Cflags []string
    
                Cppflags []string
    
                Srcs []string
    
                Include_dirs []string
    
                Shared_libs []string
    
                Local_include_dirs []string
    
                Static_libs []string
    
                Export_shared_lib_headers []string
            }
      p := &props{}
        p.Srcs = getSrcs(ctx)
        p.Local_include_dirs = getLocalIncludeDirs(ctx)
        p.Cflags = getCflags(ctx)
          p.Cppflags = getCppflags(ctx)
        p.Shared_libs = getSharedLibs(ctx)
        //p.Static_libs = getStaticLibs(ctx)
        //p.Include_dirs = getIncludeDirs(ctx)
        //p.Export_shared_lib_headers = getExportSharedLibHeaders(ctx)
        ctx.AppendProperties(p)
    }    
}

func globalDefaults(ctx android.BaseContext) bool {
    if ctx.AConfig().IsEnvTrue("BOARD_HAVE_DTV_MN88553") {
        fmt.Println("BOARD_HAVE_DTV_MN88553 is true")
      return true
    }else {
        fmt.Println("BOARD_HAVE_DTV_MN88553 is false")
        return false
    }
}

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

var localDirs []string
    localDirs = append(localDirs, "src/header")
    return localDirs
}

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

var srcs []string

srcs = append(srcs, "src/mn88553/jniutils.cpp")
    srcs = append(srcs, "src/mn88553/libtuner55x.c")
    srcs = append(srcs, "src/mn88553/libtuner55x_dvr.c")
    srcs = append(srcs, "src/mn88553/mtvhal_drvif.c")
    srcs = append(srcs, "src/mn88553/mtvhal_util.c")
    srcs = append(srcs, "src/mn88553/test_isdbt.c")
    srcs = append(srcs, "src/mn88553/tuner_ac.c")
    srcs = append(srcs, "src/mn88553/test.c")
    srcs = append(srcs, "src/mn88553/tuner_berper.c")
    srcs = append(srcs, "src/mn88553/tuner_cn.c")
    srcs = append(srcs, "src/mn88553/tuner_common.c")
    srcs = append(srcs, "src/mn88553/tuner_dev.c")
    srcs = append(srcs, "src/mn88553/tuner_dvr.c")
    srcs = append(srcs, "src/mn88553/tuner_event.c")
    srcs = append(srcs, "src/mn88553/tuner_init.c")
    srcs = append(srcs, "src/mn88553/tuner_rom.c")
    srcs = append(srcs, "src/mn88553/tuner_rssi.c")
    srcs = append(srcs, "src/mn88553/tuner_rwreg.c")
    srcs = append(srcs, "src/mn88553/tuner_sync.c")
    srcs = append(srcs, "src/mn88553/tuner_tmcc.c")
    srcs = append(srcs, "src/mn88553/tuner_tune.c")
    srcs = append(srcs, "src/mn88553/tunerHwlLnx.c")

return srcs
}

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

var cppflags []string
    cppflags = append(cppflags, "-fexceptions")
    return cppflags
}

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

var cflags []string

cflags = append(cflags, "-O3")
    cflags = append(cflags, "-fvisibility=hidden")
    cflags = append(cflags, "-mfloat-abi=softfp")
    cflags = append(cflags, "-mfpu=neon")
    cflags = append(cflags, "-pie")
    cflags = append(cflags, "-fPIE")
    cflags = append(cflags, "-DNDK")

return cflags
}

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

var libs []string

libs = append(libs, "libcutils")
      libs = append(libs, "libutils")
    libs = append(libs, "liblog")

return libs
}

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

var libs []string
    //libs = append(libs, "android.hardware.sensors@1.0-convert")
  return libs
}

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

var dirs []string
  //dirs = append(dirs,"miui/frameworks/base/v29/native/libmqsas")
  return dirs
}
func getExportSharedLibHeaders(ctx android.BaseContext) ([]string) {

var libs []string
    //libs = append(libs, "libsensor")
    //libs = append(libs, "libsensorprivacy")
    return libs
}

采用此方法弊端是就算宏没开启,.so库文件还是存在,只是比加宏版本小很多

下面介绍第二种方法:借助原来就带有go文件的脚本,在脚本中动态加载此编译项
由于是在 vendor/sprd/platform/packages/apps/ValidationTools/jni目录下加dtv功能,
所以借助该目录下原来就有的go脚本
Android.bp 文件关于 validation_defaults的代码
cc_library_shared {
    name: "libjni_validationtools",
    compile_multilib: "first",
    srcs: [
        "src/jniutils.cpp",
    ],
    defaults: ["validation_defaults"],
    shared_libs: [
        "libcutils",
        "libutils",
        "liblog",
    ],
}
 
/// add start
bootstrap_go_package {
    // name and pkgPath need to  according to your module
    name: "soong-validation_defaults",
    pkgPath: "android/soong/validation_defaults",
    deps: [
        "blueprint",
        "blueprint-pathtools",
        "soong",
        "soong-android",
        "soong-cc",
        "soong-genrule",
    ],
    srcs: [
          // include new add .go file
          "validation_defaults.go",
    ],
    pluginFor: ["soong_build"],
}

// jni_utils is a module
validation_defaults {
    name: "validation_defaults_module",
}
/// add end

cc_defaults {
    name: "validation_defaults",
    defaults: ["validation_defaults_module"],
    sanitize: {
        misc_undefined: ["integer"],
    },
}

validation_defaults.go文件源码

package validation_defaults

import (
        "android/soong/android"
        "android/soong/cc"
        "fmt"
)

func init() {
    // for DEBUG
    fmt.Println("init start")
    android.RegisterModuleType("validation_defaults", validation_defaultsFactory)
}

func validation_defaultsFactory() (android.Module) {
    module := cc.DefaultsFactory()
    android.AddLoadHook(module, validation_defaults)
    return module
}

func validation_defaults(ctx android.LoadHookContext) {
    type props struct {
        Cflags []string
    }
    p := &props{}
    p.Cflags = globalDefaults(ctx)
    ctx.AppendProperties(p)
}

func globalDefaults(ctx android.BaseContext) ([]string) {
    var cppflags []string

sdkVersion := ctx.AConfig().PlatformSdkVersionInt()
    fmt.Println("sdkVersion:", sdkVersion)

//Add Dflag USE_AUDIO_WHALE_HAL
    fmt.Println("USE_AUDIO_WHALE_HAL:",
        ctx.AConfig().IsEnvTrue("USE_AUDIO_WHALE_HAL"))
    if ctx.AConfig().IsEnvTrue("USE_AUDIO_WHALE_HAL") {
          cppflags = append(cppflags,
                         "-DAUDIO_WHALE_LOOPBACK=1")
    }

//Add Dflag TARGET_CAMERA_SENSOR_CCT
    cameraFlagCCT := envDefault(ctx, "TARGET_CAMERA_SENSOR_CCT", "null")
    fmt.Println("TARGET_CAMERA_SENSOR_CCT:",cameraFlagCCT)
    if cameraFlagCCT == "ams_tcs3430"{
        cppflags = append(cppflags,"-DTARGET_CAMERA_SENSOR_CCT_TCS3430")
    }

//Add Dflag TARGETARCH
    ssss := envDefault(ctx, "PRODUCT_PACKAGES", "null")
    fmt.Println("PRODUCT_PACKAGES:",ssss)

//Add Dflag TARGET_CAMERA_SENSOR_TOF
    cameraFlagTOF := envDefault(ctx, "TARGET_CAMERA_SENSOR_TOF", "null")
    fmt.Println("TARGET_CAMERA_SENSOR_TOF:",cameraFlagTOF)
    if cameraFlagTOF == "tof_vl53l0"{
        cppflags = append(cppflags,"-DTARGET_CAMERA_SENSOR_TOF_SUPPORT")
    }

fmt.Println("TARGET_BOARD_SENSOR_OV4C2:",
        ctx.AConfig().IsEnvTrue("TARGET_BOARD_SENSOR_OV4C"))

//Add Dflag BOARD_FEATUREPHONE_CONFIG
    fmt.Println("BOARD_FEATUREPHONE_CONFIG:",
        ctx.AConfig().IsEnvTrue("BOARD_FEATUREPHONE_CONFIG"))
    if ctx.AConfig().IsEnvTrue("BOARD_FEATUREPHONE_CONFIG") {
          cppflags = append(cppflags,
                         "-DBOARD_FEATUREPHONE_CONFIG")
    }

return cppflags
}

func envDefault(ctx android.BaseContext, key string, defaultValue string) string {
    ret := ctx.AConfig().Getenv(key)
    fmt.Println("envDefault key:",key)
    fmt.Println("envDefault ret:",ret)
    if ret == "" {
        return defaultValue
    }
    return ret
}

需要在Android.bp文件下加入如下代码

cc_library_shared {
    name: "libjni_revo_dtv",
    defaults: ["validation_defaults_module"],
    compile_multilib: "first",
    srcs: [
        "src/mn88553/jniutils.cpp",
                "src/mn88553/libtuner55x.c",
                "src/mn88553/libtuner55x_dvr.c",
                "src/mn88553/mtvhal_drvif.c",
                "src/mn88553/mtvhal_util.c",
                "src/mn88553/test_isdbt.c",
                "src/mn88553/tuner_ac.c",
                "src/mn88553/test.c",
                "src/mn88553/tuner_berper.c",
                "src/mn88553/tuner_cn.c",
                "src/mn88553/tuner_common.c",
                "src/mn88553/tuner_dev.c",
                "src/mn88553/tuner_dvr.c",
                "src/mn88553/tuner_event.c",
                "src/mn88553/tuner_init.c",
                "src/mn88553/tuner_rom.c",
                "src/mn88553/tuner_rssi.c",
                "src/mn88553/tuner_rwreg.c",
                "src/mn88553/tuner_sync.c",
                "src/mn88553/tuner_tmcc.c",
                "src/mn88553/tuner_tune.c",
                "src/mn88553/tunerHwlLnx.c",
    ],
    local_include_dirs: [
        "src/header",
    ],
    shared_libs: [
        "libcutils",
        "libutils",
        "liblog",
    ],
    cflags: [
        "-O3",
        "-fvisibility=hidden",
        "-mfloat-abi=softfp",
        "-mfpu=neon",
        "-pie",
        "-fPIE",
        "-DNDK",
    ],
    cppflags: [
        "-fexceptions",
    ],
}
也就是正常情况下加宏的编译代码
此处注意 defaults: ["validation_defaults_module"], 这一行关键代码

接着在 validation_defaults.go文件中加入如下代码

var isLoadDTV bool

func init() {
    // for DEBUG
    fmt.Println("init start")
    android.RegisterModuleType("validation_defaults", validation_defaultsFactory)
    if (isLoadDTV){
        android.RegisterModuleType("libjni_revo_dtv", Dtv_module_Factory)
    }
}

func Dtv_module_Factory() (android.Module) {
    module := cc.DefaultsFactory()
    //android.AddLoadHook(module, dynamic_load)
    return module
}

func globalDefaults(ctx android.BaseContext) ([]string) {
    var cppflags []string

sdkVersion := ctx.AConfig().PlatformSdkVersionInt()
    fmt.Println("sdkVersion:", sdkVersion)

//Add Dflag USE_AUDIO_WHALE_HAL
    fmt.Println("USE_AUDIO_WHALE_HAL:",
        ctx.AConfig().IsEnvTrue("USE_AUDIO_WHALE_HAL"))
    if ctx.AConfig().IsEnvTrue("USE_AUDIO_WHALE_HAL") {
          cppflags = append(cppflags,
                         "-DAUDIO_WHALE_LOOPBACK=1")
    }

//Add Dflag TARGET_CAMERA_SENSOR_CCT
    cameraFlagCCT := envDefault(ctx, "TARGET_CAMERA_SENSOR_CCT", "null")
    fmt.Println("TARGET_CAMERA_SENSOR_CCT:",cameraFlagCCT)
    if cameraFlagCCT == "ams_tcs3430"{
        cppflags = append(cppflags,"-DTARGET_CAMERA_SENSOR_CCT_TCS3430")
    }

//Add Dflag TARGETARCH
    ssss := envDefault(ctx, "PRODUCT_PACKAGES", "null")
    fmt.Println("PRODUCT_PACKAGES:",ssss)

//Add Dflag TARGET_CAMERA_SENSOR_TOF
    cameraFlagTOF := envDefault(ctx, "TARGET_CAMERA_SENSOR_TOF", "null")
    fmt.Println("TARGET_CAMERA_SENSOR_TOF:",cameraFlagTOF)
    if cameraFlagTOF == "tof_vl53l0"{
        cppflags = append(cppflags,"-DTARGET_CAMERA_SENSOR_TOF_SUPPORT")
    }

fmt.Println("TARGET_BOARD_SENSOR_OV4C2:",
        ctx.AConfig().IsEnvTrue("TARGET_BOARD_SENSOR_OV4C"))

//Add Dflag BOARD_FEATUREPHONE_CONFIG
    fmt.Println("BOARD_FEATUREPHONE_CONFIG:",
        ctx.AConfig().IsEnvTrue("BOARD_FEATUREPHONE_CONFIG"))
    if ctx.AConfig().IsEnvTrue("BOARD_FEATUREPHONE_CONFIG") {
          cppflags = append(cppflags,
                         "-DBOARD_FEATUREPHONE_CONFIG")
    }
    isLoadDTV = ctx.AConfig().IsEnvTrue("BOARD_HAVE_DTV_MN88553")
    fmt.Println("BOARD_HAVE_DTV_MN88553:",isLoadDTV)

return cppflags
}

注意isLoadDTV 变量声明及赋值地方 
var isLoadDTV bool  
isLoadDTV = ctx.AConfig().IsEnvTrue("BOARD_HAVE_DTV_MN88553")
以及模块加载地方 
android.RegisterModuleType("libjni_revo_dtv", Dtv_module_Factory)
func Dtv_module_Factory() (android.Module) {
    module := cc.DefaultsFactory()
    //android.AddLoadHook(module, dynamic_load)
    return module
}

附件中有源码

https://download.csdn.net/download/yong_xu/12015347

Android 10.0 Andorid.bp 动态编译模块相关推荐

  1. Mokee android 10.0代码下载编译总结

    Mokee代码下载 mokee下载 mokee编译 过程问题 做android framework开发也有很多年了,一直都是在公司里面下载编译,最近因为自己有个小需求想要实现,因此想着自己下载一个ao ...

  2. Android 10.0 PackageManagerService(二)权限扫描-[Android取经之路]

    摘要:PackageManagerService在systemReady()后,进行了/system/etc/permissions中的各种xml进行扫描,进行相应的权限存储,供以后使用 阅读本文大约 ...

  3. Android 10.0系统启动之init进程-[Android取经之路]

    摘要:init进程是linux系统中用户空间的第一个进程,进程号为1.当bootloader启动后,启动kernel,kernel启动完后,在用户空间启动init进程,再通过init进程,来读取ini ...

  4. Android 10.0 PackageManagerService(三)APK扫描-[Android取经之路]

    摘要:上一节讲解了PKMS的 权限扫描,扫描/system/etc/permissions中的xml,存入相应的结构体中,供之后权限管理使用. 这一节主要来讲讲APK的扫描. 阅读本文大约需要花费15 ...

  5. Android 10.0 PackageManagerService(一)工作原理及启动流程-[Android取经之路]

    摘要:PackageManagerService是Android系统核心服务之一,在Android中的非常重要,主要负责APK.jar包等的管理. 阅读本文大约需要花费50分钟. 文章的内容主要还是从 ...

  6. Android 10.0 系统服务之ActivityMnagerService-AMS启动流程-[Android取经之路]

    摘要:上一节我们讲完了SystemServer的启动过程,这一节接着上一节的步骤,来讲解ActivityManagerService的启动过程. ActivityManagerService简称AMS ...

  7. Android 10.0 系统启动之SystemServer进程-[Android取经之路]

    摘要:上一节讲解了Zygote进程的整个启动流程.Zygote是所有应用的鼻祖.SystemServer和其他所有Dalivik虚拟机进程都是由Zygote fork而来.Zygote fork的第一 ...

  8. 【高通SDM660平台 Android 10.0】(14) --- Camera ISP

    [高通SDM660平台 Android 10.0]--- Camera ISP 一.Camera ISP 与 DSP 区别 1.1 名词解释 1.2 功能解释 1.3 手机摄像头ISP是独立好还是内置 ...

  9. android 10.0版本合入GMS包

    gms包集成步骤: (1) 需要下载对应gms,国内需要通过VPN下载.下载后解压,文件目录:partner_gms.下载时,最好核对一下匹配的android版本. (2)依照路径打开gms.mk/g ...

最新文章

  1. c++判断奇偶_常用的数据差错控制技术(2) 奇偶校验
  2. Spring 5.0 GA版本发布,支持JDK9及反应式编程
  3. Object_Type列表
  4. 设计RandomPool结构
  5. C++编译器对属性和方法的处理机制
  6. 提高代码质量 CheckStyle FindBugs PMD
  7. 采购季:云服务不断进化为企业带来更多选择
  8. 手机群控系统OpenSTF
  9. 银行类app如何保证安全性
  10. python基础练习题:查找首都【难度:1级】--景越Python编程实例训练营,不同难度Python习题,适合自学Python的新手进阶
  11. python加载图片的方法_python实现读取并显示图片的两种方法
  12. python金融量化风险_利用 Python 进行量化投资分析 - 利率及风险资产的超额收益...
  13. Pygame开发Flappy Bird小游戏(下)
  14. OD调试常见断点及原理(浓缩版)
  15. 转给你身边的工程师!从零开始搭建一个完整AGV控制系统
  16. 计算机毕业设计题目php,php计算机毕业设计参考题目
  17. javascript英语单词音节拆分_英语单词音节拆分程序
  18. 代谢组学分析常用网站
  19. CDISC的ADaMIG (V1.2) 中英文对照【2】_第二章 ADaM标准的基础
  20. 新硬盘挂载目录后文件消失解决办法

热门文章

  1. 解决兼容苹果手机底部黑线的问题
  2. Tips 兼容iOS7的几个坑
  3. 分子生物学课本PDF下载链接
  4. 【群体智能】布谷鸟搜索算法
  5. 今日头条穿山甲头条sdk接入疑难问题记录
  6. 信息推送服务使用规则
  7. 良心总结!Jupyter Notebook 从小白到高手,保姆教程来了!
  8. python中while continue的用法_Python3 循环语句while/for/break/continue用法
  9. html引入第三方语音合成,HTML5语音合成功能的实现
  10. linux tc限制网卡速度,在Linux下用tc限制接口带宽