首页 >> 大全

Android属性系统简介【转】

2023-09-30 大全 25 作者:考证青年

1、简介

在系统中,为统一管理系统的属性,设计了一个统一的属性系统。每个属性都有一个名称和值,他们都是字符串格式。属性被大量使用在系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性。在编译的过程中会将各种系统参数汇总到build.proc以及.proc这两个文件中,主要属性集中在build.proc中。系统在开机后将读取配置信息并构建共享缓冲区,加快查询速度。另外一个方面,会在系统第一次初始化时(刷机第一次启动)后,将从.xml中读取数据然后写入数据库.db目录。并构建一个缓冲系统供其他应用查询。下面将详细讲述。

2、 Type

系统属性根据不同的应用类型,分为不可变型,持久型,网络型,启动和停止服务等。

特别属性:

属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。

属性名称以“.”开头,当设置这个属性时,其值也将写入/data/。

属性名称以“net.”开头,当设置这个属性时,“net.”属性将会自动设置,以加入到最后修改的属性名。(这是很巧妙的。模块的使用这个属性来追踪在net.*属性上的任何变化。)

属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务。每一项服务必须在/init.rc中定义.系统启动时,与init守护进程将解析init.rc和启动属性服务。一旦收到设置“ ctrl.start ”属性的请求,属性服务将使用该属性值作为服务名找到该服务,启动该服务。这项服务的启动结果将会放入“ init.svc.“属性中。客户端应用程序可以轮询那个属性值,以确定结果。

3、

程序提供了两个工具:和获取和设置属性。其使用方法:

Java

在Java应用程序可以使用.()和.()函数获取和设置属性。

默认情况下,设置属性只会使"init"守护程序写入共享内存,它不会执行任何脚本或二进制程序。但是,您可以将您的想要的实现的操作与init.rc中某个属性的变化相关联.例如,在默认的init.rc中有:

# adbd on at boot in emulatoron property:ro.kernel.qemu=1start adbdon property:persist.service.adb.enable=1start adbdon property:persist.service.adb.enable=0stop adbd

4、

原则上,属性的设置可以出现在make 的任何环节。目前的设置以oppo版本为例:

alps\build\\board\\ .prop

alps\build\\\core.mk

alps\build\tools\.sh

编译好后,被设置的系统属性主要存放在:

这样,如果你设置..adb.为1,"init"守护程序就知道需要采取行动:开启adbd服务。

\ .prop手机厂商自己定制使用

\\build.prop 系统属性主要存放处

\\.prop ,有存放与相关的属性

\data\local.prop目前还没有看到有内置的情况

\data\下有4个prop文件:.sys., .sys., .sys., .sys.,里面保存着属性名称以“.”开头的属性值。用户的开头的属性都会保存副本在这个目录下

5、 Run

5. init.

在linux 启动时,将分配一个共享内存区来存储的属性。这些是由“init”守护进程完成的,其源代码位于:/core/init。“init”守护进程将启动一个属性服务。属性服务在“init”守护进程中运行。每一个客户端想要设置属性时,必须连接属性服务,再向其发送信息。属性服务将会在共享内存区中修改和创建属性。客户端想获得属性信息,可以从共享内存直接读取。这提高了读取性能。

客户端应用程序可以调用中的API函数以GET/SET属性信息。的源代码位于:/core/。获取和设置属性的代码在.c里面,读取属性通过读共享内存得到,设置属性通过发送请求到进行设置。API函数是:

