多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > Android 多用戶模式原理和實現介紹

Android 多用戶模式原理和實現介紹

來源:程序員人生   發布時間:2015-02-02 08:25:24 閱讀次數:12047次

       我們可以感遭到,在Android 4.2中的1個比較顯著的改變就是加入了多用戶的支持。因多用戶手機專利早已被Symbian雇員注冊,故 android官方的多用戶切換目前僅支持平板裝備。

多用戶模式的啟用

系統判斷當前裝備是不是支持多用戶模式的根據是配置文件config.xml中的config_multiuserMaximumUsers配置項。 其取值為整型,決定著當前裝備支持的最大用戶上限。默許值為1,即不支持多用戶。如需啟用多用戶,則設置此值 為大于1的值。在Nexus 7中,此值為8。

具體代碼的判斷位置在UserManager.java:

[java] view plaincopy
  1. public static int getMaxSupportedUsers() {  
  2.         // Don't allow multiple users on certain builds  
  3.         if (android.os.Build.ID.startsWith("JVP")) return 1;  
  4.         return SystemProperties.getInt("fw.max_users",  
  5.                 Resources.getSystem().getInteger(R.integer.config_multiuserMaximumUsers));  
  6.     }  


多用戶相干操作流程

對用戶的操作目前未對普通利用開放,其相干API都有hide注解,并需要system權限。另外,用戶的添加和移除還 要需android.Manifest.permission.MANAGE_USERS權限。

用戶添加流程

用戶添加是通過調用UserManager的public UserInfo createUser(String name, int flags)方法進行的。其具體實現在UserManagerService的同名方法中。

在調用時,系統進行以下操作:

  1. 檢查調用者是不是具有所需權限。
  2. 對安裝和軟件包流程加鎖,保證線程安全
  3. 檢查多用戶環境是不是到達用戶數量限制。如果沒有,創建用戶實例
  4. 為新用戶創建相干目錄
  5. 序列化用戶列表
  6. 發送用戶建立廣播,MountService在收到此廣播后,調用createEmulatedVolumeForUserLocked方法為用戶建 立相應的數據目錄

用戶的保存

用戶創建后,會首先在/data/system/users/userlist.xml文件中保存新增加用戶的id,創建/data/system/users/ 用戶id 目錄,并將用戶信息保存至其下的用戶id.xml 文件中。其內容包括1些基本的用戶信息。

用戶切換流程

用戶切換是通過調用ActivityManager的public boolean switchUser(int userId)方法進行。1般通過 ActivityManagerNative.getDefault().switchUser(int userId)進行調用。

在調用時,系統進行以下操作

  1. 檢查調用者是不是具有所需權限。
  2. 獲得切換目標用戶信息,并設定當前用戶為目標用戶
  3. WindowsManagerService設置當前用戶,鎖定屏幕
  1. 切換目標用戶狀態至啟動
  2. 廣播REPORT_USER_SWITCH_MSG和USER_SWITCH_TIMEOUT_MSG消息,設定用戶切換和切換超時時間(2秒),此超 時時間用于限定REPORT_USER_SWITCH_MSG廣播全程時間。
  3. 切換Activity堆棧至當前用戶
  4. 廣播ACTION_USER_SWITCHED消息,各接收組件進行相應操作。 大部份具體操作,比如存儲目錄切換、安全設置 切換等,都在此廣播落后行。

用戶移除流程

用戶移除是通過調用UserManager的 public boolean removeUser(int userHandle) 方法進行的。其具體實現一樣 是在UserManagerService的同名方法中。

在調用時,系統進行以下操作:

  1. 檢查調用者是不是具有所需權限。
  2. 對軟件包變化加鎖
  3. 將用戶id加入待移除用戶列表,將用戶狀態設為partial,這樣,在下次系統啟動時,會清除此用戶。
  4. 停止用戶,殺掉用戶相干進程。
  5. 發送用戶移除的廣播。廣播成功后,刪除用戶描寫文件和數據文件。
  6. 序列化用戶列表

另外UserManager還提供了 public void wipeUser(int userHandle) 方法,用于刪除單個用戶的所有數據,但保存 用戶賬號。 此方法目前對應的底層實現還沒有完成。

多用戶模式的API接口UserManager->UserManagerService

大致結構

與其它系統服務的實現類似,用戶管理也采取了經過Binder調用的遠程服務機制。UserManager為暴露給用戶的接 口,UserManagerService為接口的底層實現。其類圖以下所示:

android.os.UserManager

UserManager是暴露出來的利用程序接口。對普通利用程序,提供用戶數查詢,用戶狀態判斷和用戶序列號查詢 等基本功能。 普通利用沒有用戶操作權限。

對系統利用,UserManager提供了創建/刪除/擦除用戶、用戶信息獲得、用戶句柄獲得等用戶操作的接口。均由遠 程調用UserManagerService服務的對應方法實現。

isUserAGoat()

UserManager中提供了1個名為isUserAGoat()的方法。源碼中此方法直接返回了false。此方法的加入純潔是為了給 枯燥的編程生活帶來1絲樂趣,以便寫出:

[java] view plaincopy
  1. while(!isUserAGoat()){  
  2.    
  3. }  


這樣的語句。

com.android.server.pm.UserManagerService

與其它大部份Service1樣,UserManagerService的實現采取了 單例模式。在服務中,由組成為UserInfo類的散列 表mUsers保護所有的用戶狀態。

mUsers在系統啟動時由/data/system/users/userlist.xml讀取生成,并在運行期間動態改變。所有用戶的添加、刪 除操作,都終究序列化回此文件中。

com.android.server.am.ActivityManagerService

ActivityManagerService目前加入了多用戶支持。負責保護裝備中存在的所有用戶狀態。服務以下述變量來記錄當 前處于“啟動”狀態的用戶。

