在Settings关于设备中添加一项 生产日期
- 要求在初始化的时候有个默认值
- 可以从nvramGent中读取
Setting中的布局文件
在 packages/apps/Settings/res/xml/device_info_settings.xml中添加
<Preference android:key="product_date"
style="?android:preferenceInformationStyle" android:title="@string/product_date"
android:summary="@string/device_info_default" />
在Strings.xml中定义
<string name="product_date">Production date</string>
同时也需要提供中文的标示
写好了布局文件之后,在DeviceInfoSettings.java 中,定义一个 string,
public class DeviceInfoSettings extends SettingsPreferenceFragment implements Indexable {
...
private static final String KEY_PRODUCT_DATE="product_date";
在Oncreate中 设置summary
findPreference(KEY_PRODUCT_DATE).setSummary(Build.ProductDate);
此时,使用的是Build的一个属性来给我们需要的生产日期做赋值。
Build中添加一个属性
在frameworks/base/core/java/android/os/Build.java中
添加一个
public static final String ProductDate=SystemProperties.get("persist.sys.pdate");
这里使用的是一个系统的属性系统,定义的是persist.sys.pdate 这么一个变量
这个变量是如何被赋值?
以persist开头的属性,可以进行动态的改变。 为了达到系统开启的时候,就能对其赋值,
现在类比系统中bootloader的版本号的方式进行赋值
属性的赋值
android系统的第一个进程是 init的进程,
在inint进程中,现在重点关注 bootloader版本赋值的过程。
在 system/core/init/init.c中可以通过搜索得到
char tmp[PROP_VALUE_MAX];
int ret;
unsigned i;
struct {
const char *src_prop;
const char *dest_prop;
const char *def_val;
} prop_map[] = {
{ "ro.boot.serialno", "ro.serialno", "", },
{ "ro.boot.mode", "ro.bootmode", "unknown", },
{ "ro.boot.baseband", "ro.baseband", "unknown", },
{ "ro.boot.bootloader", "ro.bootloader", "unknown",
现在可以在后边添加这样的方式,来实现在init进程中就设定了生产日期
{ "ro.boot.productdate", "persist.sys.pdate", "20170111", }
init.c粗略分析
函数的调用过程
main
process_kernel_cmdline
export_kernel_boot_props
这里 main又是谁调用的呢?
在这个目录下。可以找到Android.mk
LOCAL_SRC_FILES:= \
builtins.c \
init.c \
LOCAL_MODULE:= init
这个目录下的会生成一个 init的module
这个module在 init.rc中进行指定
system/core/rootdir/init.rc
on init
sysclktz 0