Android5.1系統(tǒng)通過(guò)包名給應(yīng)用開(kāi)放系統(tǒng)權(quán)限的方法
常用的給應(yīng)用開(kāi)放系統(tǒng)權(quán)限的方法是直接將該應(yīng)用做成系統(tǒng)應(yīng)用(即在AndroidManifest.xml文件里加上:android:sharedUserId="android.uid.system"),但是這種做法限制了應(yīng)用本身的自由,也就是說(shuō)經(jīng)過(guò)系統(tǒng)簽名后的系統(tǒng)應(yīng)用只能夠在對(duì)應(yīng)的Android平臺(tái)上安裝使用,無(wú)法向其他應(yīng)用一樣放到Android市場(chǎng)里兼容所有的Android設(shè)備。
現(xiàn)在此介紹一種通過(guò)修改Android平臺(tái)系統(tǒng)層代碼,根據(jù)指定的應(yīng)用包名給對(duì)應(yīng)的應(yīng)用在該平臺(tái)上開(kāi)放系統(tǒng)權(quán)限,這樣既不應(yīng)用應(yīng)用的兼容性,又解決了應(yīng)用想調(diào)用一些系統(tǒng)層接口而沒(méi)有權(quán)限的矛盾。
該方法的核心是:在ActivityManagerService的startProcessLocked
接口中把uid和gid都改為0.
需要開(kāi)放系統(tǒng)權(quán)限的包名:
1、net.forclass.fcstudent
2、com.ckl.launcher
3、com.creative.fcstudent
修改步驟:
1、應(yīng)用安裝在設(shè)備上之后,點(diǎn)擊啟動(dòng)必定會(huì)調(diào)用ActivityManagerService的startProcessLocked接口來(lái)開(kāi)啟一個(gè)新的進(jìn)程,而給應(yīng)用開(kāi)放系統(tǒng)權(quán)限目的其實(shí)就是使應(yīng)用能夠成為超級(jí)應(yīng)用,運(yùn)行在系統(tǒng)進(jìn)程中,這樣我們只需要在startProcessLocked接口里面將應(yīng)用的uid修改為0即可。
ActivityManagerService.java (frameworks\base\services\core\java\com\android\server\am) final ProcessRecord startProcessLocked(String processName, ApplicationInfo info, boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName, boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge, String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) { // modified by haming patch begin, configure system permission for some special application. if ("net.forclass.fcstudent".equals(info.packageName) || "com.ckl.launcher".equals(info.packageName) || "com.creative.fcstudent".equals(info.packageName) || "com.hampoo.hampoointerfacetestdemo".equals(info.packageName)){ info.uid = 0; } // modified by haming patch end. long startTime = SystemClock.elapsedRealtime(); ProcessRecord app; ...... // 此處省略好多行 checkTime(startTime, "startProcess: stepping in to startProcess"); startProcessLocked( // 再次調(diào)用startProcessLocked重載方法 app, hostingType, hostingNameStr, abiOverride, entryPoint, entryPointArgs); checkTime(startTime, "startProcess: done starting proc!"); return (app.pid != 0) ? app : null; }在重載方法startProcessLocked(ProcessRecord app, String hostingType,String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs)里面將應(yīng)用的gid也改為0: private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) { long startTime = SystemClock.elapsedRealtime(); ...... // 此處省略好多行 try { int uid = app.uid; int[] gids = null; int mountExternal = Zygote.MOUNT_EXTERNAL_NONE; if (!app.isolated) { ...... // 此處省略好多行 // modified by haming patch begin, configure system permission for some special application. if ("net.forclass.fcstudent".equals(app.info.packageName) || "com.ckl.launcher".equals(app.info.packageName) || "com.creative.fcstudent".equals(app.info.packageName) || "com.hampoo.hampoointerfacetestdemo".equals(app.info.packageName)){ SystemProperties.set("sys.permission.enable", "true"); // 設(shè)置一個(gè)系統(tǒng)屬性,在Zygote進(jìn)行判斷是否拋出異常 gids[0] = 0; gids[1] = 0; } else { gids[0] = UserHandle.getSharedAppGid(UserHandle.getAppId(uid)); gids[1] = UserHandle.getUserGid(UserHandle.getUserId(uid)); } // modified by haming patch end. } ...... // 此處省略好多行 } catch (RuntimeException e) { // XXX do better error recovery. app.setPid(0); mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); } Slog.e(TAG, "Failure starting process " + app.processName, e); } }
2、ZygoteConnection.java里的applyUidSecurityPolicy(Arguments args, Credentials peer, String peerSecurityContext)接口會(huì)對(duì)進(jìn)程id進(jìn)行判斷,如果小于Process.SYSTEM_UID(1000)則認(rèn)為是非法,而zygote是具有root權(quán)限的唯一server,所有在判斷之后就可以通過(guò)讀取前面設(shè)定的系統(tǒng)屬性“sys.permission.enable”的值來(lái)決定是否拋出異常。
ZygoteConnection.java (frameworks\base\core\java\com\android\internal\os) private static void applyUidSecurityPolicy(Arguments args, Credentials peer, String peerSecurityContext) throws ZygoteSecurityException { int peerUid = peer.getUid(); if (peerUid == 0) { // Root can do what it wants } else if (peerUid == Process.SYSTEM_UID ) { // System UID is restricted, except in factory test mode String factoryTest = SystemProperties.get("ro.factorytest"); boolean uidRestricted; /* In normal operation, SYSTEM_UID can only specify a restricted * set of UIDs. In factory test mode, SYSTEM_UID may specify any uid. */ uidRestricted = !(factoryTest.equals("1") || factoryTest.equals("2")); // modified by haming patch begin, configure system permission for some special application. if (uidRestricted && args.uidSpecified && (args.uid < Process.SYSTEM_UID)) { if (!SystemProperties.getBoolean("sys.permission.enable", false)){ throw new ZygoteSecurityException( "System UID may not launch process with UID < " + Process.SYSTEM_UID); } else { SystemProperties.set("sys.permission.enable", "false"); } } // modified by haming patch end. } else { // Everything else if (args.uidSpecified || args.gidSpecified || args.gids != null) { throw new ZygoteSecurityException( "App UIDs may not specify uid's or gid's"); } } ...... // 此處省略好多行 }
總結(jié)
以上所述是小編給大家介紹的Android5.1系統(tǒng)通過(guò)包名給應(yīng)用開(kāi)放系統(tǒng)權(quán)限的方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言!
- Android Studio 修改應(yīng)用包名實(shí)例詳解
- java批量采集豌豆莢網(wǎng)站Android應(yīng)用圖標(biāo)和包名
- Android編程獲取APP應(yīng)用程序基本信息輔助類(lèi)【APP名稱(chēng)、包名、圖標(biāo),版本號(hào)等】
- Android獲取應(yīng)用版本號(hào)與版本名稱(chēng)
- Android獲取手機(jī)型號(hào)/系統(tǒng)版本號(hào)/App版本號(hào)等信息實(shí)例講解
- Android獲取當(dāng)前手機(jī)網(wǎng)絡(luò)類(lèi)型(2g、3g、4g、wifi)以及手機(jī)型號(hào)、版本號(hào)代碼
- Android通過(guò)aapt命令獲取apk詳細(xì)信息(包括:文件包名,版本號(hào),SDK等信息)
- 使用Java代碼來(lái)比較Android客戶端版本號(hào)
- Android 獲取未安裝的APK圖標(biāo)、版本號(hào)、包名等信息方法
- Android編程實(shí)現(xiàn)應(yīng)用獲取包名、版本號(hào)、權(quán)限等信息的方法
相關(guān)文章
Android線程的優(yōu)先級(jí)設(shè)置方法技巧
對(duì)于Android平臺(tái)上的線程優(yōu)先級(jí)設(shè)置來(lái)說(shuō)可以處理很多并發(fā)線程的阻塞問(wèn)題,比如很多無(wú)關(guān)緊要的線程會(huì)占用大量的CPU時(shí)間,雖然通過(guò)了MultiThread來(lái)解決慢速I(mǎi)/O但是合理分配優(yōu)先級(jí)對(duì)于并發(fā)編程來(lái)說(shuō)十分重要2016-02-02Android實(shí)現(xiàn)按鈕點(diǎn)擊效果
本文主要介紹了Android實(shí)現(xiàn)按鈕點(diǎn)擊效果:第一次點(diǎn)擊變色,第二次恢復(fù)。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02Kotlin中協(xié)程的創(chuàng)建過(guò)程詳析
使用協(xié)程的專(zhuān)業(yè)開(kāi)發(fā)者中有超過(guò) 50% 的人反映使用協(xié)程提高了工作效率,下面這篇文章主要給大家介紹了關(guān)于Kotlin中協(xié)程創(chuàng)建過(guò)程的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01Android getSystemService用法實(shí)例總結(jié)
這篇文章主要介紹了Android getSystemService用法,結(jié)合實(shí)例形式總結(jié)分析了getSystemService獲取系統(tǒng)Service的相關(guān)使用方法與注意事項(xiàng),需要的朋友可以參考下2016-01-01Android?Activity共享元素動(dòng)畫(huà)示例解析
這篇文章主要為大家介紹了Android?Activity共享元素動(dòng)畫(huà)示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Android自定義驗(yàn)證碼輸入框的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Android自定義驗(yàn)證碼輸入框的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-02-02Android學(xué)習(xí)教程之下拉刷新實(shí)現(xiàn)代碼(11)
這篇文章主要為大家詳細(xì)介紹了Android學(xué)習(xí)教程之下拉刷新實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11