Ayrıntılı Android süreci (1): süreç mekanizması ve çoklu süreç özeti

Süreç tanıtımı

Öncelikle iki süreçle ilgili kavramları güçlendirin

1. Süreç: İşlem, belirli bir bağımsız işleve sahip bir program tarafından belirli bir veri kümesinin çalışan bir faaliyetidir.İşletim sisteminin dinamik yürütülmesinin temel birimi ve sistem kaynak tahsisinin temel birimidir. İş parçacığı yönelimli bir bilgisayar yapısında İplikler için bir kaptır.

2. fork: çatal işlevi UNIX ve UNIX benzeri sistemlerde çatal işlevi, mevcut bir süreç çatal işlevini yeni bir süreç oluşturmak için çağırabilir. Fork tarafından oluşturulan yeni sürece çocuk süreç adı verilir. Çatal işlevi bir kez çağrılır ancak iki kez geri döner. İki dönüş arasındaki tek fark, alt sürecin 0 değerini döndürmesi ve üst sürecin alt süreç kimliğini döndürmesidir. Alt süreç, üst sürecin bir kopyasıdır, üst süreç veri alanı, yığın, yığın ve diğer kaynakların bir kopyasını alır. Alt sürecin yukarıdaki depolama alanının bir "kopyasını" tuttuğunu unutmayın; bu, bu depolama alanlarının üst ve alt süreçler arasında paylaşılmadığı anlamına gelir.

Android işlem mekanizması

Aşağıda Android'in süreç mekanizması açıklanmaktadır.Android süreçleri aslında Linux (UNIX benzeri sistem) süreçleridir.Linux'taki tüm süreçler init sürecinin torunlarıdır, yani tüm süreçler doğrudan veya dolaylı olarak init tarafından kontrol edilir. İşlem çatalı çıktı.

Ayrıca android sistemde bir başlangıç süreci vardır: sistem başlatma işlemi sırasında init işlemi tarafından oluşturulan Zygote işlemi Zygote başlatıldıktan sonra, başlatma işlemi çalışma zamanı sürecini başlatacaktır. Zygote süreci, sonraki Android uygulama çerçeve katmanındaki diğer işlemlerin oluşturulması ve başlatılmasından sorumludur. Zygote işlemi ilk sanal makineyi başlatır ve çerçeve ve Uygulama için gerekli olan ortak kaynakları önceden yükler. Bir süper yönetim süreci SystemServer süreci oluşturacak, SystemServer süreci, paket yönetim hizmeti PackageManagerService ve uygulama bileşen yönetimi hizmeti ActivityManagerService, donanımla ilgili hizmetler vb. Gibi sistemin tüm temel hizmetlerini başlatacaktır. Ardından, istekleri dinlemek için bir Soket arabirimi açar ve yeni bir Uygulama sürecini yönetme isteğine göre yeni bir VM çatallar.Yeni bir istek alındığında, Zygote yeni bir işlem oluşturmak için önceden yüklenmiş sanal makinesine dayalı yeni bir sanal makineyi çatallayacaktır. Bir Android uygulamasının başlatılması gerektiğinde, ActivityManagerService, Soket süreçler arası iletişim mekanizması aracılığıyla bu uygulama için yeni bir süreç oluşturmak için Zygote sürecini bilgilendirecektir.

Spesifik başlangıç ayrıntıları: Her Uygulama uygulaması, ActivityManagerService tarafından Soket aracılığıyla Zygote işlemiyle iletişim kurar ve ActivityManagerService, parametreleri yukarıda belirtilen soket kanalı aracılığıyla Zygote sürecine geçirecek yeni bir işlem oluşturmak için startProcessLocked () yöntemini çağırır. Zygote, başlatılacak uygulamanın süreci olarak bir alt süreci çatallayacak ve ActivityThread nesnesini başlatmak için ZygoteInit.main () yöntemini çağıracak ve son olarak yeni sürecin pid'ini döndürecektir. Sonraki yapılacak şey, işlemi belirtilen Uygulamaya bağlamaktır. Bu, ActivityThread nesnesindeki bindApplication () yöntemini çağırarak yapılır. Bu yöntem, ileti kuyruğuna bir BINDAPPLICATION iletisi gönderir ve son olarak bunu handleBindApplication () yöntemi aracılığıyla işler Mesaj Daha sonra, App sınıflarını belleğe yüklemek için makeApplication () yöntemini çağırın.

