• 宏控的用法


    什么是宏:

    宏控在mak文件中使用,相当于功能开关,最终在java代码中使用,是控制代码执行的条件。
    

    为什么要用宏控:

    宏控的意义在于,如果有项目不需要你这个功能,关闭这个宏控就可以了;
    或者你开发的功能有问题,那项目为了稳定,需要暂时去掉这个功能,一个宏控就能解决,而不是一个文件一个文件删掉你加的代码;
    或者对于有些功能,在不同的项目需要配置不同的值。
    

    使用宏控的流程:

    目前AOSP系统,我们说的宏控包含两层意思:
    1>在mak文件中显式使用的宏控,如:MTK_MULTISIM_RINGTONE_SUPPORT
    2>在代码中真正起控制作用的system property,如:ro.mtk_multisim_ringtone
    它们控制的是同个功能。
    

    宏控命名规则:

    1,宏控要能正确反映功能含义,要求可读性强 ,避免歧义。
    对系统的一些习惯说法要了解:
    铃声:RING/RINGTONE
    解锁/锁屏声音:UNLOCK_SOUND/LOCK_SOUND
    来电:INCALL
    拨号:DIALER
    短信:SMS
    彩信/信息:MMS
    音量加/减:VOLUME_UP/DOWN
    输入法:IME
    灭屏:SCREEN_OFF/SCR_OFF
    亮屏:TURN_ON_SCREEN
    状态栏:STATUS_BAR
    近距:PROXIMITY/PSENSOR
    

    注意:特别禁止用 XXXX_NEWUI 这种指代不明的命名!

    2,针对默认开启/关闭,或者移除菜单等功能,宏控命名时要体现出来
    SUPPORTED
    ENABLE/DISABLE
    REMOVE
    SHOW / HIDE_MENU
    DEFAULT_VALUE(def_val)
    DEFAULT_ON(def_on)
    DEFAULT_OFF(def_off)
    
    3,宏控的取值除了yes/no,也可以定义为字符串或数字,对应到SystemProperty的四种取值类型。例如:
    默认输入法:BIRD_DEFAULT_INPUT_METHOD(ro.bdmisc.def_ime) 取值是输入法的包名+服务名,如:BIRD_DEFAULT_INPUT_METHOD = com.iflytek.inputmethod/.FlyIME
    屏幕密度:BIRD_LCD_DENSITY(ro.sf.lcd_density)取值是数字,如:240,320,480
    

    使用规则:

    1,宏控一般与system property结合使用。
    2,宏控可以用在Android.mk中。
    

    SystemProperties命名规则:

    1,name :字符长度最多31。value :字符长度最多91。
    2, 可以使用数字、字母、中划线”-“、下划线”_”、点”.”
    3, 命名时慎用点“.”。比如命名ro.bird.timeout会比ro.bird_timeout占用更多内存。
    4, bird内部SystemProperties分类:
    ro.bdsys.xxx_xxx_xxx 系统功能相关的
    ro.bdui.xxx_xxx_xxx UI改进相关的 ,新ui
    ro.bdfun.xxx_xxx_xxx 独立功能,例如tpwake,tpproximity,
    ro.bdmisc.xxx_xxx_xxx 其他
    

    使用规则:

    1, 如果在定义时property被多次赋值,最终起效果的是第一个。
    2, common.mk中定义的systemProperty最终会输入到system/build.prop文件。
    3, systemProperty有int、long、boolean、string四种类型。使用时需要引包android.os.SystemProperties。具体api参考文件alpsframeworksasecorejavaandroidosSystemProperties.java
    4, 最好不要在循环中使用SystemProperties.getxxx()方法。
    

    宏控和SystemProperty取名对应关系

    命名上一般宏控和property取名是一样的,宏名一律大写,property一律小写,大小写对应:
    BIRD_DOOV_SOUND 对应 ro.bdfun.doov_sound
    
    如果宏控名字太长,改成小写后超过31个字符,property可以适当的采用缩写:
    BIRD_MUSIC_WIDGET_PREVIOUS_BUTTON 对应 ro.bdfun.music_widget_prev_btn
    

    针对应用层,以近距校准功能为例,说明宏控是如何使用的:

    功能:近距校准
    宏控:BIRD_PROXIMITY_CALIBRATION=yes/no(表示取值有yes和no两种)
    property:ro.bdfun.psensor_calibrate=true/false
    1,在哪里定义宏控(包含但不仅限于)
    我们内部开发增加宏控,一般都在这个文件中增加(都加在这个文件里,方便平台移植):
    alpsirddevicecommon.mk
    #psensor & gsensor calibration,chengting,@20150404
    ifeq ($(strip $(BIRD_PROXIMITY_CALIBRATION)),yes) 【注1】
    PRODUCT_PACKAGES += libproximityjni
    PRODUCT_PROPERTY_OVERRIDES += ro.bdfun.psensor_calibrate=true 
    endif
    如果找不到这个文件(如阿里平台,增加的就不是这个文件),可以到origin的宏控文件里查一下:
    alpsdevicemediatekmtXXXXdevice.mk
    alpsdeviceird[platform]device.mk
    会有这样的引用:
    # bird add
    include bird/device/common.mk
    2,java代码中如何使用宏控
    一般我们内部开发增加的宏,要求加到模块下对应的一个BirdFeatureOption.java中,方便功能查询,以及提供统一的api。
    以Settings模块为例:
    alpspackagesappsSettingsirdsrccomirdsettingsBirdFeatureOption.java
    public static final boolean BIRD_PROXIMITY_CALIBRATION = SystemProperties.getBoolean(“ro.bdfun.psensor_calibrate”, false); 【注2】
    然后在使用的地方:
    alpspackagesappsSettingssrccomandroidsettingsDisplaySettings.java
    if(!BirdFeatureOption.BIRD_PROXIMITY_CALIBRATION){ 【注3】
    ……
    }else{
    ……
    }
    3,在哪里打开宏控
    功能开发上传完毕后,通知相关人员(如SPL)更新代码时,需要告知:commitID,修改目录,宏控是什么,如何打开。
    SPL会在项目的mak中添加宏控:
    alpsirdmake[proj][proj] .mak
    BIRD_PROXIMITY_CALIBRATION=yes 【注4】
    4,快速验证
    对于eng软件,可以将property宏控加到system/build.prop中,重启手机快速打开功能。
    adb pull system/build.prop .
    adb push bulid.prop system/
    adb shell chmod 644 system/build.prop
    对于user软件,可以将property宏控加到 alpsout	argetproduct[proj]systemuild.prop,打包system.img,重下软件验证。
    

    以上四处标注的地方,是对BIRD_PROXIMITY_CALIBRATION这个宏的不同用法:

    1,在脚本文件中定义宏BIRD_PROXIMITY_CALIBRATION ,同时绑定与ro.bdfun.psensor_calibrate 的关系
    2,这里使用boolean类型的变量BIRD_PROXIMITY_CALIBRATION(与1处的宏名保持统一)建立起与ro.bdfun.psensor_calibrate的联系,获得宏控定义的值
    3,宏控起作用的地方,这里在作为 if 语句的条件
    4,mak文件开宏,开发人员一般不用去上传,由SPL管理
    
  • 相关阅读:
    种子爆破&[GWCTF 2019]枯燥的抽奖
    Springboot学习笔记(三)
    Springboot学习笔记(二)
    Springboot学习笔记(一)
    深入理解java虚拟机阅读笔记(二)对象是否存活与垃圾收集算法
    深入理解java虚拟机阅读笔记(一)java内存区域
    OOP和AOP的区别
    浅谈对spring的理解
    mybatis逆向工程配置文件
    mybatis中${}和#{}的区别
  • 原文地址:https://www.cnblogs.com/xhf-wonder/p/7458188.html
Copyright © 2020-2023  润新知