Yumuşak yeniden başlatmalar

Android 11, yeniden başlatma gerektiren güncellemeleri (örneğin, APEX paketlerine yönelik güncellemeler) uygulamak için kullanılan kullanıcı alanındaki işlemlerin çalışma zamanında yeniden başlatılması olan geçici yeniden başlatmaları destekler. Şu anda yazılımla yeniden başlatma, userdata bağlandıktan sonra başlatılan işlemlerle sınırlıdır.

Yazılımla yeniden başlatma aşağıdaki şekillerde istenir:

  • PowerManager PowerManager.reboot(PowerManager.REBOOT_USERSPACE) öğesini çağırarak

  • Kabuktan, adb shell svc power reboot userspace veya adb reboot userspace kullanarak

Yazılımla yeniden başlatmanın ardından kimlik bilgisi şifreli depolamanın kilidi açık kalır.

Bir cihaz geçici yeniden başlatmaları destekliyorsa PowerManager.isRebootingUserspace() API yöntemi true döndürür ve init.userspace_reboot.is_supported sistem özelliğinin değeri 1 eşittir.

Cihaz geçici yeniden başlatmaları desteklemiyorsa PowerManager.reboot(PowerManager.REBOOT_USERSPACE) , adb reboot userspace ve adb shell svc power reboot userspace yapılan çağrılar başarısız olur.

Yumuşak yeniden başlatma yürütme

Yazılımla yeniden başlatma istendikten sonra ( PowerManager aracılığıyla veya bir kabuktan), init aşağıdaki adımları gerçekleştirir:

  1. sys.powerctl=reboot,userspace değerini alır.

  2. Yazılımla yeniden başlatmayı izlemek için ayrı bir UserspaceRebootWatchdogThread() işlemini çatallar.

  3. Yazılımla yeniden başlatmayı etkileyebilecek tüm sistem özelliklerini sıfırlayan, userspace-reboot-requested bir eylemi tetikler. Etkilenen mülkler:

    • sys.usb.config
    • sys.usb.state
    • sys.boot_completed
    • dev.bootcomplete
    • sys.init.updatable_crashing
    • sys.init.updatable_crashing_process_name
    • apexd.status
    • sys.user.0.ce_available
    • sys.shutdown.requested
    • service.bootanim.exit

    Yukarıdaki özellikler önyükleme sırası sırasında tekrar ayarlanmalıdır. Gerekirse ek özellikleri sıfırlayabilirsiniz. Örnekler için rootdir/init.rc dosyasındaki on userspace-reboot-requested eyleme bakın.

  4. Aşağıdaki eylemleri gerçekleştiren DoUserspaceReboot işlevini çalıştırır:

    1. userdata bağlandıktan sonra başlatılan işlemlere SIGTERM gönderir ve durmalarını bekler.
    2. Zaman aşımına ulaşıldığında, çalışan tüm işlemleri sonlandırması için SIGKILL gönderir.
    3. /system/bin/vdc volume reset çağırır.
    4. ZRAM yedekleme cihazının bağlantısını keser.
    5. Aktif APEX paketlerinin bağlantısını keser.
    6. Önyükleme montajı ad alanına geri döner.
    7. userspace-reboot-resume eylemini tetikler.

Yazılımla yeniden başlatmadan önce dosya sistemi denetim noktası oluşturma istendiyse, userspace-reboot-fs-remount eylemi sırasında userdata denetim noktası oluşturma moduna yeniden bağlanır (ayrıntılar için aşağıdaki bölüme bakın). sys.boot_completed property 1 olarak ayarlandıktan sonra yazılımla yeniden başlatma dikkate alınır. Yazılımla yeniden başlatmanın sonunda ekran kapalı tutulur ve onu uyandırmak için açık kullanıcı etkileşimi gerekir.

Dosya sistemi kontrol noktası oluşturma

Yazılımlı yeniden başlatmadan önce bir dosya sistemi denetim noktası istendiyse, yazılımlı yeniden başlatma sırasında userdata denetim noktası modunda yeniden bağlanır. Yeniden bağlama mantığı fs_mgr_remount_userdata_into_checkpointing işlevinde uygulanır ve denetim noktası oluşturma yöntemleri arasında farklılık gösterir. Özellikle userdata desteklediğinde:

  • Dosya sistemi düzeyinde denetim noktası oluşturma (örneğin, f2fs ), userdata checkpoint=disable seçeneğiyle yeniden bağlanır.

  • Blok düzeyinde kontrol noktası oluşturma (örneğin, ext4 ), ardından /data bağlantısı kesilir ve üzerine monte edildiği tüm ana cihaz eşleyici cihazları yok edilir. Daha sonra userdata , normal kontrol noktası oluşturma önyüklemesinde kullanılanla aynı kod yolu kullanılarak bağlanır.

