日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開源 > 綜合技術(shù) > Android 多用戶模式原理和實(shí)現(xiàn)介紹

Android 多用戶模式原理和實(shí)現(xiàn)介紹

來(lái)源:程序員人生   發(fā)布時(shí)間:2015-02-02 08:25:24 閱讀次數(shù):12059次

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

多用戶模式的啟用

系統(tǒng)判斷當(dāng)前裝備是不是支持多用戶模式的根據(jù)是配置文件config.xml中的config_multiuserMaximumUsers配置項(xiàng)。 其取值為整型,決定著當(dāng)前裝備支持的最大用戶上限。默許值為1,即不支持多用戶。如需啟用多用戶,則設(shè)置此值 為大于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.     }  


多用戶相干操作流程

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

用戶添加流程

用戶添加是通過(guò)調(diào)用UserManager的public UserInfo createUser(String name, int flags)方法進(jìn)行的。其具體實(shí)現(xiàn)在UserManagerService的同名方法中。

在調(diào)用時(shí),系統(tǒng)進(jìn)行以下操作:

  1. 檢查調(diào)用者是不是具有所需權(quán)限。
  2. 對(duì)安裝和軟件包流程加鎖,保證線程安全
  3. 檢查多用戶環(huán)境是不是到達(dá)用戶數(shù)量限制。如果沒有,創(chuàng)建用戶實(shí)例
  4. 為新用戶創(chuàng)建相干目錄
  5. 序列化用戶列表
  6. 發(fā)送用戶建立廣播,MountService在收到此廣播后,調(diào)用createEmulatedVolumeForUserLocked方法為用戶建 立相應(yīng)的數(shù)據(jù)目錄

用戶的保存

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

用戶切換流程

用戶切換是通過(guò)調(diào)用ActivityManager的public boolean switchUser(int userId)方法進(jìn)行。1般通過(guò) ActivityManagerNative.getDefault().switchUser(int userId)進(jìn)行調(diào)用。

在調(diào)用時(shí),系統(tǒng)進(jìn)行以下操作

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

用戶移除流程

用戶移除是通過(guò)調(diào)用UserManager的 public boolean removeUser(int userHandle) 方法進(jìn)行的。其具體實(shí)現(xiàn)一樣 是在UserManagerService的同名方法中。

在調(diào)用時(shí),系統(tǒng)進(jìn)行以下操作:

  1. 檢查調(diào)用者是不是具有所需權(quán)限。
  2. 對(duì)軟件包變化加鎖
  3. 將用戶id加入待移除用戶列表,將用戶狀態(tài)設(shè)為partial,這樣,在下次系統(tǒng)啟動(dòng)時(shí),會(huì)清除此用戶。
  4. 停止用戶,殺掉用戶相干進(jìn)程。
  5. 發(fā)送用戶移除的廣播。廣播成功后,刪除用戶描寫文件和數(shù)據(jù)文件。
  6. 序列化用戶列表

另外UserManager還提供了 public void wipeUser(int userHandle) 方法,用于刪除單個(gè)用戶的所有數(shù)據(jù),但保存 用戶賬號(hào)。 此方法目前對(duì)應(yīng)的底層實(shí)現(xiàn)還沒有完成。

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

大致結(jié)構(gòu)

與其它系統(tǒng)服務(wù)的實(shí)現(xiàn)類似,用戶管理也采取了經(jīng)過(guò)Binder調(diào)用的遠(yuǎn)程服務(wù)機(jī)制。UserManager為暴露給用戶的接 口,UserManagerService為接口的底層實(shí)現(xiàn)。其類圖以下所示:

android.os.UserManager

UserManager是暴露出來(lái)的利用程序接口。對(duì)普通利用程序,提供用戶數(shù)查詢,用戶狀態(tài)判斷和用戶序列號(hào)查詢 等基本功能。 普通利用沒有用戶操作權(quán)限。

對(duì)系統(tǒng)利用,UserManager提供了創(chuàng)建/刪除/擦除用戶、用戶信息獲得、用戶句柄獲得等用戶操作的接口。均由遠(yuǎn) 程調(diào)用UserManagerService服務(wù)的對(duì)應(yīng)方法實(shí)現(xiàn)。

isUserAGoat()

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

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


這樣的語(yǔ)句。

com.android.server.pm.UserManagerService

與其它大部份Service1樣,UserManagerService的實(shí)現(xiàn)采取了 單例模式。在服務(wù)中,由組成為UserInfo類的散列 表mUsers保護(hù)所有的用戶狀態(tài)。

mUsers在系統(tǒng)啟動(dòng)時(shí)由/data/system/users/userlist.xml讀取生成,并在運(yùn)行期間動(dòng)態(tài)改變。所有用戶的添加、刪 除操作,都終究序列化回此文件中。