int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);int property_list(void(*propfn)(const char * key, const char * value, void * cookie), void * cookie);system/core/init. c= > main( ) 进程将调用= > property_init= > init_property_areavoid property_init( void ) {//ashmem_area - android shared memory area是android共享内容存的一种方式//打开ashmem设备,申请一段size大小的kernel空间内存,不去释放,以便供所有用户空间进程共享.//内核驱动位于linux/mm/ashmem.c文件[luther.gliethttp].init_property_area( ) ; 
//#define PROP_PATH_RAMDISK_DEFAULT "/default.prop"//从ramdisk中读取default.prop文件,将文件中的所有java环境中使用到的propt释放到//这个共享内存中.load_properties_from_file( PROP_PATH_RAMDISK_DEFAULT) ;}

后面将调用.c,启动最原始的 .

然后通过. c,的init函数完成内核的初始化工作。

5.2、属性的访问

如果在C/C++层次,则可以使用的下列函数来访问。

int property_get(const char *key, char *value, const char *default_value);
int property_set(const char *key, const char *value);int property_list(void(*propfn)(const char * key, const char * value, void * cookie), void * cookie);

如果在Java层次,则可以使用./.该方法(set/get)实际将调用.java进行访问,而.java通过jni调用进行访问。

5.3、

android系统属性__android布局属性简介

默认是可以存储247笔.但因为我司有大量的数据被写入到这个 中,导致容易出现 mmap到 中的缓存溢出。一方面需要确认数据是否确实有必要写入 ,另外一方面,可以扩大缓存的区间。

缓存区间可以分成两大部分(byte), Info Area , Array Area. Info Area又分成和Name Area.

8 *4

Every Name * 4

Every Value row and the max is 127

因为,给出固定的最大笔数N.缓存定义上要求

#define PA_COUNT_MAX    N#define PA_INFO_START   ((8+PA_COUNT_MAX) * 4) 最好保证这个值为32的整数倍#define PA_SZE                (PA_INFO_START + (128 * PA_COUNT_MAX))

5.4、控制属性

在 中提供两个特殊的key, ctl.start和ctl.stop来启动和关闭服务。

其API描述是:

SystemProperties.set(“ctl.start”,serviceName);SystemProperties.set(“ctl.stop”,serviceName);

注意的是,这个可在init.rc中查询

5.5、Init属性

Init属性是 中的一种特殊的属性,由init.c定义,init会监控定义在init.rc中的服务,并定义init.svc.xxxx的 .

具体实现,可参考init.c中的函数。

我们除了直接ps来查看这些进程信息外,还可以直接通过查看 来确认这些服务的状态,如

[init.svc.bootlogoupdater]: [stopped][init.svc.pvrsrvinit]: [stopped][init.svc.servicemanager]: [running][init.svc.vold]: [running][init.svc.netd]: [running][init.svc.netdiag]: [running][init.svc.hald]: [running][init.svc.debuggerd]: [running][init.svc.zygote]: [running][init.svc.drmserver]: [running][init.svc.media]: [running][init.svc.dbus]: [running][init.svc.installd]: [running][init.svc.keystore]: [running][init.svc.console]: [running][init.svc.adbd]: [running][init.svc.ril-daemon]: [running]

5.6、属性安全性

作为一个共享的缓存系统,并非任何AP都可以随意去修改其中的属性,针对这些属性,如果进行更改时,会有UID上的约束。

/* White list of permissions for setting property services. */
struct {const char *prefix;unsigned int uid;unsigned int gid;
} property_perms[] = {{ "net.rmnet0.",      AID_RADIO,    0 },{ "net.gprs.",        AID_RADIO,    0 },{ "net.ppp",          AID_RADIO,    0 },{ "net.qmi",          AID_RADIO,    0 },{ "net.lte",          AID_RADIO,    0 },{ "net.cdma",         AID_RADIO,    0 },{ "ril.",             AID_RADIO,    0 },{ "gsm.",             AID_RADIO,    0 },{ "persist.radio",    AID_RADIO,    0 },{ "net.dns",          AID_RADIO,    0 },{ "sys.usb.config",   AID_RADIO,    0 },{ "net.",             AID_SYSTEM,   0 },{ "dev.",             AID_SYSTEM,   0 },{ "runtime.",         AID_SYSTEM,   0 },{ "hw.",              AID_SYSTEM,   0 },{ "sys.",             AID_SYSTEM,   0 },{ "sys.powerctl",     AID_SHELL,    0 },{ "service.",         AID_SYSTEM,   0 },{ "wlan.",            AID_SYSTEM,   0 },{ "gps.",             AID_GPS,      0 },{ "bluetooth.",       AID_BLUETOOTH,   0 },{ "dhcp.",            AID_SYSTEM,   0 },{ "dhcp.",            AID_DHCP,     0 },{ "debug.",           AID_SYSTEM,   0 },{ "debug.",           AID_SHELL,    0 },{ "log.",             AID_SHELL,    0 },{ "service.adb.root", AID_SHELL,    0 },{ "service.adb.tcp.port", AID_SHELL,    0 },{ "persist.logd.size",AID_SYSTEM,   0 },{ "persist.sys.",     AID_SYSTEM,   0 },{ "persist.service.", AID_SYSTEM,   0 },{ "persist.security.", AID_SYSTEM,   0 },{ "persist.gps.",      AID_GPS,      0 },{ "persist.service.bdroid.", AID_BLUETOOTH,   0 },{ "selinux."         , AID_SYSTEM,   0 },{ "wc_transport.",     AID_BLUETOOTH,   AID_SYSTEM },{ "build.fingerprint", AID_SYSTEM,   0 },{ "partition."        , AID_SYSTEM,   0},
#ifdef DOLBY_UDC{ "dolby.audio",      AID_MEDIA,    0 },
#endif // DOLBY_UDC
#ifdef DOLBY_DAP// used for setting Dolby specific properties{ "dolby.", AID_SYSTEM,   0 },
#endif // DOLBY_DAP{ "sys.audio.init",   AID_MEDIA,    0 },{ NULL, 0, 0 }
};

具体的UID映射为:

#define AID_RADIO         1001  /* telephony subsystem, RIL */
#define AID_BLUETOOTH     1002  /* bluetooth subsystem */
#define AID_GRAPHICS      1003  /* graphics devices */
#define AID_INPUT         1004  /* input devices */
#define AID_AUDIO         1005  /* audio devices */
#define AID_CAMERA        1006  /* camera devices */
#define AID_LOG           1007  /* log devices */
#define AID_COMPASS       1008  /* compass device */
#define AID_MOUNT         1009  /* mountd socket */
#define AID_WIFI          1010  /* wifi subsystem */
#define AID_ADB           1011  /* android debug bridge (adbd) */
#define AID_INSTALL       1012  /* group for installing packages */
#define AID_MEDIA         1013  /* mediaserver process */
#define AID_DHCP          1014  /* dhcp client */
#define AID_SDCARD_RW     1015  /* external storage write access */
#define AID_VPN           1016  /* vpn system */
#define AID_KEYSTORE      1017  /* keystore subsystem */
#define AID_USB           1018  /* USB devices */
#define AID_DRM           1019  /* DRM server */
#define AID_MDNSR         1020  /* MulticastDNSResponder (service discovery) */
#define AID_GPS           1021  /* GPS daemon */
#define AID_UNUSED1       1022  /* deprecated, DO NOT USE */
#define AID_MEDIA_RW      1023  /* internal media storage write access */
#define AID_MTP           1024  /* MTP USB driver access */
#define AID_UNUSED2       1025  /* deprecated, DO NOT USE */
#define AID_DRMRPC        1026  /* group for drm rpc */
#define AID_NFC           1027  /* nfc subsystem */
#define AID_SDCARD_R      1028  /* external storage read access */
#define AID_CLAT          1029  /* clat part of nat464 */
#define AID_LOOP_RADIO    1030  /* loop radio devices */
#define AID_MEDIA_DRM     1031  /* MediaDrm plugins */
#define AID_PACKAGE_INFO  1032  /* access to installed package details */
#define AID_SDCARD_PICS   1033  /* external storage photos access */
#define AID_SDCARD_AV     1034  /* external storage audio/video access */
#define AID_SDCARD_ALL    1035  /* access all users external storage */
#define AID_LOGD          1036  /* log daemon */
#define AID_SHARED_RELRO  1037  /* creator of shared GNU RELRO files */

即如.sys开头的属性,只能有 user(包括root)进行修改,其他用户无法进行修改。

这个user id表定义在\\core\init\.c和\\core\\\onfig.h文件中

6、

在 中还定义了 来对一些比较通用的数据进行初始化,并将数据写入.db.其中直接在 中被初始化的属性写在.xml中:

true60000falsecell,bluetooth,wifiwifitruetrue102false0%0%truefalsefalsegpstrue1truefalsetrue   falsetruetruefalsetruetrue1/system/media/audio/ui/LowBattery.ogg0/system/media/audio/ui/Dock.ogg/system/media/audio/ui/Undock.ogg/system/media/audio/ui/Dock.ogg/system/media/audio/ui/Undock.ogg0/system/media/audio/ui/Lock.ogg/system/media/audio/ui/Unlock.oggtrue

将通过将这些数据读入.db,同时作为控制.db的,所有对该数据库的操作都要通过它来进行。

其他具体的属性的描述都在.java这个类中描述。

为提高访问的效率,建立了cache,只有当cache中找不到时,才会调用去查询.db数据库。

具体的.db中包括的数据库表有:

关键的表中的数据有:

一般通过修改.xml和make中的配置文件即可。

7、About Phone .

About Phone中的一些关键属性通过.sh来焊接(make - build),经过测试,可修改alps\build\tools\.sh来修改显示的情况,整理一下如下:

修改echo "ro.build..id=$",把$修改成其他的名称可改变Build .注意此时要去除$.

修改echo "ro..model=$",把 $修改成其他的名称可改变Model .注意此时要去除$

修改echo "ro.build..=2.1" ,中的2.1可改变显示的 ,这个不建议修改。

直接写在modem.img中,开机后modem自动推送到端,需要专门的tool才能修改。

为linux编译过程中产生,按照标准的linux格式生成(.h),最后版本信息写在文件/proc/下,所有的版本信息即在该文件的第一行,然后使用了一个正则表达式过滤了版本信息中一些字符。

8、About USER Build and Eng Build

在User Eng版本中自由切换。

郑重声明:在出厂正式版本的时候,请务必关闭该,不然将导致机器异常容易被root.

1.首先说明一下User Eng版本之间的差异

eng This is the . A plain make is the same as make eng.

• with: eng, debug, user, and/or .

• non-APK that have no tags .

• APKs to the files, in to APKs.

• ro.=0

• ro.=1

• ro...=1

• adb is by .

• is

user make user

This is the to be the final bits.

• with user.

• non-APK that have no tags .

• APKs to the files; tags are for APK .

• ro.=1

• ro.=0

• adb is by .

• dex pre- for all in to speed up first boot-up

make

The same as user, :

• Also with debug.

• ro.=1

• adb is by .

2.从安全角度来将,其差别主要是四个 的设置,在正常情况下,如果不更新boot image,那么

ro.

ro.allow.mock.

ro.

是无法被修改的,即在编译的时候就已经决定了

3.要使得这几个值能够被修改,那么必须修改 的实现, 的实现上,是,上次实现是.c,需要修改的地方有两处。

3.1 函数中,增加下面一段,放在这个函数的最前面

//add for user -> root

if(!(name,"ro.") || !(name,"ro.allow.mock.") || !(name,"ro.") || !(name,"..adb.")){

1;

3.2 函数中屏蔽

/* ro.* may NEVER be once set */

//for user -> root

// if(!(name, "ro.", 3)) -1;

至此,我们已经完全开放了中这四个的控制权,当然如果您还想稍微加以控制,您可以增加pid, uid等的控制,减小这个权限范围。

4.编写一个,来实现自由调控,您可以创建一个简单的,里面包括这个即可。

package com.example.user2root;import android.app.Activity;import android.os.Bundle;import android.os.SystemProperties;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;/**** This is a demo for User To Root.* If you use this app, you MUST open system properties write security.**/public class User2rootActivity extends Activity {/** Called when the activity is first created. */private Button mRootButton;private Button mUserButton;private static final String RO_SECURE = "ro.secure";private static final String RO_ALLOW_MOCK_LOCATION="ro.allow.mock.location";private static final String RO_DEBUG = "ro.debuggable";private static final String ADB_ENABLE = "persist.service.adb.enable";private OnClickListener mRootListener = new Button.OnClickListener(){@Overridepublic void onClick(View v) {SystemProperties.set(ADB_ENABLE, "1");SystemProperties.set(RO_SECURE, "0");SystemProperties.set(RO_ALLOW_MOCK_LOCATION,"1" );SystemProperties.set(RO_DEBUG, "1");Toast.makeText(User2rootActivity.this, "Update to Root Success", Toast.LENGTH_LONG).show();}};private OnClickListener mUserListener = new Button.OnClickListener(){@Overridepublic void onClick(View v) {SystemProperties.set(ADB_ENABLE, "0");SystemProperties.set(RO_SECURE, "1");SystemProperties.set(RO_ALLOW_MOCK_LOCATION,"0" );SystemProperties.set(RO_DEBUG, "0");Toast.makeText(User2rootActivity.this, "Update to User Success", Toast.LENGTH_LONG).show();}};protected void findViews(){this.mRootButton = (Button) this.findViewById(R.id.root);this.mUserButton = (Button) this.findViewById(R.id.user);}protected void setActionListener() {this.mRootButton.setOnClickListener(this.mRootListener);this.mUserButton.setOnClickListener(this.mUserListener);}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);this.findViews();this.setActionListener();}}

至此已经完成了全部的工作,把这个apk编译进去后,您将发现您可以自由的切换user eng了。

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了