[java] view plaincopy
  1. /** 
  2.      * Which uses have been started, so are allowed to run code. 
  3.      */  
  4.     final SparseArray mStartedUsers = new SparseArray();  
  5.    
  6.     /** 
  7.      * LRU list of history of current users.  Most recently current is at the end. 
  8.      */  
  9.     final ArrayList mUserLru = new ArrayList();  
  10.    
  11.     /** 
  12.      * Constant array of the users that are currently started. 
  13.      */  
  14.     int[] mStartedUserArray = new int[] { 0 };  


用戶的啟動狀態對象為com.android.server.am.UserStartedState。其中指定的用戶狀態有4種:

  • public final static int STATE_BOOTING = 0; //用戶啟動
  • public final static int STATE_RUNNING = 1; //運行中
  • public final static int STATE_STOPPING = 2; //停止中
  • public final static int STATE_SHUTDOWN = 3; //用戶關閉狀態

完全的用戶生命周期為:
BOOTING->RUNNING->STOPPING->SHUTDOWN

用戶必須處于RUNNING狀態時,才能作為切換的目標用戶。所以在用戶切換流程中,首先要判斷當前用戶的狀態, 并啟動STOPPING/SHUTDOWN狀態的用戶。

多用戶模式的牽涉面

鎖屏界面

用戶最早體驗到多用戶的入口位置即為鎖屏界面。鎖屏界面中加入了用戶切換組件: KeyguardMultiUserSelectorView類。

該類在裝備允許多用戶存在的情況下,顯示當前所有用戶的列表。并在用戶進行選擇后,調用 ActivityManagerNative.getDefault().switchUser(int userId)方法進行用戶切換。

外部存儲

對每一個用戶,Android都為其分配了單獨的存儲空間。標準的支持多用戶的外部存儲空間是由init.rc定義的環境 變量所指定:

[java] view plaincopy
  1. # See storage config details at <a href="http://source.android.com/tech/storage/">http://source.android.com/tech/storage/</a>  
  2. mkdir /mnt/shell/emulated 0700 shell shell  
  3. mkdir /storage/emulated 0555 root root  
  4.    
  5. export EXTERNAL_STORAGE /storage/emulated/legacy  
  6. export EMULATED_STORAGE_SOURCE /mnt/shell/emulated  
  7. export EMULATED_STORAGE_TARGET /storage/emulated  
  8.    
  9. # Support legacy paths  
  10. symlink /storage/emulated/legacy /sdcard  
  11. symlink /storage/emulated/legacy /mnt/sdcard  
  12. symlink /storage/emulated/legacy /storage/sdcard0  
  13. symlink /mnt/shell/emulated/0 /storage/emulated/legacy  


在Dalvik虛擬機初始化的進程中,會以dalvik_system_Zygote.cpp中的mountEmulatedStorage函數,使用帶有 MS_BIND參數的mount命令, 將用戶對應的外部存儲卡目錄mount到上述定義的TARGET目錄下。其判斷利用userid的 方式為: 以當前利用的uid/100000,取得對應的userid,這段邏輯位于system/core/libcutils/multiuser.c中。

而Environment類中相應的獲得外部存儲目錄的方法,也是由上述環境變量所取得。對每一個用戶,其標準外部存 儲路徑為:

EMULATED_STORAGE_TARGET/userid/

比如:

/storage/emulated/0 為主用戶的外部存儲路徑。

包管理(PackageManagerService)

在多用戶環境下,所有用戶安裝的利用依然同之前1樣,放置于/data/app目錄下。但本來/data/data的數據存儲位 置目前僅對主用戶有效,其余用戶的數據存儲目錄則位于/data/user/用戶id/目錄下。 此目錄的創建是在創建用戶 時由前述的MountService完成的。

對每一個用戶,系統都會以PackageuserState類來保護其安裝的軟件狀態。此列表以散列表的情勢存在,由 PackageSettingBase類保護。所有的包――用戶關系和狀態終究依然序列化至/data/system/package.xml中,并保存 /data/system/package-backup.xml作為備份。

可能的發展

Guest用戶的實現

目前代碼中已存在諸如 isGuestEnabled() 之類的方法。但沒有對開發公然,可以預計今后會加入Guest用戶, 實現“隨手玩玩”模式

生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产视频久久久久 | 精品久久久久国产免费 | 欧美成人久久久免费播放 | 午夜视频在线播放 | 精品国产欧美另类一区 | 手机看片日韩日韩国产在线看 | 九月婷婷天天澡天天添天天爽 | 亚洲国产激情在线一区 | 久草在线成人 | 国产精品一区二区三区高清在线 | 国产人成久久久精品 | 天天天做天天天天爱天天想 | 亚洲不卡视频在线观看 | 影音先锋色成人资源网站 | 最近中文字幕更新免费 | 日本护士一级毛片 | 欧美三级在线观看视频 | 在线观看的黄色网址 | 伊人色婷婷 | 国产精品区一区二区免费 | 免费看黄的网址 | 影音先锋 色天使 | 97欧美在线看欧美视频免费 | 在线看中文字幕 | 国产欧美亚洲三区久在线观看 | 久久在线视频播放 | 欧美一区二区三区免费高 | 欧美理伦视频 | 国产精品第一 | 日产国产欧美视频一区精品 | 亚洲一区二区三区四区五区六区 | 日本wwwxxxx| 麻豆精品成人免费国产片 | 亚洲码欧美码一区二区三区 | 亚洲欧美日韩综合一区 | 欧美日韩视频一区二区三区 | 毛片免费观看视频 | 亚洲日本一区二区 | 激情粉嫩精品国产尤物 | 欧美一级欧美一级高清 | 成人老司机深夜福利久久 |