Orkestratör, her sanal makinede (VM) çalışan yerel bir SDV aracısıdır ve hizmet paketlerinin ne zaman oluşturulması, başlatılması, durdurulması veya yok edilmesi gerektiğini kontrol etmek için bir mekanizma sağlar. Bu işlem, hizmet paketi örneklerinde işlemlerin ne zaman ve nasıl gerçekleştirileceğini belirleyen bir dizi kural tanımladığınız bir düzenleme yapılandırması aracılığıyla yapılır. Bu kurallar; araç, güç ve özel modlara göre belirlenir.
Orchestrator'ı yapılandırma APEX'lerinde veya VM başına yapılandırmalar aracılığıyla yapılandırabilirsiniz. Bu dağıtılmış yapılandırma sistemi, her hizmet paketinin bölümlerinin Hizmet Paketi Kayıt Defteri aracılığıyla bağımsız olarak güncellenmesine olanak tanır.
Şekil 1. Orkestratör yapılandırma şeması.
Araçtan bağımsız yapılandırmalar, OEM'ye veya araca bağlı olarak değişmez. Yapılandırma, her OEM'nin tüm araçlarında aynı kalır. Araca özel yapılandırmalar, farklı OEM'ler tarafından üretilen farklı araçlarda değişiklik gösterebilir. Ancak belirli bir OEM tarafından üretilen tüm araçlarda yapılandırma tümü için aynı olabilir.
Yapılandırma APEX'leri
Çalışma zamanında Orchestrator, her hizmet paketi için bir SDV düzenlemesi getirmek üzere hizmet paketi kayıt defterine gider, her yapılandırmayı yükler ve ayrıştırır. Daha fazla bilgi için Orkestrasyon meta verileri konusuna bakın.
Sanal makine başına yapılandırma
Orkestratör başlatıldığında sanal makine yapılandırmasını (varsa) yükleyip ayrıştırır. Bu yapılandırma dosyasının mutlak yolu, persist.sdv.orchestrator_config_path ve ro.boot.sdv.orchestrator_config_path sistem özellikleri aracılığıyla belirtilir.
Sistem, önyükleme sırasında sanal makine yapılandırma dosyası yolunu aşağıdaki hiyerarşiye göre belirler:
Sistem,
persist.sdv.orchestrator_config_pathözelliğini kontrol eder. Değeri varsa bu yol kullanılır. Bu değer, yeniden başlatma işlemleri arasında kalıcıdır veya çalışma zamanında ayarlanır.persist.sdv.orchestrator_config_pathboşsa sistemro.boot.sdv.orchestrator_config_pathözelliğini kontrol eder.ro.boot.sdvözelliğinin değeri varsa bu yol, persist özelliğine kopyalanır ve geçerli başlatma ile gelecekteki tüm başlatmalar için kullanılır (geçersiz kılınmadığı sürece).
persist.sdv.orchestrator_config_path
persist.sdv.orchestrator_config_path, SDV Orchestrator aracısının yapılandırma dosyasının yolunu almak için kullandığı birincil özelliktir. Bu, kalıcı bir özelliktir. Yani değeri, cihaz yeniden başlatıldığında da kaydedilir. Değeri çalışma zamanında değiştirebilirsiniz. Bu, testler veya belirli senaryolar (ör. uçtan uca testler) için yararlıdır.
Değeri, çalışma zamanında setprop komutunu kullanarak, derleme süresinde ise .mk uzantılı bir makefile veya .rc uzantılı bir kaynak komut dosyası kullanarak ayarlayabilirsiniz.
Çalışma zamanında özelliği ayarlama
Değer yeniden başlatma işlemleri arasında kaydedildiğinden, özelliği çalışma zamanında ayarlamak test veya geçici değişiklikler yapmak için kullanışlıdır:
adb root
adb shell setprop persist.sdv.orchestrator_config_path {$path_to_file}.textproto
Özelliği derleme süresinde ayarlama
Bu özelliği cihazınızın derleme yapılandırmasının bir parçası olarak ayarlamak için ürününüzün veya kartınızın makefile'ına bir satır ekleyin. Bu, yeni bir cihaz resmi için varsayılan değer ayarlamak üzere idealdir.
# Add this line to a product's or device's .mk file
PRODUCT_PROPERTY_OVERRIDES += persist.sdv.orchestrator_config_path={$path_to_file}.textproto
Bu özelliği bir kaynak komut dosyası içinde de ayarlayabilirsiniz:
# Add this line to an .rc file
on {$property}
setprop persist.sdv.orchestrator_config_path {$path_to_file}.textproto
ro.boot.sdv.orchestrator_config_path
ro.boot.sdv.orchestrator_config_path, persist.sdv.orchestrator_config_path özelliği için başlangıç değeri sağlamak amacıyla kullanılan, başlatma zamanında salt okunur bir özelliktir. Sistem başlatıldığında persist.sdv.orchestrator_config_path boşsa ro.boot.sdv.orchestrator_config_path değeri buraya kopyalanır. persist.sdv.orchestrator_config_path ayarlandıktan sonra sonraki başlatmalarda bu özellik tarafından üzerine yazılmaz.
ro.boot.sdv.orchestrator_config_path değerini bootconfig veya kernel cmdline kullanarak ayarlayabilirsiniz.
Dosya biçimi
Yeni yapılandırmaların çalışma zamanında yüklenebilmesi için orkestrasyon yapılandırmasını .textproto biçiminde (örneğin, yapılandırılmış metin olarak) tanımlayın.
Yapılandırma söz dizimi
Bu bölümde, yapılandırma söz dizimi açıklanmaktadır.
Hizmet paketleri
Her hizmet paketi, paketi Orchestrator içinde tanımlayan ve paket örneğinin yaşam döngüsünü yönetmek için kullanılan hizmet paketi yapılandırmasıyla tanımlanmalıdır. Hizmet paketi yapılandırması şunları tanımlar:
InstanceToGroupMapping, aynı hizmet paketinin örnekleri arasında bağımlılık oluşturmak için hizmet paketinin bir örneğini gruba dahil etmenize olanak tanır.InstancesStates, hizmet paketi örneğinin farklı durumlarını tanımlar.InstancesStateConfiguration, koşultrueolarak değerlendirilirse bir hizmet paketi örneğinin ayarlanması gereken durumu (InstancesStates) tanımlar.ServiceBundleConfig, belirli hizmet paketi ve örnekleri hakkında bilgi içerir. Paket için ilgiliInstanceToGroupMappingveInstancesStateConfigurationdeğerlerini içerir.CustomModes, paketin yayınlamasına izin verilen özel modların listesini tanımlar.CustomModes, yetkisiz bir paketin özel modun değerini değiştirmesini engellemek için kullanılır. Hizmet paketi herhangi bir özel moda yayınlanmayabileceğinden bu alan isteğe bağlıdır. Daha fazla bilgi için Özel modlar başlıklı makaleyi inceleyin.
Gerekli paket yapılandırması
Paket yapılandırması en azından şu özellikleri sağlar:
service_bundle_config {
package_name: "package_name"
service_bundle_name: "service_bundle_name"
instance: "instance_1"
instance: "instance_n"
}
Bu bildirim, ilgili FQIN'lerle n hizmet paketi örneklerini tanımlar:
vm_name.package_name.service_bundle_name.instance_1
…
vm_name.package_name.service_bundle_name.instance_n
Sanal makine adı, yapılandırmada açıkça belirtilmemiş. Yapılandırma sanal makine başına tanımlandığından sanal makine adı, yapılandırma dosyasının dağıtıldığı sanal makinenin adıdır ve orkestrasyon aracısı tarafından zaten bilinir.
Örnekleri yapılandırma
Hizmet paketi örneklerinin bildirilmesinin etkisi yoktur. Orchestrator tarafından yürütülebilmesi için örneklerin yapılandırılması gerekir. Örneğin, Orchestrator'a bir örneğin hangi koşullarda (veya sanal makinenin ya da aracın hangi durumda) çalışması gerektiği bildirilmelidir. Örnekleri yapılandırmak için yapılandırma durumları şu şekilde tanımlanmalıdır:
condition, değerlendirilmesi gereken sanal makine veya araç durumuyla ilgili bir ifadedir.instances_states, koşultrueolarak değerlendirilirse uygulanması gereken, örnek başına bir durum kümesidir.
Daha fazla bilgi için Koşullar başlıklı makaleyi inceleyin.
service_bundle_config {
package_name: "oem.package"
service_bundle_name: "OemApplication"
instance: "adaptive_light"
instance: "reserve_light"
state {
condition {
power_state: "ON"
}
instances_states {
started: "adaptive_light"
created: "reserve_light"
}
}
}
Örnekten gruba eşleme
Hizmet örneklerini hizmet gruplarına dahil ederek de yapılandırabilirsiniz. Hizmet paketi yapılandırma düzeyinde, gruplara örnekler ekleyebilirsiniz. Ardından, grupları sanal makine yapılandırması düzeyinde yapılandırabilirsiniz. Daha fazla bilgi edinmek için sonraki bölüme ve Hizmet paketleri başlıklı makaleye bakın.
service_bundle_config {
package_name: "oem.package"
service_bundle_name: "OemApplication"
instance: "fog_front_light"
instance: "fog_rear_light"
instance: "turn_signal_light"
instance: "light_flasher_display"
# Declare that fog_light contains fog_front_light and fog_rear_light.
group_mapping {
group: "fog_light"
instance: "fog_front_light"
instance: "fog_rear_light"
}
# Declare that flasher_light contains turn_signal_light and light_flasher_display.
group_mapping {
group: "flasher_light"
instance: "turn_signal_light"
instance: "light_flasher_display"
}
}
Proto şeması
Aşağıda örnek bir proto şeması verilmiştir:
// Service bundle configuration.
//
// Defines service bundle data, its instances and configuration for instances
// states depending on the state of the system
message ServiceBundleConfig {
// Required. Name of the service bundle.
string service_bundle_name = 1;
// Required. Package name of the service bundle.
string package_name = 2;
// Required. Service instances.
repeated string instance = 3;
// Configuration for instances states depending on the state of the system.
repeated InstancesStateConfiguration state = 4;
// Mapping of groups to their member service instances.
repeated InstanceToGroupMapping group_mapping = 5;
// Custom modes that this service bundle is allowed to set.
repeated string custom_mode = 6;
// Defines the retry policies for specific instances.
// If multiple mappings target the same instance, the one with the highest `max_retries`
// value takes precedence. This applies across all configuration files.
repeated InstanceToRetryMapping retry_mapping = 7;
}
// Mapping of instances to their retry configuration.
message InstanceToRetryMapping {
// Required.
//
// Name of the instances for which the given retry configuration is applied.
repeated string instance = 1;
// Required.
//
// The configuration that defines the restart and retry strategy for the instances.
RetryConfiguration retry_config = 2;
// Configuration for retry and restart.
// This configuration is applied after a failure on a transition or after the bundle instance
// has crashed. Upon a successful operation, the retry counter are reset to max_retries. This
// configuration can be applied to any service bundle, not only the monitored ones. If the
// configuration is not provided or none of the optional fields are filled, the default behavior
// stated is applied (the value from `ro.boot.sdv.orchestrator.recovery.max_retries`
// or zero if not set).
message RetryConfiguration {
// The number of times a retry/restart operation can be performed.
// Defines the number of times the Orchestrator retries a transition
// after a transient failure or after a bundle crash notification.
// This applies to creating, starting and destroying operations.
// The retry count resets to max_retries after a successful operation.
// If not set, the default configured value in the
// `ro.boot.sdv.orchestrator.recovery.max_retries` is used, or-if not set-
// it fallbacks to zero.
optional uint32 max_retries = 1;
}
}
// Mapping of groups to their member service instances.
message InstanceToGroupMapping {
// Required. Names of groups to which members are added.
//
// Group behavior is defined in VM configuration.
repeated string group = 1;
// Required. Names of instances to be included in the groups.
//
// Can reference only instance defined in the same config file.
repeated string instance = 2;
}
// Describes the state the service instances should be in after the state is executed.
//
// If there is no valid configuration for the instance in the specific system state, such instance is transitioned to the "destroyed" state.
//
// For the GroupsStates definition to be useful, at least one item should be present in any of the fields.
message InstancesStates {
// Names of the instances that must be in a "created" state.
repeated string created = 1;
// Names of the instances that must be in a "started" state, overrides "created" state.
repeated string started = 2;
// Names of the instances that must not run, overrides all other states.
repeated string destroyed = 3;
}
// Configuration for instances states depending on the state of the system.
message InstancesStateConfiguration {
// Condition for the system state under which the related instances states should be executed by Orchestrator.
//
// If omitted, the related instances states are always executed.
Condition condition = 1;
// Required. States of service bundle instances to be executed by Orchestrator if the condition is true.
InstancesStates instances_states = 2;
}
Sanal makine düzeyinde yapılandırma
VM yapılandırması, grup eşlemelerinin tanımlanmasını ve grupların yapılandırılmasını sağlar. Hizmet paketleri arasındaki bağımlılıkları sanal makine düzeyinde modellemek için kullanılır. Böylece, birden fazla hizmet paketinin durumunu aynı anda değiştirme esnekliği sağlanır. Bir grubun tüm örnekleri belirtilen duruma getirilir.
Orchestrator, durum değişikliğinin yürütülme sırasını garanti etmez. Orkestratör, her örneğin belirtilen durumda olmasını sağlar.
Gruplar, yapılandırma bölümlerinden herhangi birinde group adı kullanılarak örtülü olarak bildirilir. Örneğin, örnekten gruba eşleme, gruptan gruba eşleme ve grup yapılandırma durumları.
Gruptan gruba eşleme
Gruplar başka grupları içerebilir. group_1'nın subgroup_2 içerdiğini beyan ederek subgroup_2'daki tüm hizmet örneklerini group_1'ya etkili bir şekilde ekleriz.
Örneğin:
# Declare that body contains fog_light and flasher_light.
group_mapping {
group: "body"
subgroup: "fog_light"
subgroup: "flasher_light"
}
Grup yapılandırma
Bir grubu bildirmek herhangi bir etki yaratmaz. Grupların Orchestrator tarafından yürütülmesi için yapılandırılması gerekir. Örneğin, Orchestrator'a grupların hangi koşullarda veya sanal makinenin ya da aracın hangi durumunda çalışması gerektiği bildirilmelidir.
Grupları hizmet örneklerine benzer şekilde, yani yapılandırma durumlarını kullanarak yapılandırabilirsiniz. Tek fark, söz diziminde instances_states yerine groups_states kullanılmasıdır:
state {
condition {
power_state: "ON"
}
groups_states {
started: "Body"
started: "Adas"
}
}
Proto şeması
Aşağıda örnek bir proto şeması verilmiştir:
// VM configuration.
//
// Defines group-to-group mappings and configuration for groups
// states depending on the state of the system.
//
// Configurations of service bundles can also be defined in VM configuration (as well as in a separate configuration file).
message VmConfig {
// Group to member groups mapping.
repeated GroupToGroupMapping group_mapping = 1;
// Configuration of group states.
repeated GroupsStateConfiguration state = 2;
// Required. We also allow to configure individual service bundles in the VM config, to simplify development and migration from the monolithic configuration.
repeated ServiceBundleConfig service_bundle_config = 3;
}
// Mapping of groups to their member groups.
message GroupToGroupMapping {
// Required. Names of groups to which members are added.
repeated string group = 1;
// Required. Names of member groups to be included in the groups.
repeated string subgroup = 2;
}
// Describes the state the service instance groups should be in after the state is executed.
//
// If group configuration is valid in a specific system state, the configured state is applied to
// all group members. After that, the normal service instance configuration rules still apply:
// - "destroyed" > "started" > "created" precedence
// - not configured means the instance should be moved to the default state
//
// For the GroupsStates definition to be useful, at least one item should be present in any of the fields.
message GroupsStates {
// Names of the groups that must be in a "created" state.
repeated string created = 1;
// Names of the groups that must be in a "started" state, overrides "created" state.
repeated string started = 2;
// Names of the groups that must not run, overrides all other states.
repeated string destroyed = 3;
}
// Configuration for group states depending on the state of the system.
message GroupsStateConfiguration {
// Condition for the system state under which the related group states should be executed by Orchestrator.
//
// If omitted, the related groups states are always executed.
Condition condition = 1;
// Required. States of service bundle groups to be executed by Orchestrator if the condition is true.
GroupsStates groups_states = 2;
}
Yapılandırma durumları
Yapılandırma durumları (durumlar), bir hizmet örneğinin veya grubunun ne zaman başlatılacağını, durdurulacağını ya da yok edileceğini tanımlar ve conditions ile instances_states (paket yapılandırması) ve groups_states (VM yapılandırması) öğelerinden oluşur.
Koşullar
Koşullar, modelin bir Boole koşulu altında tanımlanan örnek durumun uygulanmasına olanak tanır. Bu koşul, true olarak değerlendirilir. Bir koşul şu özelliklere sahiptir:
Güç, araç ve özel mod gibi desteklenen sinyallere dayalı olarak rastgele karmaşık Boole ifadesi (
andveyanotifadeleriyle oluşturulur).(İsteğe bağlı) Koşul içermeyen yapılandırma durumu her zaman aktiftir. Yani
trueolarak değerlendirilir.
Örnek durumları ve grup durumları
instances_states ve groups_states bu özelliklere sahiptir.
Durum
activeolduğundan, düzenleme aracısının belirli örnekler veya gruplar için hangi durumların gerekli olduğunu belirleyin.Gruba bir durum uygulandığında bu durum, gruptaki her hizmet paketi örneği için geçerli olur. Örneklerin duruma getirildiği zamanla ilgili herhangi bir sıra uygulanmaz.
Desteklenen eyaletler şunlardır:
Service::on_startarandıktan sonrastarted.createdService::newçağrıldıktan sonra ancakService::on_startçağrılmadan önce.VEYA
Service::on_stopçağrıldıktan sonra ancakService::dropçağrılmadan önce.
Service::droparandıktan sonradestroyed.
Kural grubu
Yapılandırma durumu, koşula bağlı olarak etkin veya etkin değil olabilir. İstediğiniz zaman birden fazla durum etkin olabilir. Bir düzenleme aracısı sinyal güncellemesi aldığında, hizmet paketlerinin yaşam döngüsü değiştirilmeden önce tüm yapılandırma durumları değerlendirilir. Hizmet örneği durumları aşağıdaki kurallara göre değerlendirilir:
Etkin durumlardan hiçbiri hizmet örneği için geçerli olmadığında hizmet örneği yok edilir.
Bir veya daha fazla etkin durum geçerli olduğunda şu öncelik sırası uygulanır:
destroyedmutlak önceliğe sahiptir.started,createdtarihinden önce gelir.
Proto şeması
Aşağıda örnek bir proto şeması verilmiştir:
// A root boolean condition.
message Condition {
// Required.
oneof root {
// VPM power state condition.
string power_state = 1;
// VPM vehicle state condition.
string vehicle_state = 2;
// Custom mode state condition.
CustomState custom_state = 3;
// Negation of a nested condition.
Condition not = 4;
// Logical 'and' between conditions grouped in expression.
Expression and = 5;
// Logical 'or' between conditions grouped in expression.
Expression or = 6;
}
}
// Representation of Custom state condition.
//
// Custom mode(s) are defined by the OEM and are not standardized by the platform, in contrast with
// VPM modes (i.e. power and vehicle mode).
message CustomState {
// Custom mode being checked.
string mode = 1;
// State of the custom mode.
string state = 2;
}
// A set of conditions united under an 'and' or 'or' expression.
//
// Evaluation type ('and' or 'or') depends on the field in [Condition]/[Expression], where the
// expression is being used.
//
// At least one value in at least one of the fields is required.
message Expression {
// VPM power state condition.
repeated string power_state = 1;
// VPM vehicle state condition.
repeated string vehicle_state = 2;
// Custom mode state condition.
repeated CustomState custom_state = 3;
// Negation of a nested condition.
repeated Condition not = 4;
// Logical 'and' between conditions grouped in expression.
repeated Expression and = 5;
// Logical 'or' between conditions grouped in expression.
repeated Expression or = 6;
}
Kilitlenme kurtarma ve yeniden başlatma stratejisi
Orchestrator, hizmet paketi çökmelerini ve yaşam döngüsü geçişi hatalarını işlemek için sağlam bir mekanizma sağlar. Orchestrator, hizmet durumları hakkında bütünsel bir görünüme sahip olduğu ve mod geçişlerini yönettiği için yeniden başlatma ve yeniden deneme stratejisini yürütmek için en uygun bileşendir. Yaşam Döngüsü Yöneticisi (LM), hizmet paketi kilitlenmelerini bağlayıcı ölüm bildirimleri aracılığıyla Düzenleyici'ye bildirir. LM'ye gereksiz bağlayıcı çağrılarını önlemek için düzenleyici, her paketin son durumunu (başarılı olup olmadığı) önbelleğe alır ve bilinen son durum, istenen yeni durumla aynıysa geçişleri yeniden uygulamaz.
Yapılandırmayı yeniden dene
retry_mapping kullanarak Orchestrator yapılandırmanızda yeniden başlatma ve yeniden deneme stratejisini örnek başına tanımlayabilirsiniz. max_retries yapılandırmada ayarlanmamışsa varsayılan değer, ro.boot.sdv.orchestrator.recovery.max_retries sistem özelliğinden alınır. Bu özellik ayarlanmazsa değer 0 olarak geri döner.
max_retries: Düzenleyicinin, geçici bir hatadan veya paket kilitlenme bildiriminden sonra geçişi yeniden deneme sayısını tanımlar. Yeniden deneme sayacı, başarılı bir işlemden sonra veya yeni bir mod işlendiğindemax_retriesdeğerine sıfırlanır. Birden fazla eşleme aynı örneği hedefliyorsa en yüksekmax_retriesdeğerine sahip olan öncelikli olur.
Yapılandırma örneği
service_bundle_config {
package_name: "oem.package"
service_bundle_name: "OemApplication"
instance: "fog_front_light"
instance: "fog_rear_light"
# Defines the restart configuration mapping for specific instances.
retry_mapping {
instance: "fog_front_light"
instance: "fog_rear_light"
retry_config {
max_retries: 3
}
}
}
Toparlanma davranışı
Orkestratör'ün yeniden başlatma ve yeniden deneme mantığı, çeşitli hata senaryolarını sorunsuz bir şekilde yönetir:
- Normal çalışma sırasında kilitlenme: Bir hizmet paketi çalışırken kilitlenirse Orchestrator, yeniden başlatma stratejisini uygular ve kalan yeniden deneme sayısına göre paketi son istenen durumuna geri getirmeye çalışır.
- Mod geçişi sırasında kilitlenme: Yeni bir mod uygulanırken paket kilitlenirse yeniden başlatma isteği sıraya alınır ve daha sonra işlenir. İstek işlendikten sonra Orchestrator, örneğin son durumunu kontrol eder ve yalnızca örnek son istenen durumda (son mod geçişinden itibaren) değilse yeniden başlatmayı uygular.
- Kurtarma sırasında yeni mod: Bir paket yeniden başlatılırken (veya yeniden başlatılacak örnekler sırasındayken) Orchestrator'a yeni bir moda geçiş isteği gelirse devam eden kurtarma işlemi iptal edilir. Yeni mod geçişi devreye girer ve yeni hedef durum için yeni bir deneme grubu sağlamak üzere yeniden deneme sayacı sıfırlanır.
Orkestratör, yeniden deneme stratejisini belirlemek için Lifecycle Manager tarafından döndürülen farklı hata türlerini ayırt eder:
- Geçici hatalar (
SERVICE_NOT_FOUND,OPERATION_FAILED,INTERNAL_ERROR): Düzenleyici, herhangi bir özel temizleme işlemi yapmadan işlemi yeniden dener. - Kalıcı hatalar (
VALUE_CORRUPTED,INVALID_ARGUMENT): Düzenleyici, hizmet paketinin bozulmuş durumda olabileceğini varsayar ve temiz bir yeniden başlatma sağlamak için işlemi yeniden denemeden önce hizmet örneğini sonlandırmaya çalışır. - Kalıcı hatalar (
PERMISSION_DENIED): İşlem yeniden denenmez ve paket kurtarılamaz durumda kabul edilir.
Yaşam Döngüsü Yöneticisi kilitlenirse tüm hizmet paketi işlemleri kaybolur. Gerçek durum bilinmediğinden Orchestrator her örneği geçersiz kılar ve her örneği son istenen duruma getirmek için kalan yeniden denemelerle bir yeniden başlatma stratejisi uygular.
Tekrarlı olarak çöken veya başarısız olan paketlerde sonsuz kurtarma döngülerini önlemek için yeniden deneme sayacı yalnızca bir yaşam döngüsü işlemi başarılı olduğunda ya da yeni bir mod geçişi istendiğinde max_retries olarak sıfırlanır. Bir paket, art arda başarısızlıklar nedeniyle (örneğin, kilitlenme ile sonuçlanan bir geçiş hatası) yeniden deneme sınırını aşarsa yeniden deneme sayacı sıfırlanana kadar yeniden başlatılmaz.
Durumun Durum Monitörü'ne Bildirilmesi
Orchestrator, Health Monitor'un (HM) kaydolduğu dahili bir bağlayıcı arayüzü sunar. Bu arayüz, tüm hizmet paketlerinin durumu hakkında sürekli güncellemeler almasını sağlar. Orchestrator, bu arayüz üzerinden aşağıdakilerin her ikisini de aktif olarak bildirir:
- Yaşam döngüsü durumu: Mevcut yapılandırmaya ve etkin modlara (ör. başlatıldı, oluşturuldu veya yok edildi) göre örneğin amaçlanan durumu.
- Kurtarma durumu: Amaçlanan yaşam döngüsü durumuna ulaşma durumu. Bu durum, örneğin çalışır durumda olup olmadığını, şu anda bir hatadan sonra yeniden deneme yapıp yapmadığını veya tüm yeniden denemeler tükendikten sonra kurtarılamadığını gösterir.
Bu bilgiler, kalp atışı izleme için kaydedilmemiş olanlar da dahil olmak üzere tüm örnekler için raporlanır. HM, sanal makinenin durumunu bildirmek için API'lerini uygulamak üzere bu bilgileri kullanır. Daha fazla bilgiyi Sağlık izleme başlıklı makalede bulabilirsiniz.
Örnekler
Bu bölümde, koşullarla durumları yapılandırma örnekleri verilmektedir.
Temel hizmet örneği
- Koşulu olmadığından her zaman aktiftir.
- Tek bir hizmet örneğini başlatır.
state {
# Note: This state has no condition, hence its actions are valid throughout the lifetime of the program
instances_states { started: "ServiceBundleName" }
}
HVAC uygulaması örneği
Koşul:
custom_state != occupancy.OCCUPANCY_EMPTY || custom_state == preheat.PREHEAT_ONolduğunda etkin.HVAC ile ilgili birden fazla hizmet örneğini
startedolarak bildirir.
state {
condition {
or {
# I.e. when the vehicle is occupied (for example, by _DRIVER / _NON_DRIVER / _PET)
not {
custom_state {
mode: "occupancy"
state: "OCCUPANCY_EMPTY"
}
}
custom_state {
mode: "preheat"
state: "PREHEAT_ON"
}
}
}
# HVAC-related services
instances_states {
started: "HvacTemperatureCommand"
started: "TempSensorDriverZone"
started: "TempSensorPassengerZone"
started: "RefrigerantLoop"
}
}
Güç tasarrufu örneği
Koşul:
custom_state == system_power.SYSTEM_POWER_LOW && custom_state == range_ext.RANGE_EXT_ONolduğunda etkin.Bu durum, güç tasarrufu durumu olarak değerlendirilebilir.
HVAC ile ilgili bir hizmet örneğini
destroyedolarak bildirir.Bu örnekte,
SYSTEM_POWER_LOWveRANGE_EXT_ONmodları etkin olduğunda HVAC uygulamasıRefrigerantLoophizmet örneği olmadan çalışır:state { condition { and { custom_state { mode: "system_power" state: "SYSTEM_POWER_LOW" } custom_state { mode: "range_ext" state: "RANGE_EXT_ON" } } } # Disable services with high power consumption instances_states { destroyed: "RefrigerantLoop" } }
Gemide yaşam örneği
Durum:
power_state == ON && vehicle_state == LIFE_ON_BOARDise etkin.Bu durum, Arabanın içinde biri var ve araba açık olarak değerlendirilebilir.
Sıcaklık sensörlerini çalışır durumda olarak bildirir.
Aracın içinde birisi varken güvenlik nedeniyle sıcaklık gibi öğeler izlenir.
state {
condition {
and {
power_state: "ON"
vehicle_state: "LIFE_ON_BOARD"
}
}
# Temperature monitoring services
instances_states {
started: "TempSensorDriverZone"
started: "TempSensorPassengerZone"
}
}
Örnekler
Bu bölümde aşağıdakileri içeren tam örnekler verilmektedir:
İki örneği olan bir hizmet paketi sunan, hizmet paketi düzeyinde bir proto yapılandırma. Bu örneklerin her biri bir grubun parçasıdır.
Gruplarla modlara göre etkileşim kurma mantığını tanıtan VM düzeyinde bir proto yapılandırması
Hizmet paketi düzeyinde yapılandırma
# proto-file: //system/software_defined_vehicle/orchestration/distributed_config/src/protos/service_bundle_config.proto
# proto-message: ServiceBundleConfig
package_name: "oem.package"
service_bundle_name: "OemApplication"
instance: "fog_front_light"
instance: "fog_rear_light"
instance: "turn_signal_light"
custom_mode: "FOG"
custom_mode: "TURN"
group_mapping {
group: "fog_light"
instance: "fog_front_light"
instance: "fog_rear_light"
}
group_mapping {
group: "flasher_light"
instance: "turn_signal_light"
}
state {
condition {
power_state: "ON"
}
instances_states {
created: "turn_signal_light"
destroyed: "fog_front_light"
destroyed: "fog_rear_light"
}
}
Sanal makine düzeyinde yapılandırma
# proto-file: //system/software_defined_vehicle/orchestration/distributed_config/src/protos/vm_config.proto
# proto-message: VmConfig
group_mapping {
group: "lights"
subgroup: "fog_light"
subgroup: "flasher_light"
}
state {
condition {
custom_state {
mode: "FOG"
state: "ON"
}
}
groups_states {
started: "fog_light"
}
}
state {
condition {
custom_state {
mode: "TURN"
state: "RIGHT"
}
}
groups_states {
started: "flasher_light"
}
}
state {
condition {
vehicle_state: "SUSPEND_TO_RAM_ENTER"
}
groups_states {
created: "lights"
}
}
Paket yönetimi paralelliğini yapılandırma
ro.boot.sdv.max_bundles_management_threads sistem özelliği, hizmet paketi yaşam döngüsü işlemleri sırasında performansı ve kaynak tüketimini kontrol etmek için kullanılan önemli bir ayarlama parametresidir. Hizmet paketleri işlemlerinde maksimum paralellik düzeyini tanımlar ve doğrudan iki temel hizmeti etkiler:
Orchestration Engine: Bu hizmet, Orchestrator'ın Lifecycle Manager'a kaç eşzamanlı çağrı (ör.
startService,stopService) yapabileceğini belirlemek için özelliği okur. Bu, birçok paketin aynı anda durum değiştirebileceği başlatma ve mod geçişleri sırasında performans açısından çok önemlidir.Lifecycle Manager: Bu hizmet, gelen tüm istekleri işlemekten sorumlu olan Binder iş parçacığı havuzunun boyutunu hesaplamak için mülkün değerini kullanır. Bu, LM'nin düzenleyiciden gelen eşzamanlı istekleri işlemek için yeterli iş parçacığına sahip olmasını sağlar.
Bu özellik ayarlanmazsa her iki hizmet de varsayılan olarak 12 değerini kullanır.
Yapılandırma yöntemi
Mülkü, BoardConfig.mk değişkenine ekleyerek cihazınızın BoardConfig.mk dosyasında ayarlayabilirsiniz.BOARD_BOOTCONFIG Bu sayede, cihaz her başlatıldığında değerin uygulanması sağlanır.
BOARD_BOOTCONFIG += \
androidboot.sdv.max_bundles_management_threads=8
Cihazınızın değerini değiştirmek için uygun BoardConfig.mk dosyasında bu satırı değiştirin ve yeniden oluşturun.
Başlatma süresi optimizasyonu
ro.sdv.orchestrator.state.ready, write-once boole özelliği olup başlatma zamanı performans optimizasyonu stratejisinin bir parçasıdır. Bu, Orchestration aracısının ilk kullanıma hazırlama işlemini tamamladığını ve hizmet paketlerinin yaşam döngüsünü yönetmeye hazır olduğunu gösterir. Bu aracının temel amacı, diğer SDV aracıların başlatma sırasını kontrol ederek Orchestrator'ın ve yönetilen hizmet paketlerinin başlatılmasına öncelik vermektir.
- Ayarlayan: Düzenleme aracısı.
- Ne zaman: Açılış sırası sırasında bir kez.
- Kullanım: Bu özellik, çoğu SDV aracısının (Güncelleme Yöneticisi, VSIDL sağlayıcı, Sağlık Monitörü, Hizmet Bulma, Veri Tüneli, RPC, VPM ve Telemetri) başlatma sırasını kontrol etmek için başlatma sistemi tarafından kullanılır. Düzenleyiciyi erken başlatıp diğer ajanların bu özellik için beklemesini sağlayarak sistem, düzenleyicinin sistem kaynakları için rekabet etmeden hizmet paketlerini başlatma gibi kritik görevine başlayabilmesini sağlar.
Performans
Sistemin başlatılması sırasında tüm aracıların aynı anda başlatılması kaynak çekişmesine yol açabilir ve genel başlatma sürecini yavaşlatabilir. Bunu azaltmak için sistem özellikleri kullanılarak sıralı bir başlatma düzeni uygulanır:
- Hizmet paketleri kayıt defteri: Tüm hizmet paketi meta verilerini yüklemek için önce bu kayıt defteri başlatılır.
- Yaşam Döngüsü Yöneticisi ve Düzenleyici: Bu temel aracılar, kayıt defteri hazır olur olmaz çalışmaya başlar. Bu erken başlangıç, Orchestrator'ın yapılandırmasını değerlendirmeye başlamasına ve hizmet paketlerini hemen başlatmaya hazırlanmasına olanak tanıdığı için çok önemlidir.
- Diğer SDV aracıları: Yalnızca düzenleyici hazır olduktan sonra başlatılır.
Bu kontrollü sıra, Orchestrator'ın hizmet paketlerini mümkün olan en kısa sürede başlatmak için sistem kaynaklarını kullanma önceliğine sahip olmasını sağlar. Bu da daha hızlı, daha deterministik ve daha verimli bir sistem başlangıcı sağlar.
Orchestrator tarafından kullanılan modlar
Düzenleme aracısı, VPM tarafından iletilen araç ve güç modlarına etkin bir şekilde abone olur. Orchestrator ile Araç ve Güç Yönetimi (VPM) sistemi arasında ilk bağlantı kurulduktan sonra Orchestrator, aşağıdaki boolean sistem özelliklerini true olarak ayarlar:
sdv.orchestrator.bootup.power_mode.readysdv.orchestrator.bootup.vehicle_mode.ready
Düzenleme aracısı, yapılandırma dosyasını referans olarak kullanarak alınan modların geçerli değerlerine göre çalışan durumda olması gereken hizmet paketleri grubunu dinamik olarak hesaplar. Orkestratör daha sonra yaşam döngüsü yöneticisiyle iletişim kurarak hizmet paketlerinin gerçek durumunu hesaplanan hedef durumla eşleştirmek için farklı komutlar verir.
Araç ve güç durumları
Araç modu ve güç yönetimi (VPM) aracısı, SDV bileşenlerinin aracın mevcut durumu (ör. çalışma modu [Park veya Sürüş modunda] ve güç durumu [Açık ve Askıya Alındı]) hakkında bilgi sahibi olmasını sağlar. Orkestratör, hangi hizmet paketlerinin Orkestratör yapılandırmasına göre çalıştırılması gerektiğini tanımlamak için bu değerleri değerlendirir. Daha fazla bilgi için Araç ve güç yönetimi başlıklı makaleyi inceleyin.
Özel modlar
Çok sayıda araç modu olduğundan hepsini modelleyemiyoruz. Her OEM'nin farklı ihtiyaçları vardır ve araç modlarının standartlaştırılması tüm OEM kullanım alanlarını karşılayamaz. Bu nedenle, özel modlar olarak bilinen OEM'e özgü modları destekliyoruz. Bu modlar, mevcut araç ve güç modlarını genişletmez. Bunun yerine, yeni modlar tanımlamanıza olanak tanır.
İşlevsellik:
Global kapsam: Özel modlar globaldir ve Orchestrator tarafından yönetilen tüm VM'lerde eşit şekilde uygulanır.
Bileşen: Her özel mod değişikliği iki öğeden oluşur:
Ad: OEM tarafından özel modu temsil etmek için seçilen benzersiz tanımlayıcı.
Değer: Özel modun mevcut durumu. Değer ayarlanmadığında
UNDEFINEDolabilir.
Orkestratör rolü: Orkestratör, özel mod değerlerinin pasif alıcısı olarak hareket eder.
Hizmet paketi rolü: Her hizmet paketi birden fazla özel moda sahip olabilir ve herhangi birinde yeni değerler yayınlayabilir. Aynı özel moda birden fazla hizmet paketi sahip olabilir. Bu da özel bir modun farklı kaynaklardan yeni değerler alabileceği anlamına gelir.
Doğrulama sorumluluğu: Geçerli durum geçişlerinin sağlanmasından OEM'ler sorumludur. Orkestratör, yeni değerleri kabul eder.
Tahmini özellikler:
Tahmini sayı: Güç ve araç modları, çoğu hizmet paketinin yaşam döngüsünü yönetir. Özel modlar ise ek bir rol oynar. Özel modların sayısının yüzlerle değil, onlarca olmasını bekliyoruz.
Tahmini zamanlama: Modlar belirli aralıklarla gönderilmez. Bunun yerine modlar, kapı açma, park etme sırası başlatma, şarj döngüsü başlatma gibi belirli işlemler ve OEM tarafından tanımlanan öneme sahip diğer benzer etkinlikler tarafından tetiklenen, etkinliğe dayalıdır.
Özel mod tasarımı, belirli modları tanımlama ve yönetme esnekliği sağlarken Orchestrator'ın temel durum makinesi mantığına karşı tarafsız kalmasına olanak tanır.
Desteklenen modlar
Hizmet paketlerinin yalnızca sahip oldukları özel modlarda yayınlanmasını sağlamak için her birinin, hizmet paketi kayıt defteriyle yerel sanal makinede bulunan Orchestrator yapılandırmasında sahip olunan özel modların listesini açıkça belirtmesi gerekir. Bildirilmemiş bir özel moda yayınlama girişimleri silinir.
Bir hizmet paketinin yayınlamasına (dolayısıyla sahip olmasına) izin verilen özel modları beyan etmek için service_bundle_config proto şeması aşağıdakilerle genişletilir:
// Service bundle configuration.
//
// Defines service bundle metadata, its instances, and configuration for instances
// lifecycle states depending on the state of the vehicle.
message ServiceBundleConfig {
[...]
// The list of custom modes that this service bundle publishes.
repeated string custom_mode = 5;
}
Modlara göre paketleri yapılandırma
Mevcut Orchestrator proto yapılandırması (Condition bileşeni), özel modlara dayalı hizmet paketlerinin değiştirilmesini destekler:
message Condition {
oneof root {
string power_state = 1;
string vehicle_state = 2;
CustomState custom_state = 3;
Condition not = 4;
Expression and = 5;
Expression or = 6;
}
}
message CustomState {
// Custom mode being checked.
string mode = 1;
// State of the custom mode.
string state = 2;
}
Proto örneği
Aşağıdaki örnekte, bir hizmet paketinin örneklerinin TURN ve FOG durumuna göre başlatılacak şekilde nasıl yapılandırılacağı gösterilmektedir:
service_bundle_config {
package_name: "oem.package"
service_bundle_name: "OemApplication"
instance: "flasher_light"
// Service bundle is allowed to set values for the TURN mode
custom_mode: "TURN"
// Service bundle is allowed to set values for the FOG mode
custom_mode: "FOG"
state {
condition {
custom_state {
mode: "TURN"
state: "LEFT"
}
}
instances_states {
started: "flasher_light"
}
}
state {
condition {
custom_state {
mode: "FOG"
state: "ON"
}
}
// Group assumed to be defined containing all FOG lights instances.
groups_states {
started: "fog_lights"
}
}
}
Yeni özel modlar ayarlama
Yeni bir özel mod değeri ayarlama süreci, istenen değeri aynı sanal makinede çalışan yerel düzenleyiciye ileten hizmet paketiyle başlar. Ardından Orchestrator, hizmet paketinin belirtilen özel moda yayınlamak için gereken izinlere sahip olduğunu doğrular. Değeri diğer VM'lere yayması gerekip gerekmediğini belirlemek için .textproto içinde tanımlanan yapılandırmaya başvurur. Her Orchestrator, yayılma işlemi tamamlandıktan sonra durumunun değiştirilmesi gereken hizmet paketlerinin listesini bulmak için yapılandırmasını inceler.
RPC
Her sanal makinede çalışan her Orchestrator, yeni özel mod değerlerini dinlemek için bir RPC sunucusu oluşturur. Özel bir modu güncellemek isteyen her hizmet paketi, sunucu için bir RPC istemcisi oluşturmalıdır. Yetkisiz paketlerin sunucuya bağlanmasını önlemek için ACL'ler uygulanır.
RPC üzerinden yeni bir değer ayarlamaya yönelik proto tanımı şu şekilde görünür: örnek:
syntax = "proto3";
import "google/protobuf/timestamp.proto";
package com.sdv.google.Orchestrator;
// Representation of the request used by service bundles to update a custom mode.
// Service bundles are permitted to update only the custom modes specifically designated
// for them within the Orchestrator configuration.
message SetCustomStateRequest {
// Required.
// The name of the custom mode.
// The mode string can not be longer than 56 characters and can only contain
// letters, numbers, dashes, dots and underscores: [a-zA-Z0-9_-.].
// No other special character nor spaces should be present in the mode.
string mode = 1;
// Required.
// The new value for the custom mode.
// The value string can not be longer than 56 characters and can only contain
// letters, numbers, dashes, dots and underscores: [a-zA-Z0-9_-.].
// No other special character nor spaces should be present in the value.
string value = 2;
// Required.
// The timestamp in which the new custom mode value was set. This is used to
// prevent race conditions whenever different service bundles in different
// VMs want to set a new value for the same custom mode.
// We use this timestamp to order the requests and we promise eventual
// consistency: while temporary inconsistencies may occur, the system will
// eventually converges to the correct state.
.google.protobuf.Timestamp timestamp = 3;
}
// Representation of the set custom state response.
message SetCustomStateResponse {}
// Orchestrator interface for service bundles that update the value of a
// custom mode.
// When a new value is received, it is propagated to Orchestrators running on
// other VMs.
service CustomStateService {
// Updates the value for the custom mode.
// Returns the error:
// - PermissionDenied: the service is not authorized to update the custom mode.
// - InvalidArgument: the provided mode and/or value are not valid.
rpc SetCustomState(SetCustomStateRequest) returns (SetCustomStateResponse) {};
}
Güç geçişlerinin iptali
Orchestrator, SHUTDOWN_CANCELLED güç modu (VPM tarafından Orchestrator'a gönderilir) aracılığıyla devam eden güç geçişlerinin iptal edilmesine olanak tanır.
Örnek olarak aşağıdaki Orchestrator yapılandırmasını ele alalım:
state {
condition {
power_state: "SUSPEND_TO_RAM_ENTER"
}
instances_states {
started: "instance-1"
started: "instance-2"
started: "instance-3"
}
}
SHUTDOWN_CANCELLED modu alındığında, Orchestrator'ın davranışını iki temel senaryo belirler. Her iki durumda da SHUTDOWN_CANCELLED güç modu, sıranın sonuna eklenir. Ardından, sıraya alınmış öğeler tüketildikten sonra SHUTDOWN_CANCELLED yürütülür.
Senaryo 1: Devam eden mod bir güç modu
Orchestrator bir güç modu güncellemesi yürütüyorsa devam eden modun iptal edilmesi istenir. Yaşam Döngüsü Yöneticisi, devam eden bir geçişin iptal edilmesini doğal olarak desteklemese de Orchestrator, yeni hizmet paketi isteklerinin başlatılmadığını doğrular.
Örnek: Önceki örnekteki yapılandırmadan alınan instance-1, SHUTDOWN_CANCELLED modu alındığında başlatılma sürecindeyse instance-1 başlatma işlemini tamamlar. Ancak instance-2 ve instance-3, başlatıldı durumuna geçiş yapmaz.
2. senaryo: İşleme kuyruğunda bir güç modu var
Orchestrator'ın güç modu dışındaki bir güncellemeyi işlediği ve yürütülecek modlar sırasına bir güç isteğinin eklendiği durumlarda, güç geçişi sıradan kaldırılır. Bu durum, yürütülmesini engeller.
Örnek: Önceki örnekteki yapılandırma kullanıldığında, Orchestrator güçle ilgili olmayan bir güncelleme (ör. araç güncellemesi) üzerinde çalışıyorsa ve SUSPEND_TO_RAM_ENTER kuyruktaysa SHUTDOWN_CANCELLED sonuçlarının alınması, örneklerin (instance-1, instance-2, instance-3) hiçbirinin başlatılmamasına neden olur.
Uygulama örneği
RPC sunucusuna istemci oluşturmak için ara katman yazılımı tarafından oluşturulan kodu kullanmak isteyen bir müşterinin kataloğu aşağıdaki örnek gibi görünebilir:
# proto-file: //system/software_defined_vehicle/vsidl/language/src/protos/sdv/vsidl/v1/syntax.proto
# proto-message: VsidlEntry
package: "package_name"
service_bundle {
name: "service_bundle_name"
client {
service: "com.android.sdv.orchestrator.CustomStateService"
}
}
Kod oluştururken bağımlılığı Orchestrator kataloğuna eklemeniz gerekir:
--dependency-catalog-path orchestration/engine/stable/vsidl/*
Yeni bir değer göndermek için kullanılan istemci kodu şu şekilde görünür:
let fqin = ServiceFqin::builder()
.sdv_vm_name("vm_name")
.sdv_package_name("package_name")
.service_bundle_name("service_bundle_name")
.service_instance_name("instance_name")
.build()
.unwrap();
let context_ref = ContextRef::create(fqin);
let comms = Arc::new(SdvComms { context: context_ref });
// service_bundle_name is the bundle generated with middleware code that defines
// the RPC client to "com.android.sdv.orchestrator.CustomStateService".
let client = service_bundle_name::new(comms).await.unwrap();
let rpc_client = client
.create_rpc_client::<Client>(
UnitName::builder()
.vm_name(comms.context.get_self_fqin().get_sdv_vm_name())
.package_name("com.android.sdv.orchestrator")
.bundle_name("OrchestratorServiceBundle")
.service_unit_name(Client::DEFAULT_UNIT_NAME)
.build()
.unwrap(),
ClientOptions::default(),
)
.await;
let client = Arc::new(rpc_client.unwrap());
let request = SetCustomStateRequest {
mode: custom_mode_name,
value: custom_mode_value,
timestamp: MessageField::some(Timestamp::now()),
..Default::default()
};
let result = client.SetCustomState(&request).await;
// Process result
Hata ayıklama araçları
Orchestrator aracısı, dumpsys aracını destekler. Çalışan bir SDV örneğinde aşağıdaki komutu çalıştırarak bu işlevi çağırabilirsiniz:
adb shell dumpsys com.google.sdv.ISdvAgent/orch
Orchestrator aracısının iç durumunu hata ayıklamak ve bu konuda bilgi edinmek için bu aracı kullanın. Bu işlem sonucunda:
- Mevcut Mod Durumu: Etkin araç, güç ve özel modları görün.
- Özel Mod Yayıncıları: Hangi hizmetlerin özel mod yayınlayabileceğini (ve hangi modlarda) belirleyin.
- Hizmet başına gerekli durum: Önceden tanımlanmış koşullara ve mevcut modlara göre her hizmet paketinin durumunu öğrenin. Bu, bir hizmetin neden beklenen durumda olmadığını teşhis etmeye yardımcı olur.
- Mod Yaptırım Durumu: Devam eden bir zorunlu mod veya devam eden bir mod yoksa son zorunlu mod hakkında net bir resim elde edin.
- Mod Yaptırım Sırası: Yaptırım uygulanmayı bekleyen modları görüntüleyin.
Örneğin:
AGENT NAME: SDV Agent dump - Orchestrator
AGENT FQIN: instance1:com.android.sdv.orchestrator.OrchestratorServiceBundle/default
AGENT STATE: See orchestrator state below.
----------------
----------------
INTERNAL STATE REPORTERS:
*NAME: Configuration state
*REPORT:
Active modes:
MODE VALUE TIMESTAMP (scs, ns)
Power POWER_OFF_EXIT -
Vehicle VEHICLE_ON -
Custom("CHARGING") ON 1750757590 (scs) 466507459 (ns)
Custom("TIRE_PRESSURE") front-left 1750757570 (scs) 554522995 (ns)
Modes allowed to publish by bundle (FQIN: modes):
com.android.sdv.sample.orchestration/CustomModeControlBundle: CHARGING, TIRE_PRESSURE
Requested state for instances:
STATE FQIN
Started com.android.sdv.sample.orchestration/CustomModeControlBundle/always-started-instance
Started com.android.sdv.sample.orchestration/OrchestratedServiceBundle/my-instance
Started com.sdv.oem.sample.diagnostics/DiagnosticsSampleWithDataItem/instance
Started com.sdv.oem.sample.diagnostics/DiagnosticsSampleWithEvent/instance
Started com.sdv.oem.user_preferences/UserPreferencesServiceBundle/default
----------------
*NAME: Engine state
*REPORT:
Last mode enforced was Custom("CHARGING") with value "ON"
Next modes to process: []
----------------
Orkestratör tarafından yönetilen bireysel hizmet paketleri hakkında daha fazla bilgi edinmek için Lifecycle Manager'daki mevcut dumpsys'i aşağıdaki gibi kullanın:
dumpsys google.sdv.lifecycle.ILifecycleManager/default
Bu işlem, her hizmetin yaşam döngüsü durumu hakkında ayrıntılı bilgi sağlar. Orchestrator dumpsys çıkışını LifecycleManager'ın çıkışıyla birleştirerek sanal makinedeki hizmet paketlerinin yaşam döngüsü hakkında eksiksiz bir görünüm elde edebilirsiniz.