日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android關(guān)鍵字persistent詳細分析

瀏覽:204日期:2022-09-19 18:14:45
Android關(guān)鍵字persistent原理分析​

在Android程序開發(fā)時我們會接觸到一些系統(tǒng)為了某些功能而定義的關(guān)鍵屬性,例如在AndroidManifest.xml文件中

經(jīng)常看到的persistent、process等,下面是自己對persistent關(guān)鍵字的分析,直奔主題。

persistent屬性作用

該屬性的定義在frameworks/base/core/res/res/values/attrs_manifest.xml中,其定義如下:

<attr name='persistent' format='boolean' />

通過官方注釋我知道該屬性用于是否讓你的應用一直處于運行狀態(tài)(通常說的常駐內(nèi)存)。設(shè)置 該屬性為true的app具有如下特點:

在系統(tǒng)啟動的時候會被系統(tǒng)啟動起來 在該app被強制殺掉后系統(tǒng)會重新啟動該app,這種情況只針對系統(tǒng)內(nèi)置app,第三方安裝的app不會被重啟 使用

persistent屬性是用于application標簽上的,用法為:

AndroidManifest.xml

<application android:persistent='true|false'></application>

persistent的值默認為false

二、原理分析

通過第一點對persistent的功能說明后我們通過源碼來分析一下它的工作原理

1、persistent屬性的解析

該屬性的解析主要在app被安裝或者系統(tǒng)啟動的時候發(fā)生

解析代碼:

frameworks/base/core/java/com/android/content/pm/PackageParser.java

