Android6.0 AMS起動Activity(5)新プロセスでActivityを起動



前にActivityの起動プロセスを分析したところ、同じアプリケーションのActivityは一般的に同じプロセスで起動されていることがわかりました.実際には、ActivityもServiceのように新しいプロセスで起動することができ、1つのアプリケーションがいくつかのプロセスを越えることができます.本稿では、新しいプロセスでActivityを起動する方法とプロセスを分析します.
Androidシステムでは、各アプリケーションはいくつかのActivityとServiceで構成されており、一般的には独立したプロセスで動作し、Activityは同じプロセスで動作する可能性があり、異なるプロセスで動作する可能性があります.AndroidアプリケーションがLauncherデスクトップでActivityを起動するにはプロセスを起動する必要があり、プロセス内部でActivityプロセスを起動する必要があることも説明しました.では、同じAndroidアプリケーションが新しいプロセスで新しいActivityを起動する方法を見てみましょう.
これを行うには簡単ですAndroidManifestでxmlでは、プライマリActivityと起動するActivityのandroid:processプロパティを別に設定します.
      
      
          
            
                  android:process=":com.example.process.main"    
                  
                      
                      
                  
              
              
                  
                      
                      
                  
              
          
    

同じアプリケーションのActivityコンポーネントは同じプロセスで実行されますが、Activityがandroid:processというプロパティを構成している場合は、独自のプロセスで実行されます.Android:processプロパティの値が「:」で始まると、このプロセスがプライベートであることを示します.Android:processプロパティの値が小文字で始まると、他のアプリケーションコンポーネントもこのプロセスで実行できるグローバルプロセスであることを示します.
したがって、ここでは「:」で始まり、プライベートプロセスが作成されたことを示します.実際、ここでは前の「:」を使わなくてもいいですが、この属性文字列内に少なくとも1つの「.」があることを保証しなければなりません.文字.
AndroidManifest.xmlはapkのインストール時にPKMSでPackageParserのparseBaseApplicationを呼び出して解析します.具体的なコードは、後続のブログ(PKMSインストールapk専門)で再分析します.
このようにprocessNameが異なると、AMSがActivityを起動したときにプロセスが開きます.Activityを再起動すると、processNameが異なるため、プロセスのないprocessNameがこのnameであることがわかります.だからもう一つのプロセスを始めます.具体的なコードは私たちの前のブログでも分析しました.Activity StackSupervisorのstartSpecificActivity Locked関数で、このprocessNameのプロセスがないことを発見した後です.mServicesが呼び出されます.startProcessLocked関数は、プロセスの開始を再開し、新しいProcessRecordを作成してプロセスの情報を保存します.
    void startSpecificActivityLocked(ActivityRecord r,
            boolean andResume, boolean checkConfig) {
        // Is this activity's application already running?
        ProcessRecord app = mService.getProcessRecordLocked(r.processName,
                r.info.applicationInfo.uid, true);

        r.task.stack.setLaunchTime(r);

        if (app != null && app.thread != null) {
            try {
                if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0
                        || !"android".equals(r.info.packageName)) {
                    // Don't add this if it is a platform component that is marked
                    // to run in multiple processes, because this is actually
                    // part of the framework so doesn't make sense to track as a
                    // separate apk in the process.
                    app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,
                            mService.mProcessStats);
                }
                realStartActivityLocked(r, app, andResume, checkConfig);
                return;
            } catch (RemoteException e) {
                Slog.w(TAG, "Exception when starting activity "
                        + r.intent.getComponent().flattenToShortString(), e);
            }

            // If a dead object exception was thrown -- fall through to
            // restart the application.
        }

        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,
                "activity", r.intent.getComponent(), false, false, true);
    }