com.android.server.am.ActivityManagerService

ActivityManagerService目前加入了多用戶支持。負(fù)責(zé)保護(hù)裝備中存在的所有用戶狀態(tài)。服務(wù)以下述變量來(lái)記錄當(dāng) 前處于“啟動(dòng)”狀態(tài)的用戶。

[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 };  


用戶的啟動(dòng)狀態(tài)對(duì)象為com.android.server.am.UserStartedState。其中指定的用戶狀態(tài)有4種:

  • public final static int STATE_BOOTING = 0; //用戶啟動(dòng)
  • public final static int STATE_RUNNING = 1; //運(yùn)行中
  • public final static int STATE_STOPPING = 2; //停止中
  • public final static int STATE_SHUTDOWN = 3; //用戶關(guān)閉狀態(tài)

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

用戶必須處于RUNNING狀態(tài)時(shí),才能作為切換的目標(biāo)用戶。所以在用戶切換流程中,首先要判斷當(dāng)前用戶的狀態(tài), 并啟動(dòng)STOPPING/SHUTDOWN狀態(tài)的用戶。

多用戶模式的牽涉面

鎖屏界面

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

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

外部存儲(chǔ)

對(duì)每一個(gè)用戶,Android都為其分配了單獨(dú)的存儲(chǔ)空間。標(biāo)準(zhǔn)的支持多用戶的外部存儲(chǔ)空間是由init.rc定義的環(huán)境 變量所指定:

[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虛擬機(jī)初始化的進(jìn)程中,會(huì)以dalvik_system_Zygote.cpp中的mountEmulatedStorage函數(shù),使用帶有 MS_BIND參數(shù)的mount命令, 將用戶對(duì)應(yīng)的外部存儲(chǔ)卡目錄mount到上述定義的TARGET目錄下。其判斷利用userid的 方式為: 以當(dāng)前利用的uid/100000,取得對(duì)應(yīng)的userid,這段邏輯位于system/core/libcutils/multiuser.c中。

而Environment類中相應(yīng)的獲得外部存儲(chǔ)目錄的方法,也是由上述環(huán)境變量所取得。對(duì)每一個(gè)用戶,其標(biāo)準(zhǔn)外部存 儲(chǔ)路徑為:

EMULATED_STORAGE_TARGET/userid/

比如:

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

包管理(PackageManagerService)

在多用戶環(huán)境下,所有用戶安裝的利用依然同之前1樣,放置于/data/app目錄下。但本來(lái)/data/data的數(shù)據(jù)存儲(chǔ)位 置目前僅對(duì)主用戶有效,其余用戶的數(shù)據(jù)存儲(chǔ)目錄則位于/data/user/用戶id/目錄下。 此目錄的創(chuàng)建是在創(chuàng)建用戶 時(shí)由前述的MountService完成的。

對(duì)每一個(gè)用戶,系統(tǒng)都會(huì)以PackageuserState類來(lái)保護(hù)其安裝的軟件狀態(tài)。此列表以散列表的情勢(shì)存在,由 PackageSettingBase類保護(hù)。所有的包――用戶關(guān)系和狀態(tài)終究依然序列化至/data/system/package.xml中,并保存 /data/system/package-backup.xml作為備份。

可能的發(fā)展

Guest用戶的實(shí)現(xiàn)

目前代碼中已存在諸如 isGuestEnabled() 之類的方法。但沒有對(duì)開發(fā)公然,可以預(yù)計(jì)今后會(huì)加入Guest用戶, 實(shí)現(xiàn)“隨手玩玩”模式

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 免费视频亚洲 | 极品麻豆 | 亚洲免费福利视频 | 国产黄色大片 | 欧美精品在线一区二区 | 亚洲福利在线观看 | 男人天堂电影 | 国产精品日韩欧美一区二区 | 国产一区二区三区视频 | 国产精品精品久久久 | 日日夜夜天天干 | a级网站 | 亚洲精品视频二区 | 欧美视频一区二区 | 亚洲色图第一区 | 88xx永久免费看大片 | 精久久 | 国产日韩精品视频 | 中文字幕精品久久一区二区三区 | 亚洲网在线| 欧美极品一区二区三区 | 亚洲欧美日韩国产综合 | 中文字幕第一页在线 | 中文字幕国产在线 | 精品国产麻豆 | 丰满少妇久久久久久久 | 黄色小视频在线播放 | 国产精品自拍视频 | 免费国产在线视频 | 成年人免费网站 | 午夜视频一区二区三区 | 玖玖精品在线 | 夜夜操导航 | 久久久网站 | 午夜影院毛片 | 国产成人精品一区二区三区 | 久久久国产精品一区 | 久久com| 日韩国产 | 亚洲综合久久久 | 3atv一区二区三区 |