1、用户应当配置build_id.mk,而不应该改动version_defaults.mk文件。然后检查上述变量,如未定义则赋值默认值。关于调试功能(adb)的开启编译android源码之前总是要先运行build/envsetup.sh,以初始化一些常用命令(实际上是bash的函数,如add_lunch_combo)。其中也从以下文件中引入了一些编译设置:device/$CHIPSET_VENDOR/vendorsetup.sh我们这里使用的CHIPSET_VENDOR为amlogic。比如我们有文件device/amlogic/vendorsetup.sh,内容为产品名-编译类型(flavor)
2、列表(称为combo),如下:add_lunch_combom1ref-engm1ref-userm2ref-engm2ref-useradd_lunch_combo stvm3-engstvm3-user其中,m1ref和stvm3是产品名(作前缀),后面为编译类型。除此前缀外可选的combo值有: eng, user, userdebug, tests。(参考文件build/core/main.mk中对于变量TARGET_BUILD_VARIANT的筛查条件)我们可以修改vendorsetup.sh文件,来改变为特定设备编译的结果。以下是各个编译类型的特点:eng: 工程模式,用于平台级的
3、调试,是默认的编译类型。待安装的模块tag有: eng, debug, user, development.安装不带tag的非APK模块;所安装应用由产品定义文件给出;默认属性:ro.secure=0, ro.deuggable=1, ro.kernel.android.checkjni=1adbd默认开启,adb以root身份运行。user: 即最终用户版;待安装的应用tag有: user默认属性有ro.secure=1, ro.debuggable=0;默认关闭adbd服务(但可通过应用settings来打开,且adb以shell身份运行);userdebug: 与user类似,除了:支持
4、有限的调试功能;debug;默认属性有ro.secure=1, ro.debuggable=1;默认打开adbd服务,adb以shell身份运行;例如,由文件build/core/main.mk可以看出,当使用含有userdebug的combo值时,此文件中的临时变量enable_target_debugging会保持为true,相应地,编译过程会执行:ADDITIONAL_DEFAULT_PROPERTIES += ro.debuggable=1 persist.service.adb.enable=1这意味着目标系统中根目录下的文件/default.prop文件(对应变量 INSTALLE
5、D_DEFAULT_PROP_TARGET )会含有以下行(参考文件build/core/Makefile):persist.service.adb.enable=1由此,目标系统会默认开启adbd服务,你就可以通过其它PC来连接目标系统了。所以,如要默认开启adbd服务,可在设备(如stvm3)定制文件device/amlogic/vendorsetup.sh中增加以下行:stvm3-userdebug这样在执行bash的lunch函数时,选择此combo就可以默认打开adbd服务(adb以shell身份运行)。但是,即使adbd已经开启,你仍可能无法通过网络连接到Android进行调试,这
6、涉及到Android的二个属性:service.adb.tcp.port(优先级高)persist.adb.tcp.port(优先级低)注:可查看源码文件system/core/adb/adb.c。默认地,这两个属性值是5555。有两种方法来设置此变量:1)(永久性改变)在Android配置文件/init.rc或/init.$MANUFACTUROR.rc中添加一行:setpropservice.adb.tcp.port 55552)(临时性改变)在命令行上(你可能需要先通过串口开一个终端)执行如下命令:检查adbd是否支持通过网络链接Android:执行命令netstat -l -n|gre
7、p :5555如果有LISTEN状态的输出,则表示adbd支持网络模式)。具体地说,TARGET_PRODUCT是怎么定义的?在针对一个板子编译Android前总要先执行build/envsetup.sh(它会包含设备相关的环境设置,如device/amlogic/vendorsetup.sh),然后运行新获得的lunch函数来选择编译目标类型(即combo),如stvm3-userdebug查看文件build/envsetup.sh可知(line 519549),TARGET_PRODUCT就是combo在-前的部分(如stvm3),TARGET_BUILD_VARIANT为combo在-后
8、的部分(如userdebug)。根据build/core/main.mk文件,tags_to_install会包含debug,所以firmware会默认打开adbd (见上一小节)。用于代替lunch进行类似定义的还有build/buildspec.mk或函数choosecombo().根据以下的包含或调用关系:build/envsetup.sh (in get_build_var():make -no-print-directory -C $T -f build/core/config.mk dumpvar-$1)- build/core/config.mk (include $(BUILD
9、_SYSTEM)/envsetup.mk) build/core/envsetup.mk (include $(BUILD_SYSTEM)/product_config.mk) build/core/product_config.mk (invoke get-all-product-makefiles() build/core/product.mk (define get-all-product-makefiles() stvm3/AndroidProducts.mk device/amlogic/stvm3/stvm3.mk可知,板子的编译过程会在device/amlogic/stvm3/s
10、tvm3.mk中重新定义以下变量:PRODUCT_NAME := stvm3PRODUCT_MANUFACTURER := my_manufacturer_namePRODUCT_DEVICE :PRODUCT_MODEL := M3 media box boardPRODUCT_LOCALES := en_US en_GB fr_FR zh_TW zh_CN另,device/amlogic/stvm3/stvm3.mk还会包含device/amlogic/common/mbx_amlogic.mk,后者也定义了PRODUCT_NAME、PRODUCT_BRAND等变量(但随后部分变量被stv
11、m3.mk覆盖),并且覆盖了所包含的device/amlogic/common/core_amlogic.mk文件的同名定义。由此可见,core_amlogic.mk优先级低于具体设备(如mbx_amlogic.mk)的配置文件。product的基本描述(或定义): 涉及以下几个变量:PRODUCT_NAME(预定以的值有: core, sim, sdk, generic_x86, full, generic)PRODUCT_BRAND(貌似与PRODUCT_NAME区别不大)PRODUCT_DEVICEPRODUCT_CHARACTERISTICS这些变量首先在文件build/target/
12、product/core.mk初始化,而后在build/target/product/sim,sdk,generic,full.mk中被覆盖。对于stvm3板子来说,它们在device/amlogic/common/core_amlogic.mk中预初始化,在文件device/amlogic/common/mid,tv,mbx_amlogic.mk的末尾它们的值被覆盖。另:/default.prop是如何生效的?文件system/core/init/init.c :main(argc, argv):snprintf(tmp, sizeof(tmp), /init.%s.rc, hardware
13、);parse_config_file(tmp);action_for_each_trigger(early-init, action_add_queue_tail);queue_builtin_action(wait_for_coldboot_done_action, wait_for_coldboot_done);queue_builtin_action(property_init_action, property_initqueue_builtin_action(keychord_init_action, keychord_initqueue_builtin_action(logo_in
14、it_action, logo_initqueue_builtin_action(console_init_action, console_initqueue_builtin_action(set_init_properties_action, set_init_properties.queue_builtin_action(property_service_init_action, property_service_initqueue_builtin_action(signal_init_action, signal_initqueue_builtin_action(check_startu
15、p_action, check_startupqueue_builtin_action(queue_property_triggers_action, queue_propety_triggersdevice_fd = device_init();property_init();/ - 在这里初始化各种属性。for(;) execute_one_command();/ 通过poll处理各种事件,包括基于通道/dev/socket/property_service的属性设置/事件:handle_property_set_fd();/由system/core/init/property_servi
16、ce.c:property_set()看出,无论属性的prefix是什么,如果它是个新属性(即代码中的pi=0),总是可以把它加到属性集中去的,不管是不是ro.属性。/ 比如frameworks/base/services/java/com/android/server/BootReceiver.java中对属性ro.runtime.firstboot的读取和设置。文件system/core/init/property_service.c :void property_init(void) load_properties_from_file(PROP_PATH_RAMDISK_DEFAULT)
17、;- 读取属性文件。这里,PROP_PATH_RAMDISK_DEFAULT就是文件“/default.prop”,参见bionic/libc/include/sys/_system_properties.h#definePROP_SERVICE_NAME property_servicePROP_PATH_RAMDISK_DEFAULT/default.propPROP_PATH_SYSTEM_BUILD/system/build.propPROP_PATH_SYSTEM_DEFAULT/system/default.propPROP_PATH_LOCAL_OVERRIDE/data/loc
18、al.propStatusBar的默认隐藏默认地,Android会显示statusbar。应用程序要想隐藏StatusBar,需要在Activityde 的onCreate()里写如下代码:/to remove title bar in Java code:MyActivity.requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.myWind);/to remove status bar in Java code:getWindow().setFlags(WindowManager.LayoutParams
19、.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);或者在AndroidManifest.xml文件添加以下属性到相关Activity:/to remove title bar in Manifest.xml:android:theme=android:style/Theme.NoTitleBar/to remove title bar & status bar in Manifest.xml:style/Theme.NoTitleBar.Fullscreen有些清况下,我们需要在系统级别默认隐藏StatusBar。做法如下
20、:1) 建立一个属性,如“persist.service.statusbar”,用来表示StatusBar当前是否显示;在frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarService.java文件的makeStatusBarView()和mBroadcastReceiver(例如针对事件android.statusbar.visibility.changed)里,根据此属性值来显示或隐藏StatusBar.2) 在Settings应用里,增加切换显示/隐藏StatusBar的控制UI(
21、如在文件packages/apps/Settings/src/com/android/settings/DisplaySettings.java中),当有变化发生时,先设置属性值“persist.service.statusbar”,然后发出广播android.statusbar.visibility.changed 属性名的选择:以“persistent.”开头的属性值在发生改变时会被自动保存在目标系统的/data/property/目录下,每一个属性有一个文件来记录器内容。文件system/core/include/arch/linux-arm/AndroidConfig.h含有很多预定义
22、来控制编译过程,如HAVE_LIBC_SYSTEM_PROPERTIES, HAVE_SYS_SOCKET_H。.apk包列表的定制:设备无关的公共的包的定制可以在以下文件中执行:build/target/product/core.mk 或build/target/product/generic.mk 或build/target/product/full.mk 等。对于特定product的包的定制,可以通过以下文件(product名为stvm3):device/amlogic/stvm3/stvm3.mk涉及到的makefile变量为PRODUCT_PACKAGES.另外,对于一个具体设备来说,有一些默认安装的包在其它的文件里设定,如Home 在 文件 device/amlogic/common/core_amlogic.mk中;Launcher2 在 文件 device/amlogic/common/mbx_amlogic.mk中;后期prebuild文件的安装:Android build system 主要有两大部分构成:1) 配置部分;2) 目标构建部分。Build system的主流程文件为build/core/main
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1