日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android:persistent属性

發布時間:2025/4/5 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android:persistent属性 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么寫這篇文章呢?前段時間在研究telephony時,一直沒有在framework下發現對telephony的初始化(PhoneFactory.java中的makeDefaultPhones函數)的調用。結果全局搜索之后發現在application PhoneApp(packages/apps/Phone)中調用了。但是application PhoneApp既沒有被Broadcast喚醒,也沒有被其他service調用,那么是android是通過什么方式來啟動PhoneApp,所以就發現了屬性android:persistent。

?

??? 在AndroidManifest.xml定義中,application有這么一個屬性android:persistent,根據字面意思來理解就是說該應用是可持久的,也即是常駐的應用。其實就是這么個理解,被android:persistent修飾的應用會在系統啟動之后被AM啟動。

?

??? AM首先去PM(PackageManagerService)中去查找設置了android:persistent的應用。

?

[c-sharp] view plaincopyprint?
  • public?void?systemReady(final?Runnable?goingCallback)?{??
  • ????????????if?(mFactoryTest?!=?SystemServer.FACTORY_TEST_LOW_LEVEL)?{??
  • ????????????????try?{??
  • ????????????????????List?apps?=?AppGlobals.getPackageManager().??
  • ????????????????????????getPersistentApplications(STOCK_PM_FLAGS);??
  • ????????????????????if?(apps?!=?null)?{??
  • ????????????????????????int?N?=?apps.size();??
  • ????????????????????????int?i;??
  • ????????????????????????for?(i=0;?i<N;?i++)?{??
  • ????????????????????????????ApplicationInfo?info??
  • ????????????????????????????????=?(ApplicationInfo)apps.get(i);??
  • ????????????????????????????if?(info?!=?null?&&??
  • ????????????????????????????????????!info.packageName.equals("android"))?{??
  • ????????????????????????????????addAppLocked(info);??
  • ????????????????????????????}??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????}?catch?(RemoteException?ex)?{??
  • ????????????????????//?pm?is?in?same?process,?this?will?never?happen. ??
  • ????????????????}??
  • ????????????}?????
  • }??
  • public void systemReady(final Runnable goingCallback) {if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {try {List apps = AppGlobals.getPackageManager().getPersistentApplications(STOCK_PM_FLAGS);if (apps != null) {int N = apps.size();int i;for (i=0; i<N; i++) {ApplicationInfo info= (ApplicationInfo)apps.get(i);if (info != null &&!info.packageName.equals("android")) {addAppLocked(info);}}}} catch (RemoteException ex) {// pm is in same process, this will never happen.}} }

    ?

    ??? 假如該被android:persistent修飾的應用此時并未運行的話,那么AM將調用startProcessLocked啟動該app,關于startProcessLocked不再描述,另外一篇文章《How to start a new process for Android?》中做了詳細的介紹。

    ?

    ??? app的啟動過程就是啟動app所在的package對應的進程。

    ?

    ???

    [c-sharp] view plaincopyprint?
  • final?ProcessRecord?addAppLocked(ApplicationInfo?info)?{??
  • ????????ProcessRecord?app?=?getProcessRecordLocked(info.processName,?info.uid);??
  • ????????if?(app?==?null)?{??
  • ????????????app?=?newProcessRecordLocked(null,?info,?null);??
  • ????????????mProcessNames.put(info.processName,?info.uid,?app);??
  • ????????????updateLruProcessLocked(app,?true,?true);??
  • ????????}??
  • ????????if?((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))??
  • ????????????????==?(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))?{??
  • ????????????app.persistent?=?true;??
  • ????????????app.maxAdj?=?CORE_SERVER_ADJ;??
  • ????????}??
  • ????????if?(app.thread?==?null?&&?mPersistentStartingProcesses.indexOf(app)?<?0)?{??
  • ????????????mPersistentStartingProcesses.add(app);??
  • ????????????startProcessLocked(app,?"added?application",?app.processName);??
  • ????????}??
  • ????????return?app;??
  • ????}??
  • final ProcessRecord addAppLocked(ApplicationInfo info) {ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);if (app == null) {app = newProcessRecordLocked(null, info, null);mProcessNames.put(info.processName, info.uid, app);updateLruProcessLocked(app, true, true);}if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))== (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {app.persistent = true;app.maxAdj = CORE_SERVER_ADJ;}if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {mPersistentStartingProcesses.add(app);startProcessLocked(app, "added application", app.processName);}return app;}

    ?

    ??? 下面介紹app所在的package對應的進程啟動完成之后,app是如何被create的。

    ?

    ??? 從文章《How to start a new process for Android?》中可知,zygote在創建新的進程均會啟動它的mainThread android.app.ActivityThread,因此我們從ActivityThread的main函數中接著分析app的create過程。

    ??? 在main中有下面這個操作

    [c-sharp] view plaincopyprint?
  • thread.attach(false);??
  • thread.attach(false);

    ?

    ??? 在attach過程中,ActivityThread會將對應的application attach到AM中去,交與AM去管理。這里需要注意一個變量

    [c-sharp] view plaincopyprint?
  • final?ApplicationThread?mAppThread?=?new?ApplicationThread();??
  • final ApplicationThread mAppThread = new ApplicationThread();

    ?

    ??? mAppThread是一個ApplicationThread對象,mAppThread可以看作是當前進程主線程的核心,它負責處理本進程與其他進程(主要是AM)之間的通信,同時通過attachApplication將mAppThread的代理Binder傳遞給AM。

    [c-sharp] view plaincopyprint?
  • private?final?void?attach(boolean?system)?{??
  • ????????sThreadLocal.set(this);??
  • ????????mSystemThread?=?system;??
  • ????????if?(!system)?{??
  • ????????????ViewRoot.addFirstDrawHandler(new?Runnable()?{??
  • ????????????????public?void?run()?{??
  • ????????????????????ensureJitEnabled();??
  • ????????????????}??
  • ????????????});??
  • ????????????android.ddm.DdmHandleAppName.setAppName("<pre-initialized>");??
  • ????????????RuntimeInit.setApplicationObject(mAppThread.asBinder());??
  • ????????????IActivityManager?mgr?=?ActivityManagerNative.getDefault();??
  • ????????????try?{??
  • ????????????????mgr.attachApplication(mAppThread);??
  • ????????????}?catch?(RemoteException?ex)?{??
  • ????????????}??
  • ????????}??
  • ????}??
  • private final void attach(boolean system) {sThreadLocal.set(this);mSystemThread = system;if (!system) {ViewRoot.addFirstDrawHandler(new Runnable() {public void run() {ensureJitEnabled();}});android.ddm.DdmHandleAppName.setAppName("<pre-initialized>");RuntimeInit.setApplicationObject(mAppThread.asBinder());IActivityManager mgr = ActivityManagerNative.getDefault();try {mgr.attachApplication(mAppThread);} catch (RemoteException ex) {}}}

    ?

    ?

    ??? 上面的attach代碼中,我們順著IPC調用AM的attachApplication過程再往下看。
    ??? 在該過程中,AM調用到了IPC通信調用mAppThread的bindApplication;

    ?

    ?

    [c-sharp] view plaincopyprint?
  • private?final?boolean?attachApplicationLocked(IApplicationThread?thread,??
  • ????????????int?pid)?{??
  • ??????
  • ????????????thread.bindApplication(processName,?app.instrumentationInfo?!=?null??
  • ??????????????????????app.instrumentationInfo?:?app.info,?providers,??
  • ????????????????????app.instrumentationClass,?app.instrumentationProfileFile,??
  • ????????????????????app.instrumentationArguments,?app.instrumentationWatcher,?testMode,???
  • ????????????????????isRestrictedBackupMode?||?!normalMode,??
  • ????????????????????mConfiguration,?getCommonServicesLocked());??
  • ????????????updateLruProcessLocked(app,?false,?true);??
  • ????????????app.lastRequestedGc?=?app.lastLowMemory?=?SystemClock.uptimeMillis();??
  • }??
  • private final boolean attachApplicationLocked(IApplicationThread thread,int pid) {thread.bindApplication(processName, app.instrumentationInfo != null? app.instrumentationInfo : app.info, providers,app.instrumentationClass, app.instrumentationProfileFile,app.instrumentationArguments, app.instrumentationWatcher, testMode, isRestrictedBackupMode || !normalMode,mConfiguration, getCommonServicesLocked());updateLruProcessLocked(app, false, true);app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis(); }

    ?

    ??? mAppThread的bindApplication再通過消息機制向ActivityThread自身維護的handler發送BIND_APPLICATION消息。下面看看ActivityThread自身維護的handler對消息BIND_APPLICATION的處理,最終會調用到handleBindApplication函數
    ??? 你會發現在handleBindApplication函數中有這么一句


    [c-sharp] view plaincopyprint?
  • mInstrumentation.callApplicationOnCreate(app);??
  • mInstrumentation.callApplicationOnCreate(app); ????
    ??? 我們最終在繞了好大一圈之后,調用了app的onCreate函數來啟動這個application

    ?

    總結

    以上是生活随笔為你收集整理的android:persistent属性的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。