什么是宏:
宏控在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管理