İlk iki adımdan sonra, sistem zaten başvuru sürecine sahip. Aşağıdaki çağrı dizisi, mevcut bir işlemden yeni bir işlem başlatmanın normal faaliyetidir. ActivityManagerService, Binder mekanizması aracılığıyla gerekli Activity'i oluşturmak için ActivityThread'i bilgilendirecektir. Asıl çağırma yöntemi realStartActivity () 'dir, uygulama iş parçacığı nesnesinde sheduleLaunchActivity () mesaj kuyruğuna bir LAUNCHACTIVITY mesajı göndermek ve mesajı handleLaunchActivity () aracılığıyla işlemek için. Son olarak Activity oluşturmak için Instrumentation'a gideceğim.

Başvuru sürecini etkileyen faktörler

Normal şartlar altında, bir android uygulamasının yalnızca bir işlemi vardır ve işlem adı, uygulama paketinin adıdır.Uygulama ve android'in dört ana bileşeni bu süreç içindedir. Ancak, Uygulamanın ve dört bileşenin ayrı ayrı çalıştığı süreçleri belirleyebilir ve aşağıdaki şekillerde bağımsız süreçler oluşturabilirsiniz:

1.android:process=":name "Özel bir işlem oluştur, işlem adı paket adı +": ad "

2.android:process="com.cxzl.name "Genel bir işlem oluşturun, işlem adı com.cxzl.name

Bağımsız süreçler oluşturan bileşenler, genellikle push işlevi gibi sistem tarafından geri dönüştürülmeden uzun süre çalışması gereken işlevler için kullanılır.

Android: process, android: multiprocess'e ek olarak, süreç yaratmayı da etkileyebilir.Adından da anlaşılacağı gibi multiprocess, multiprocess anlamına gelir. Bu parametre sadece Activity ve ContentProvider'da tanımlanabilir. Varsayılan yanlıştır ve bileşen yalnızca uygulamanın bildirildiği süreçte oluşturulacaktır. multiprocess = "true", bileşenin birden çok örnek oluşturmasına izin verir, bu işlemde bileşen çağrılır, işlemdeki bileşen örneğini kullanır ve paylaşılmaz.

Süreç oluşturmayı doğrudan etkileyen yukarıdaki iki yapılandırmaya ek olarak, işlem oluşturmayı dolaylı olarak etkileyebilecek başka bir yapılandırma daha vardır: android: launchMode = "singleInstance". Android Activity'de singleInstance dışında dört başlangıç yöntemi vardır. Hepsi aynı Activity yığınında, yalnızca singleeInstance bağımsız bir yığın oluşturur ve yalnızca bir örnek vardır, bu da işlem oluşturmayı etkilemesine neden olur: çünkü android: multiprocess = "true" özniteliğiyle çakışır. Ayrı bir yığın üzerinde olduğu için, iki uygulama açtığı zaman hangi uygulama yığınına aittir? Hangi uygulamanın süreci? Bileşen kendi sürecini belirtirse ne olur?

Bu sorularla internette araştırdım ama tam bilgi bulamadım.Bazı makalelerin belirli bir noktaya göre analizleri olacak ama kapsamlı değiller ve farklı makalelerin görüşlerinde çelişkiler var. Bunlar android: process, android: multiprocess, Şu üç yapılandırmanın bir bileşenin süreci üzerindeki etkisi hakkında net bir sonuç yoktur: launchMode. Resmi belgelere bakıldığında, sadece bu üç konfigürasyonun işlevlerini ayrı ayrı açıklıyor ve bu durumların etkisini söylemiyor.

Süreç testi

Bu yüzden uygulamadaki çoklu süreç durumunu test etmek için iki demo yazdım.