private boolean parseBaseApplication(Package owner, Resources res, XmlResourceParser parser, int flags, String[] outError) throws XmlPullParserException, IOException {final ApplicationInfo ai = owner.applicationInfo; //....................... if ((flags&PARSE_IS_SYSTEM) != 0) { if (sa.getBoolean( com.android.internal.R.styleable.AndroidManifestApplication_persistent, false)) { ai.flags |= ApplicationInfo.FLAG_PERSISTENT; } }//.............}

在解析完包信息之后系統(tǒng)會將解析好的所有包信息存放到PKMS中的mPackages的map中,而ApplicationInfo的flag中有一個bit位用于保存該app是否是persistent的。這里只是把保存persistent的flag設(shè)置為FLAG_PERSISTENT。在AndroidManifest設(shè)置了persistent為true的app是否能夠在被異常殺死后能夠得到重啟的權(quán)力需要取決于該app對應的ProcessRecord的persistent屬性,該屬性只有在你的app既在AndroidManifest中配置了persistent=“true”,又是系統(tǒng)內(nèi)置app時才會被設(shè)置為true。

2、系統(tǒng)啟動時啟動persistent為true的app

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

在系統(tǒng)啟動時ActivityManagerService的systemReady()方法會將所有在AndroidManifest設(shè)置了persistent為true的app拉起來

public void systemReady(final Runnable goingCallback) {......synchronized (this) { // Only start up encryption-aware persistent apps; once user is // unlocked we’ll come back around and start unaware apps startPersistentApps(PackageManager.MATCH_DIRECT_BOOT_AWARE); // Start up initial activity. mBooting = true; // Enable home activity for system user, so that the system can always boot if (UserManager.isSplitSystemUser()) { ComponentName cName = new ComponentName(mContext, SystemUserHomeActivity.class); try { AppGlobals.getPackageManager().setComponentEnabledSetting(cName, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, 0, UserHandle.USER_SYSTEM); } catch (RemoteException e) { throw e.rethrowAsRuntimeException(); } }......}

systemReady中調(diào)用了startPersistentApps() 方法

private void startPersistentApps(int matchFlags) { if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL) return; synchronized (this) { try { final List<ApplicationInfo> apps = AppGlobals.getPackageManager() .getPersistentApplications(STOCK_PM_FLAGS | matchFlags).getList(); for (ApplicationInfo app : apps) { if (!'android'.equals(app.packageName)) { addAppLocked(app, false, null /* ABI override */); } } } catch (RemoteException ex) { } } }

在startPersistentApps方法中首先是調(diào)用PackageManageServices的getPersistentApplications方法獲取到所有在AndroidManifest設(shè)置了persistent為true的app,然后調(diào)用addAppLocked方法去啟動他們。這樣在AndroidManifest設(shè)置了persistent為true的app就隨著系統(tǒng)的啟動而啟動了。

下面看一下getPersistentApplications方法,該方法調(diào)用了PKMS中的getPersistentApplicationsInternal方法。

該方法會遍歷mPackages中的所有app,并找到其中在AndroidManifest設(shè)置了persistent為true的應用。從代碼中可以看到,persistent為true并且是系統(tǒng)app的話一定會被選中,但是如果是第三方安裝的應用的話只能在非“安全模式”下才會被選中。

之后調(diào)用addAppLocked方法啟動app:

final ProcessRecord addAppLocked(ApplicationInfo info, boolean isolated, String abiOverride) { ProcessRecord app; //傳遞進來的isolated=false,所有一定會調(diào)用getProcessRecordLocked方法,但是由于是第一次啟動,所有返回的app = null if (!isolated) { app = getProcessRecordLocked(info.processName, info.uid, true); } else { app = null; } if (app == null) { //為新的app創(chuàng)建新的ProcessRecord對象 app = newProcessRecordLocked(info, null, isolated, 0); updateLruProcessLocked(app, false, null); updateOomAdjLocked(); } // This package really, really can not be stopped. try { //由于是開機第一次啟動,所以新的app的啟動狀態(tài)是將要被啟動狀態(tài),所以 //該app的停止狀態(tài)stoped被設(shè)置為false AppGlobals.getPackageManager().setPackageStoppedState( info.packageName, false, UserHandle.getUserId(app.uid)); } catch (RemoteException e) { } catch (IllegalArgumentException e) { Slog.w(TAG, 'Failed trying to unstop package ' + info.packageName + ': ' + e); } //在這里對persistent的app進行過濾,只有既是系統(tǒng)app,persistent為true的app才會在 //異常死亡之后被重啟 if ((info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) { app.persistent = true; app.maxAdj = ProcessList.PERSISTENT_PROC_ADJ; } //如果該app已經(jīng)啟動了,則不用處理,否則調(diào)用startProcessLocked方法啟動app。 //由于啟動app是異步進行的,會將正在啟動而還沒有啟動完成的app添加到 //mPersistentStartingProcesses列表中。當啟動完成后 再移除 if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) { mPersistentStartingProcesses.add(app); //啟動該app startProcessLocked(app, 'added application', app.processName, abiOverride, null /* entryPoint */, null /* entryPointArgs */); } return app; }}

接下來調(diào)用startProcessLocked方法啟動app進程,在app啟動完成后會在ActivityThread中調(diào)用AMS的attachApplication,將該app從mPersistentStartingProcesses中移除,并注冊一個死亡訃告監(jiān)聽器AppDeathRecipient,用于在app異常被殺后的處理工作。

3、app被異常結(jié)束后系統(tǒng)重新啟動persistent為true的app

進程啟動時為app注冊了一個死亡訃告,當該app被殺掉之后會調(diào)用AppDeathRecipient的binderDied方法,該方法會調(diào)用appDiedLocked方法進行善后處理,系統(tǒng)在進程死掉之后會對死掉的進程進行清理和資源回收,但是在這個過程中如果你的app是persistent的話會被重啟:

binderDied

| |——appDiedLocked | |——handleAppDiedLocked | |——cleanUpApplicationRecordLocked

在cleanUpApplicationRecordLocked中對persistent為true的app進行重啟

private final boolean cleanUpApplicationRecordLocked(ProcessRecord app, boolean restarting, boolean allowRestart, int index, boolean replacingPid) {............... //非persistent的app被殺死后就被清理掉 if (!app.persistent || app.isolated) { if (DEBUG_PROCESSES || DEBUG_CLEANUP) Slog.v(TAG_CLEANUP, 'Removing non-persistent process during cleanup: ' + app); if (!replacingPid) { removeProcessNameLocked(app.processName, app.uid, app); } if (mHeavyWeightProcess == app) { mHandler.sendMessage(mHandler.obtainMessage(CANCEL_HEAVY_NOTIFICATION_MSG, mHeavyWeightProcess.userId, 0)); mHeavyWeightProcess = null; } } else if (!app.removed) { // This app is persistent, so we need to keep its record around. // If it is not already on the pending app list, add it there // and start a new process for it. //該app是persistent的,需要對其進行重啟,并把它添加到正在啟動的列表中,并 //設(shè)置restart=true if (mPersistentStartingProcesses.indexOf(app) < 0) { mPersistentStartingProcesses.add(app); restart = true; } }....//經(jīng)過上面的過濾,會調(diào)用這個分支條件重啟persistent為true的app if (restart && !app.isolated) { // We have components that still need to be running in the // process, so re-launch it. if (index < 0) { ProcessList.remove(app.pid); } addProcessNameLocked(app); startProcessLocked(app, 'restart', app.processName); return true; } else if (app.pid > 0 && app.pid != MY_PID) { // Goodbye! boolean removed; synchronized (mPidsSelfLocked) { mPidsSelfLocked.remove(app.pid); mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app); } mBatteryStatsService.noteProcessFinish(app.processName, app.info.uid); if (app.isolated) { mBatteryStatsService.removeIsolatedUid(app.uid, app.info.uid); } app.setPid(0); } return false;}總結(jié) persistent的聲明在AndroidManifest.xml中的 t屬性,默認值為false persistent的聲明,必須該app是系統(tǒng)內(nèi)置應用,并且在AndroidManifest.xml中的聲明android:persisten = “true”,才能生效 persistent的聲明為true的內(nèi)置app被異常殺死的時候,系統(tǒng)會將其拉起重啟啟動

以上就是Android關(guān)鍵字persistent詳細分析的詳細內(nèi)容,更多關(guān)于Android關(guān)鍵字persistent的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产高清精品二区| 亚洲婷婷丁香| 麻豆免费精品视频| 久久一区视频| 精品三级在线| 日本一二区不卡| 天堂中文av在线资源库| 国产欧美一区二区三区精品酒店| 亚洲欧洲美洲av| 国产一区二区三区网| 亚洲黄色免费看| 亚洲二区在线| 蜜臀国产一区二区三区在线播放| 亚洲精品伊人| 欧美午夜三级| 久久精品国产精品亚洲毛片| 国精品产品一区| 日韩高清不卡| 亚洲欧美网站| 国产私拍福利精品视频二区| 欧美激情99| 久久国产成人午夜av影院宅| 欧美精品激情| 亚洲精选成人| 日本免费在线视频不卡一不卡二| 国产精品黄网站| 国产精品久久久久久久久久10秀| 国产网站在线| 老牛影视一区二区三区| 91九色综合| 麻豆mv在线观看| 亚洲综合二区| 国产精品亚洲一区二区在线观看| 水蜜桃久久夜色精品一区| 性欧美69xoxoxoxo| 日韩高清国产一区在线| 精品深夜福利视频| 国产真实久久| 日韩精品国产精品| 久久99精品久久久久久园产越南| 欧美羞羞视频| 亚洲乱码久久| 国产成人精选| 视频一区二区三区中文字幕| 国产精品美女午夜爽爽| 日韩电影免费网址| 蜜臀av亚洲一区中文字幕| 国产精品久久久久久久久久齐齐 | 日韩中文字幕无砖| 欧美欧美黄在线二区| 日韩欧美午夜| 亚洲精品日本| 亚洲精品**中文毛片| 亚洲专区视频| 亚洲不卡系列| 日韩高清成人在线| 欧美一级精品| 麻豆国产精品视频| 好吊视频一区二区三区四区| 欧美国产另类| 国产精品美女| 中文在线资源| 日韩avvvv在线播放| 亚洲高清毛片| 久久不卡日韩美女| 蜜臀va亚洲va欧美va天堂| www在线观看黄色| 日本色综合中文字幕| 欧美成人综合| 精品国产乱码久久久久久樱花| 蜜芽一区二区三区| 亚洲天堂免费电影| 国产精品久久久久9999高清 | 在线日韩欧美| 久久精品免视看国产成人| 天堂成人免费av电影一区| av中文资源在线资源免费观看| 综合欧美精品| 亚洲先锋成人| 国产成人久久精品一区二区三区| 中文字幕亚洲精品乱码| 99久久夜色精品国产亚洲1000部 | 亚洲ww精品| 五月天久久久| 国产aⅴ精品一区二区三区久久| 亚洲精品裸体| 女同性一区二区三区人了人一| 精品国产黄a∨片高清在线| 日韩久久一区| 久久高清免费观看| 欧美特黄一级大片| 成人台湾亚洲精品一区二区| 日韩免费精品| 蜜臀精品一区二区三区在线观看| 久久久夜夜夜| 视频在线不卡免费观看| 国产精品jk白丝蜜臀av小说| 日韩精品视频网站| 亚洲精品伊人| 一级成人国产| 国产亚洲网站| 亚洲午夜精品久久久久久app| av高清不卡| 久久天堂影院| 麻豆国产精品视频| 国产精品a级| 清纯唯美亚洲综合一区| 亚洲精品观看| 美女精品在线| 石原莉奈一区二区三区在线观看| 亚洲激情国产| 国产精品2区| 欧美国产偷国产精品三区| 黑丝一区二区三区| 在线精品视频在线观看高清| 欧美日韩色图| 99国产精品久久久久久久成人热 | 国产精品7m凸凹视频分类| 精品一区视频| 欧美aⅴ一区二区三区视频| 国产亚洲精品精品国产亚洲综合 | 蜜臀a∨国产成人精品| 精品一区不卡| 97精品国产福利一区二区三区| 成人在线视频免费| 婷婷精品进入| 亚洲免费资源| 国产 日韩 欧美 综合 一区| 99精品综合| 91麻豆精品激情在线观看最新| 久久久久久色 | 日本不卡在线视频| 婷婷精品在线| 日韩精品1区| 欧美日韩国产探花| 麻豆精品国产91久久久久久| 日韩啪啪电影网| 肉色欧美久久久久久久免费看| 欧美精品不卡| 国产成人精选| 99久久精品网站| 黄色日韩在线| 亚洲资源网站| 国产欧美69| 精品久久91| 日韩在线观看不卡| 日韩不卡视频在线观看| av亚洲在线观看| 日韩视频一二区| 免费亚洲一区| 黄色在线网站噜噜噜| 狠狠爱成人网| 日本不卡一二三区黄网| 久久精品一区| 欧美成人高清| 日本不卡视频一二三区| 美女久久久久久| 久久亚洲国产| 亚洲精品一级| 国内自拍视频一区二区三区| 欧美jjzz| 日韩精品视频在线看| 国产伊人久久| 伊人影院久久| 国产美女亚洲精品7777| se01亚洲视频 | 亚洲欧美日本日韩| 国产日韩在线观看视频| 亚洲人成在线网站| 亚洲人成精品久久久| 久久99久久人婷婷精品综合| 91精品一区二区三区综合在线爱| 在线亚洲欧美| 国产高清精品二区| 亚洲欧美一区在线| 国产欧美日韩一级| 午夜欧美在线| 国产欧美日韩免费观看| 91精品亚洲| 国产欧美欧美| 亚洲一级黄色| 日韩不卡一二三区| 欧美gv在线| 一区二区国产精品| 国产不卡精品| 男女性色大片免费观看一区二区| 欧美成a人片免费观看久久五月天| 激情欧美丁香| 国产亚洲久久| 国产视频一区三区| 国产videos久久| 日韩国产在线一| 99久久精品网站| 欧美交a欧美精品喷水| 欧美日韩国产免费观看| 精品免费av一区二区三区| 天堂va蜜桃一区二区三区| 日韩影院二区| 国产乱子精品一区二区在线观看 | 亚洲天堂日韩在线|