1. 程式人生 > >Android 應用程式分析之Settings.System.putInt

Android 應用程式分析之Settings.System.putInt

由於需要修改Setting預設設定的需要,需要分析下Setting的原始碼,以及資料儲存與讀取。

Android自帶的應用程式儲存在packages/apps目錄下

主要目錄和檔案如下:

clip_image002

其中resouce是資原始檔,src是原始碼,tests中含有測試程式碼。而Android.mk和AndroidManifest.xml分別是編譯以及應用程式全域性資料。

原始碼的佈局當然也是遵循Java的package管理方式。我們以瞭解Settings – Sound & Display – Orientation 為線索,瞭解整個Settings應用的工作原理。因為我目前開發的目標板沒有gsenser,我的目標是把該項的預設為unchecked。

res/xml/setting.xml中指定Settings包含的選項,從中找到Sound and Display相關的一項

clip_image004

根據targetClass的定義,我們便可以從原始碼中找到對應的SoundAndDisplaySettings類。

clip_image007

Sound & Display選項中仍有很多子選項,Orientation只是Sound & Display選項中的一項。同樣道理,在res/xml/sound_and_display_settings.xml中,可以找到Orientation選項的定義。

clip_image009

如何知道accelerometer就是Orientation呢?一方面,從字面意思猜個8、9不離10,另一方面,從packages/apps/Settings/res/values/strings.xml(如下圖)也可以看出accelerometer就是對應著Orientation,(預設語言的字串描述,如果選擇了中文語言,那麼則在packages/apps/Settings/res/values-zh-rCN/strings.xml找到中文的描述)

clip_image011

進到原始碼中,常量字串KEY_ACCELEROMETER定義了該選項的唯一標識。

clip_image013

在OnCreate()初始化中,系統使用了findPreference找到了acclerometer在xml中的描述,把獲取的Preference型別強制轉換為CheckBoxPreference類。

clip_image015

當該Checkbox被點選後,來到響應按鈕的程式碼,若checkbox為checked則寫1否則寫0

clip_image017

Setting.System.putInt做的工作,就是把這個選項修改的值寫到資料庫中去,PutString函式:

clip_image020

clip_image018

clip_image022

資料庫儲存於com.android.providers.settings/databases/settings.db 。ANDROID的資料庫是採用SQLite儲存的,把settings.db複製出來,然後使用sqlite管理工具開啟,可以看到剛寫進去的值:

clip_image024

accelerometer_rotation的值為0,表示orientation這個Checkbox為not checked.

至此,我們瞭解了,幾乎所有的Settings預設值都會寫在settings.db中,若要修改的預設選項值較多,可以使用sqlite資料庫工具,手動修改settings.db中的值。已達到批量修改預設值的目的,系統在下次啟動時,會自動載入這些寫在Settings.db中的值。在批量生產前,只需要把修改後的settings.db 壓制到data.img再燒錄到系統中就好了。當然,也可以從原始碼入手,修改該預設值。

還需要了解的一個問題是:系統又是如何在開機設定這個我們設定的Orientation的狀態呢?思路無非是從settings.db中讀取資料庫的值,然後設定相應的狀態。

首先,要確定編譯時平臺的Policy,在build/target/product/core.mk中,有這樣的描述:

clip_image026

編譯選項中,PRODUCT_POLICY為android.policy_phone。那麼系統啟動就會採用phone這個Policy。啟動讀取資料庫的值,相關的一個類是PhoneWindowManager(同理,mid對應著MidWindowManager)

從frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java找到這個類,

這裡只關注Orientation這個Checkbox的相關的功能,雖然PhoneWindowManager.java兩千多行程式碼,這裡只看Update方法中相關的幾行:

clip_image028

這幾行就是從settings.db資料庫中取得Orientation項的值,如果這個值預設值0不等(即值為1)的話,那麼就updateOrientationListenerLp();

整個的分析路線是


相關推薦

Android 應用程式分析Settings.System.putInt

由於需要修改Setting預設設定的需要,需要分析下Setting的原始碼,以及資料儲存與讀取。 Android自帶的應用程式儲存在packages/apps目錄下 主要目錄和檔案如下: 其中resouce是資原始檔,src是原始碼,tests中含有測試程式碼。而Andr