Kimlik bilgisi şifreli (CE) ve cihaz şifreli (DE) anahtarları yönetmek için dosya sistemi düzeyinde bir anahtarlık kullanılıyorsa, userdata kesildikten sonra anahtarlar kaybolur. Anahtar geri yüklemesine izin vermek için, bir dosya sistemi anahtarlığına bir anahtar yüklerken vold aynı zamanda fscrypt-provisioning türündeki anahtarı oturum düzeyindeki anahtarlığa da yükler. init_user0 çağrıldığında vold , anahtarları dosya sistemi anahtarlığına yeniden yükler.

Sert yeniden başlatmaya geri dönüş

Yazılımla yeniden başlatmanın cihazı kullanılamaz durumda bırakmamasını sağlamak için Android 11, aşağıdaki koşullardan biri karşılandığında tetiklenen donanımla yeniden başlatmaya geri dönüş içerir:

  • Bir aygıt, belirli bir zaman aşımı süresi içinde yazılımla yeniden başlatmayı (yani sys.init.userspace_reboot.in_progress=1 ) başlatamıyor.
  • Belirli bir zaman aşımı süresinde bir işlem durdurulamaz.
  • /system/bin/vdc volume reset işlemi başarısız oluyor.
  • zRAM cihazının bağlantısının kesilmesi başarısız olur.
  • Etkin bir APEX paketinin bağlantısı hatalı şekilde kesiliyor.
  • userdata denetim noktası moduna yeniden bağlama girişimi başarısız olur.
  • Bir aygıt belirli bir zaman aşımı süresi içinde başarıyla önyükleme yapamıyor (yani sys.boot_completed=1 ).

Cihaz başına yapılandırma

Bazı yazılımla yeniden başlatma özellikleri, aşağıdaki özelliklerin değerleri değiştirilerek ayarlanabilir:

  • init.userspace_reboot.is_supported , bir cihazın yazılımla yeniden başlatma işlemini ne zaman gerçekleştirebileceğini kontrol eder. Bu özelliğin değeri false , 0 ise veya belirtilmemişse yeniden başlatma girişimleri reddedilir.
  • init.userspace_reboot.sigkill.timeoutmillis SIGKILL sinyali alan işlemlerin durdurulması için zaman aşımını milisaniye cinsinden kontrol eder. İşlemlerden biri verilen zaman aşımı süresinde durdurulamazsa, donanımdan yeniden başlatmaya geri dönüş tetiklenir.
  • init.userspace_reboot.sigterm.timeoutmillis , sonlandırılacak bir SIGTERM sinyali alan işlemler için zaman aşımını milisaniye cinsinden kontrol eder. Belirtilen zaman aşımı süresinde sonlandırılamayan tüm işlemler bir SIGKILL sinyali alır.
  • init.userspace_reboot.started.timeoutmillis , yazılımla yeniden başlatmanın başlatılması için zaman aşımını milisaniye cinsinden kontrol eder (yani, sys.init.userspace_reboot.in_progress=1 ). Bir aygıt verilen zaman aşımı süresi içinde yazılımlı yeniden başlatmayı başlatamazsa, donanımsal yeniden başlatmaya geri dönüş tetiklenir.
  • init.userspace_reboot.userdata_remount.timeoutmillis userdata kesmek için zaman aşımını milisaniye cinsinden kontrol eder. Bir aygıt verilen zaman aşımı süresi içinde userdata bağlantısını kesemezse, donanımdan yeniden başlatmaya geri dönüş tetiklenir.
  • init.userspace_reboot.watchdog.timeoutmillis bir aygıtın başarıyla önyüklenmesi için zaman aşımını kontrol eder (yani, sys.boot_completed=1 ). Bir aygıtın belirtilen zaman aşımı süresi içinde önyüklemesi başarısız olursa, donanımdan yeniden başlatmaya geri dönüş tetiklenir.

Yazılımla yeniden başlatma sırasında animasyonu özelleştirin

Yazılımla yeniden başlatmanın referans uygulaması, yazılımla yeniden başlatma sırasında gösterilen animasyonu özelleştirme yeteneğini içerir.

userspace-reboot-fs-remount eyleminin sonunda init , bootanim hizmetini başlatır. Bu hizmet, listelenen sırayla aşağıdaki animasyon dosyalarının varlığını arar ve bulduğu ilk dosyayı oynatır:

  • /product/media/userspace-reboot.zip
  • /oem/media/userspace-reboot.zip
  • /system/media/userspace-reboot.zip

Yazılımla yeniden başlatmaya özel bir animasyon dosyası belirtilmezse, bootanim varsayılan bir android animasyonu gösterir.

Test yapmak

Android 11, yazılımla yeniden başlatmanın referans uygulamasını içerir. Ayrıca UserspaceRebootHostTest CTS testlerini kullanarak yazılımdan yeniden başlatmayı doğrulayabilirsiniz.