Bir ana uygulama (github adresi https://github.com/cxzl/ProcessTestMain), paket adı com.cxzl.processtest, aşağıdaki içeriği içerir:

1. MainActivity sınıfı, her bir özel yapılandırma Etkinliğini başlatın;

2. Başlatılacak Etkinlik temel sınıfı, faaliyetin pid'sini, işlem adını ve karma kodunu yazdırmak için kullanılır;

3. AndroidManifest'te yapılandırılan etkinliklerin tümü, ikinci temel sınıfı devralır.

Bir yardımcı uygulama (github adresi https://github.com/cxzl/ProcessTestAssist), paket adı com.cxzl.processthirdstart, AndroidManifest ana uygulaması tarafından yapılandırılan her Aktiviteyi başlatmak için kullanılan MainActivity adında yalnızca bir sınıf içerir.

Çeşitli faktörlerin süreç oluşturma üzerindeki etkisini karşılaştırmak için çeşitli konfigürasyonların belirli etkinliklerini tek tek ve çapraz başlatmak için bu iki uygulamayı kullanın. Test arayüzünde birkaç ekran görüntüsü seçildi:

Aşağıdaki tablo özel test sonuçlarıdır:

Önce bu tabloyu açıklayın:

En soldaki satır Aktivitenin üç konfigürasyonu için dijital koddur.Bu 12 durumu metinde listelemek çok karmaşık olduğu için dijital koda dönüştürülür.

1. İlk sayı android: launchMode, 0 varsayılandır, yani launchMode ayarlanmamıştır (Android varsayılanı standarttır) ve 1 launchMode'u singleInstance olarak ayarlamak içindir.

2. İkinci sayı android: multiprocess, 0 varsayılandır, bu yanlıştır ve 1 doğrudur.

3. Üçüncü sayı android: process, 0 varsayılandır, yani hiçbir işlem ayarlanmamıştır, varsayılan işlem uygulama paketi adı com.cxzl.processtest, 1 ise özel işlemi ayarlamak içindir, işlem adı com.cxzl.processtest: özel , 2 genel bir işlem kurmak içindir, işlem adı com.cxzl.public'dir.

Örneğin 101, 1'dir (launchMode = "singleInstance") + 0 (multiprocess = "false") + 1 (işlem: özel)

En üst satır, Aktiviteyi başlatmanın yoludur, bunlar:

1. Yardımcı uygulama çalışmıyor ve ana uygulama kendi Faaliyetini başlatıyor;

2. Yardımcı uygulama, ana uygulamanın bir etkinliğini açtı, ana sayfa düğmesine basın, ana uygulamayı açın ve ardından etkinliği başlatın;

3. Ana uygulama çalışmıyor ve yardımcı uygulama ana uygulamanın faaliyetini başlatıyor;

4. Ana uygulama kendi faaliyetlerinden birini açtı, ana sayfa düğmesine basın, yardımcı uygulamayı açın ve ardından etkinliği başlatın.

Açıkladıktan sonra sonucu özetleyelim:

1. Yardımcı uygulama süreci com.cxzl.processthirdstart'ın oluşum sayısı 0'dır. İnternetteki bazı makaleler multiprocess = "true" ayarının yapılandırıldığını, hangi uygulamanın bileşeni açtığını ve bileşenin hangi işlemin içinde olduğunu söyler. Aslında Nasıl yapılandırılırsa yapılandırılsın: bileşen yalnızca uygulama sürecinde veya uygulama süreci tarafından belirtilen işlemde mevcuttur.

2. Her durumda, özel sürecin veya genel sürecin performansı, ya ana uygulama süreci ya da ilgili süreç, yani senkronize edilir. Özel süreç ve genel süreç, süreç oluşturmada aynı performansa sahiptir, ancak işlem adı farklıdır.

3. 0 ile biten tüm satırlar için başlangıç bileşeni ana işlemdedir, yani Süreç bir süreç belirtmediği sürece ana süreç içinde yer almalıdır.

4. Sütun B ve sütun C'nin karşılaştırılması (her ikisi de ana uygulamayı başlatır, sütun C'de daha fazla üçüncü taraf uygulama girişimi vardır), yalnızca 111 ve 112 farklıdır, yani Launchmodle singInstance olarak ayarlanmışsa ve çoklu işlem bileşeni başlatmak için true olarak ayarlanmışsa, özel süreç ve genel süreç aynı işlemi doğrudan açacaktır çünkü üçüncü taraf uygulama önce aynı işlemi açar, aksi takdirde bileşen ana işlemde oluşturulur.

5. B sütunu ve D sütunu (ana uygulama başlangıcı ve üçüncü taraf uygulama başlangıcı) karşılaştırıldığında, 011.012, 111.112'den farklıdır, yani Çoklu işlem doğru olduğunda, uygulama ve üçüncü taraf uygulaması aynı bileşeni farklı işlemlerde açar, uygulama ana işlemdedir ve üçüncü taraf uygulaması, bileşenin kendisi tarafından beyan edilen süreç içindedir.

6. Sütun D ve sütun E'nin karşılaştırılması (her iki üçüncü taraf uygulaması etkinleştirilir, sütun E bu uygulamadan daha fazla parazite sahiptir), yalnızca 111 ve 112 farklıdır, yani Bileşeni başlatmak için launchmodle öğesini singInstance olarak ve çoklu işlemi true olarak ayarlayın. Özel süreç ve genel süreç, aynı işlemi doğrudan açacaktır çünkü bu uygulama işlemi ilk önce açmıştır, aksi takdirde bileşen bileşen tarafından belirtilen işlemde oluşturulacaktır.

7. 001, 002, 101, 102 ve 011, 012, 111, 112'yi karşılaştırın, bulacaksınız Çoklu işlem doğruysa, uygulamanın belirtilen genel veya özel işlem bileşenlerini açmasına veya ana işlemde görünmesine neden olur, ancak üçüncü taraf uygulamaların açılması etkilenmez.

8. 000, 001, 002 ve 100, 101, 102'yi karşılaştırın ve tam olarak aynı olduklarını bulun, yani Çoklu işlem yanlış olduğunda, singleInstance bileşenin bulunduğu işlemi etkilemeyecektir.

9. 011.012'yi 111.112 ile karşılaştırın ve bulun Çoklu işlem doğru olduğunda, bileşen özel veya genel bir işlemi belirtir.SingInstance modunda, daha sonra çalışan uygulama ilk olarak çalışan uygulama tarafından oluşturulan işlemi kullanır.

Sonuca ek olarak, iki sorun keşfedildi:

1. Üçüncü taraf uygulama, bileşeni çoklu işlemle true olarak başlatır ve singleInstance içermeyen Activity, aynı işlem numarasına ancak farklı karma kodlara sahip iki sayfayı arka arkaya açar. Bunun sebebini bulamadım ve internette bu konuyu tartışan kimseyi bulamadım, sebebini bilen biri varsa konuşabilirim.

2. Üçüncü taraf uygulaması singleInstance'in etkinliğini başlatır ve android çoklu görev düğmesine basılması iki uygulamayı gösterir.Tek olmayan bir işlem oluştursa da görev listesinde görünmez. Görev listeleri ve süreçler arasındaki ilişki, derinlemesine anlamaya değer bir şeydir.

Şekil 7

Bu noktada, bu makale bitti. Android işlem mekanizmasını ve birden çok uygulama ile birden çok süreç arasındaki süreç ilişkisini anlamanıza yardımcı olmayı umuyorum. Bu dizideki ikinci makale hazırlık aşamasındadır: Android süreci ayrıntılı açıklaması (2): Süreç ve uygulama yaşam döngüsü ve süreç yıkımı arasındaki ilişki, bu yüzden bizi izlemeye devam edin.

Son olarak, editör burada çok eksiksiz bir çalışma planı yaptı ve birlikte öğrenmek için bunu herkesle paylaştı!

Android gelişmiş

En son Android teknolojisi

Bu bilgiye ihtiyaç duyan herkes dikkat + özel mesajla ücretsiz olarak "Android bilgileri" yanıtını verin!

Ayrıca, gelişmiş kullanıcı arayüzü, performans optimizasyonu, mimar kursları, NDK, hibrit geliştirme: ReactNative + Weex ve diğer Android teknik bilgi mimarisi video materyalleri ve kariyer planlaması dahil olmak üzere üst düzey Android hakkında birçok ücretsiz öğrenme materyaline sahibim Ve görüşme rehberliği

"Shazam" Ya süper güçlerim varsa?
önceki
Model oyun kontrolü: ayrıntıları artırın, X1fc'ye kadar HG korsan
Sonraki
Editör bugün erkeklere ait bir film önerecek.
Kadokawa Games, "Fanggen Letters" ın canlı aksiyon projesini başlatmak için Perfect World ile işbirliği yapacak.
Film Paylaşımı: Başlangıçta aile için mutlu bir yolculuktu, bir kabusa dönüştü
Oyun kontrolü: tek durakta yakışıklı RX-78-2 GUNDAM
Yedikten sonra kilo verenler nasıl oluyor? İyi kitap seçimi
"The Messenger of Purgatory" pek çok heyecan verici öğeye sahip ve her saniye çıplak bir görsel etkiye sahip
Sadece 8 bölüm Douban 8.9 puan aldı Bu yılın en iyi Kore dizisi olabilir.
Model oynatma kontrolü: ayrıntılar patlar, GK, Mobico Justice GK'ya geçer
Bu yıl Hong Kong'daki en büyük halka arz burada: China Tower'ın bağış toplama Xiaomi'yi geride bıraktı ve listenin ilk gününde açılıyor
Model oyun kontrolü: Gölge Jesta olarak bilinen güç
Bugün sıradan insanların sıkı çalışmaları hakkında birkaç film önermek ve sonunda daha güçlü hale gelmek istiyorum.
Kız arkadaşınızın fotoğraflarını çekmeniz ve öğrenmek için erkek arkadaşınıza aktarmanız için 9 fotoğraf tekniği!
To Top