Android應用儲存資料到系統資料庫(Settings.System.putString、Settings.System.putInt

前言:在android應用開發的時候,有時候需要要儲存一些變數的值,有好幾種方法,這裡就介紹其中一種,儲存到系統資料庫中。 一、資料庫的位置在/data/data/com.android.provi

轉老羅 Android應用程式資源的查詢過程分析

原文地址  http://blog.csdn.net/luoshengyang/article/details/8806798   轉載請說明     我們知道,在Android系統中,每一個應用程式一般都會配置很多資源,用來適配不同密

轉自老羅 Android應用程式資源的編譯和打包過程分析

原文地址   http://blog.csdn.net/luoshengyang/article/details/8744683 轉載自老羅,轉載請說明   我們知道,在一個APK檔案中,除了有程式碼檔案之外,還有很多資原始檔。這些資原始檔是通過An

轉自 老羅 Android應用程式資源管理器(Asset Manager)的建立過程分析

原文地址在 http://blog.csdn.net/luoshengyang/article/details/8791064 原創老羅,轉載請說明     在前面一篇文章中,我們分析了Android應用程式資源的編譯和打包過程,最終得到的應用程式資源就與

Android應用程式內部啟動Activity過程 startActivity 的原始碼分析

                        上文介紹了Android應用程式的啟動過程,即應用程式預設Activity的啟動過程,一般來說,這種預設Activity是在新的程序和任務中啟動的;本文將繼續分析在應用程式內部啟動非預設Activity的過程的原始碼,這種非預設Activity一般是在原來的程序

Android應用程式註冊廣播接收器 registerReceiver 的過程分析

                        前面我們介紹了Android系統的廣播機制,從本質來說,它是一種訊息訂閱/釋出機制,因此,使用這種訊息驅動模型的第一步便是訂閱訊息;而對Android應用程式來說,訂閱訊息其實就是註冊廣播接收器,本文將探討Android應用程式是如何註冊廣播接收器以及把廣播接收

Android應用程式視窗(Activity)的執行上下文環境(Context)的建立過程分析

                        在前文中,我們簡要介紹了Android應用程式視窗的框架。Android應用程式視窗在執行的過程中,需要訪問一些特定的資源或者類。這些特定的資源或者類構成了Android應用程式的執行上下文環境,Android應用程式視窗可以通過一個Context介面來訪問它,

Android應用程式請求SurfaceFlinger服務渲染Surface的過程分析

                        在前面一篇文章中,我們分析了Android應用程式請求SurfaceFlinger服務建立Surface的過程。有了Surface之後,Android應用程式就可以在上面繪製自己的UI了,接著再請求SurfaceFlinger服務將這個已經繪製好了UI的Surf

Android應用程式元件Content Provider在應用程式之間共享資料的原理分析

                        在Android系統中,不同的應用程式是不能直接讀寫對方的資料檔案的,如果它們想共享資料的話,只能通過Content Provider元件來實現。那麼,Content Provider元件又是如何突破應用程式邊界許可權控制來實現在不同的應用程式之間共享資料的呢?

Android應用程式視窗(Activity)的檢視物件(View)的建立過程分析

       從前文可知道,每一個Activity元件都有一個關聯的Window物件,用來描述一個應用程式視窗。每一個應用程式視窗內部又包含有一個View物件,用來描述應用程式視窗的檢視。應用程式視窗檢視是真正用來實現UI內容和佈局的,也就是說,每一個Activity元件的U

Android應用程式啟動過程原始碼分析(2)

Step 9. ActivityStack.startActivityUncheckedLocked         這個函式定義在frameworks/base/services/java/com/android/server/am/ActivityStack.java檔案中: view plain pu

Android應用程式的記憶體分析(翻譯)(轉)

作者:Tim Bray Dalvik虛擬機器支援垃圾收集,但是這不意味著你可以不用關心記憶體管理。你應該格外注意移動裝置的記憶體使用,在上面記憶體空間是受到限制的。在這篇 文章裡面,我們來看看Android SDK裡面的一些記憶體剖析工具(profiling tools)

Android應用程式啟動過程原始碼分析

        前文簡要介紹了Android應用程式的Activity的啟動過程。在Android系統中,應用程式是由Activity組成的,因此,應用程式的啟動過程實際上就是應用程式中的預設Activity的啟動過程,本文將詳細分析應用程式框架層的原始碼,瞭解Android

android應用程式fps meter[幀數顯示]的分析 —— SurfaceFlinger被注入統計程式碼 (1)

fps meter是常用的檢測幀率的軟體,該軟體需要root許可權才能工作,一直比較好奇它一個apk是如何知道系統當前的幀率情況的,就針對此apk分析了一下其工作原理。 Apk組成 首先看一下apk的組成,apk檔案就是一個壓縮包,可以解壓縮軟體如winrar解壓檢視,也可

Android應用程式外掛化研究資源衝突

最近在研究Android應用的外掛化開發,  外掛化都是在解決以下幾個問題: 本章我們來研究最後一個問題:資源共享與衝突。在《Android應用程式外掛化研究之AssertManager》中,我們實現了載入外掛apk中資源問題,實際上我們是單獨建立了用於訪問外掛資源的Ass

Android應用程式視窗(Activity)的視窗物件(Window)的建立過程分析

       在前文中,我們分析了Android應用程式視窗的執行上下文環境的建立過程。由此可知,每一個Activity元件都有一個關聯的ContextImpl物件,同時,它還關聯有一個Window物件,用來描述一個具體的應用程式視窗。由此又可知,Activity只不過是一個

Android應用程式資源的編譯和打包過程分析

   我們知道,在一個APK檔案中,除了有程式碼檔案之外,還有很多資原始檔。這些資原始檔是通過Android資源打包工具aapt(Android Asset Package Tool)打包到APK檔案裡面的。在打包之前,大部分文字格式的XML資原始檔還會被編譯

Android應用程式鍵盤(Keyboard)訊息處理機制分析

        在Android系統中,鍵盤按鍵事件是由WindowManagerService服務來管理的,然後再以訊息的形式來分發給應用程式處理,不過和普通訊息不一樣,它是由硬體中斷觸發的;在上一篇文章《Android應用程式訊息處理機制(Looper、Handler)分

Android應用程式外掛化研究Activity註冊

最近在研究Android應用的外掛化開發,看了好幾個相關的開源專案。外掛化都是在解決以下幾個問題: 如何把外掛apk中的程式碼和資源載入到當前虛擬機器。如何把外掛apk中的四大元件註冊到程序中。如何防止外掛apk中的資源和宿主apk中的資源引用衝突。在上篇文章中我研究了如何