編輯:關於Android編程
以下介紹屬性服務的原理:
void property_init(void)
{
init_property_area();
}
static int init_property_area(void)
{
prop_area *pa;
//創建共享內存
if(init_workspace(&pa_workspace, PA_SIZE))
return -1;
/**設置空間大小等其他信息*/
//系統自動調用__libc_prenit函數,完成共享內存到本地進程的工作
__system_property_area__ = pa;
}void __libc_preinit(void)
{
__libc_init_common(elfdata);
}
void __libc_init_common(uintptr_t *elfdata)
{
__system_properties_init();
}
int __system_properties_init(void)
{
//取出init創建環境變量獲得文件描述符
env = getenv("ANDROID_PROPERTY_WORKSPACE");
fd = atoi(env);
//映射 init創建的內存到本地進程空間
//這樣其他進程就可以共享這個內存了
//在這裡 客戶端只能做讀取的操作
pa = mmap(0, sz, PROT_READ, MAP_SHARED, fd, 0);
}1)加載屬性文件到屬性空間裡面去 同時創建scoket
*void start_property_service(void)
{
//加載屬性文件
load_properties_from_file(PROP_PATH_SYSTEM_BUILD);
load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);
load_override_properties();
//加載持久化文件
load_persistent_properties();
//創建socket
fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM, 0666, 0, 0);
}
init.c::int main(){
nr = poll(ufds, fd_count, timeout);
if (ufds[i].revents == POLLIN) {
if (ufds[i].fd == get_property_set_fd())
handle_property_set_fd();
}
}
}void handle_property_set_fd()
{
//接收scoket
if ((s = accept(property_set_fd, (struct sockaddr *) &addr, &addr_size)) < 0) {
return;
}
//取出進程的權限屬性
if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cr, &cr_size) < 0) {
close(s);
return;
}
//接收數據
r = TEMP_FAILURE_RETRY(recv(s, &msg, sizeof(msg), 0));
if(memcmp(msg.name,"ctl.",4) == 0) {
// ctl.* 控制消息
//如setprop ctl.start bootanim
close(s);
if (check_control_perms(msg.value, cr.uid, cr.gid, source_ctx)) {
handle_control_message((char*) msg.name + 4, (char*) msg.value);
} else {
ERROR("sys_prop: Unable to %s service ctl [%s] uid:%d gid:%d pid:%d\n",
msg.name + 4, msg.value, cr.uid, cr.gid, cr.pid);
}
} else {
//檢查權限
if (check_perms(msg.name, cr.uid, cr.gid, source_ctx)) {
//設置屬性
property_set((char*) msg.name, (char*) msg.value);
} else {
ERROR("sys_prop: permission denied uid:%d name:%s\n",cr.uid, msg.name);
}
}
}
int property_set(const char *name, const char *value)
{
prop_info *pi = (prop_info*) __system_property_find(name);
if(pi != 0) {
/* ro.* properties 只讀屬性 不能設置 */
if(!strncmp(name, "ro.", 3)) return -1;
//更新屬性
update_prop_info(pi, value, valuelen);
} else {
//增加屬性最多247項
}
//處理持久屬性/net.*/
.....................
//修改屬性同時執行的操作
property_changed(name, value);
}private static native String native_get(String key);
public static String get(String key) {
if (key.length() > PROP_NAME_MAX) {
throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
}
return native_get(key);
}static JNINativeMethod method_table[] = {
{ "native_get", "(Ljava/lang/String;)Ljava/lang/String;",
(void*) SystemProperties_getS },
.......//省略部分代碼
}
}
static jstring SystemProperties_getS(JNIEnv *env, jobject clazz,jstring keyJ)
{
return SystemProperties_getSS(env, clazz, keyJ, NULL);
}
static jstring SystemProperties_getSS(JNIEnv *env, jobject clazz,jstring keyJ, jstring defJ)
{
int len;
const char* key;
char buf[PROPERTY_VALUE_MAX];
jstring rvJ = NULL;
.............//省略部分代碼
key = env->GetStringUTFChars(keyJ, NULL);
len = property_get(key, buf, "");
//構造獲得的屬性
rvJ = env->NewStringUTF(buf);
.............
}int property_get(const char *key, char *value, const char *default_value)
{
char sendBuf[1+PROPERTY_KEY_MAX];
char recvBuf[1+PROPERTY_VALUE_MAX];
int len = -1;
...............
//執行init函數獲取屬性
pthread_once(&gInitOnce, init);
...............
return len;
}
static void init(void)
{
................
gPropFd = connectToServer(SYSTEM_PROPERTY_PIPE_NAME);
................
}
static int connectToServer(const char* fileName)
{
int sock = -1;
int cc;
struct sockaddr_un addr;
.................
/* connect to socket; fails if file doesn't exist */
//采用TCP連接服務器 定義地址和協議族AF_UNIX
strcpy(addr.sun_path, fileName); // max 108 bytes
addr.sun_family = AF_UNIX;
cc = connect(sock, (struct sockaddr*) &addr, SUN_LEN(&addr));
if (cc < 0) {
close(sock);
return -1;
}
return sock;
}
安卓開發之自定義控件TipView仿QQ長按後的提示窗口
先上效果圖:之前用手機QQ時,一直很覺得這個窗口提示挺不錯的,今天將它大概地實現了一遍。一、對TipView定義一些成員變量// 一些狀態變量private static
android之SharedPreferences
簡介 將數據存儲到SharedPreferences中 獲取SharedPreferences對象 Context類中的getSharedPreferences方法 文件
Android開發系列(二十八):使用SubMenu創建選項菜單
大部分手機上邊都會有一個“MENU”鍵,在一個應用安裝到手機上之後,可以通過“MENU”顯示該應用關聯的菜單。 但是,從Android 3.0開始,Android不再要求
android讀取assets中Excel表格並顯示
本文實例為大家分享了android讀取assets中Excel的具體代碼,供大家參考,具體內容如下1.在assets下放的excel表格,命名為excel.xls 2.添