Doğrudan Başlatma modunu destekleyin

Android 7.0 güvenli Doğrudan Başlatma modunda çalışır ancak kullanıcı cihazın kilidini açmadığında olanak tanır. Sistem, bunu desteklemek amacıyla veriler için iki depolama konumu sağlar:

  • Varsayılan depolama konumu olan kimlik bilgisi ile şifrelenmiş depolama ve yalnızca kullanıcı cihazın kilidini açtıktan sonra kullanılabilir.
  • Hem Doğrudan Başlatma modunda hem de kullanıcının cihazın kilidini açmasından sonra kullanılabilen bir depolama alanı olan cihaz şifrelenmiş depolama alanı.

Varsayılan olarak uygulamalar Doğrudan Başlatma modu sırasında çalışmaz. Uygulamanızın Doğrudan Başlatma modu sırasında işlem yapması gerekiyorsa bu modda çalışacak uygulama bileşenlerini kaydedebilirsiniz. Bazı yaygın kullanım alanları Doğrudan Başlatma modunda çalışması gereken uygulamalar için şunları içerir:

  • Alarm saati uygulamaları gibi planlanmış bildirimlere sahip uygulamalar.
  • SMS uygulamaları gibi önemli kullanıcı bildirimleri sağlayan uygulamalar.
  • TalkBack gibi erişilebilirlik hizmetleri sunan uygulamalar.

Uygulamanızın Doğrudan Başlatma modunda çalışırken verilere erişmesi gerekiyorsa şunu kullanın: şifrelenmiş depolama alanı. Cihaz şifrelenmiş depolama alanı, yalnızca cihaz doğrulanmış başlatmayı başarıyla gerçekleştirdikten sonra kullanılabilen bir anahtarla şifrelenmiş veriler içerir.

PIN veya şifre gibi kullanıcı kimlik bilgileriyle ilişkili bir anahtarla şifrelenmesi gereken veriler için kimlik bilgisi şifrelenmiş depolama alanını kullanın. Kimlik bilgisi şifrelenmiş depolama alanı, kullanıcı cihazın kilidini başarıyla açtıktan sonra ve cihazı yeniden başlatana kadar kullanılabilir. Kullanıcı, cihazın kilidini açtıktan sonra kilit ekranını etkinleştirirse kimlik bilgisi şifrelenmiş depolama alanı kullanılabilir durumda kalır.

Doğrudan önyükleme sırasında çalıştırma erişimi isteğinde bulunma

Uygulamalar, çalıştırılmadan önce bileşenlerini sisteme kaydetmelidir. Doğrudan Başlatma modunda çalışabilir veya şifrelenmiş cihaza erişebilir depolama alanına sahip olursunuz. Uygulamalar, bileşenleri şu şekilde işaretleyerek sisteme kaydedilir: şifrelemeye duyarlı olduğundan emin olun. Bileşeninizi şifreleme bilincine sahip olarak işaretlemek için manifest dosyanızda android:directBootAware özelliğini true olarak ayarlayın.

Şifrelemeye duyarlı bileşenler, indirilebilecek Şuradan ACTION_LOCKED_BOOT_COMPLETED anons: sistemi tekrar başlatmaz. Bu noktada cihaz şifrelendi kullanılabilir bir depolama alanı sağlar ve bileşeniniz, Google'a geçiş yaptığınızda doğrudan Başlatma modunda çalışırken (ör. programlanmış bir alarmı tetiklemek) çalışır.

Aşağıdaki kod snippet'i, BroadcastReceiver şifrelemeyi kullanın ve Uygulama manifestinde, ACTION_LOCKED_BOOT_COMPLETED için intent filtresi:

<receiver
  android:directBootAware="true" >
  ...
  <intent-filter>
    <action android:name="android.intent.action.LOCKED_BOOT_COMPLETED" />
  </intent-filter>
</receiver>

Kullanıcı cihazın kilidini açtıktan sonra tüm bileşenler hem kimlik bilgileri ile şifrelenmiş depolama alanının yanı sıra şifreli depolama alanı da dahildir.

Cihazla şifrelenmiş depolama alanına eriş

Cihazla şifrelenmiş depolama alanına erişmek için ikinci bir şifre oluşturun Çağrı yaparak Context örneği Context.createDeviceProtectedStorageContext(). Tüm depolama API'leri Bu bağlam kullanılarak yapılan aramalar, cihazın şifrelenmiş depolama alanına erişir. Aşağıdaki örnekte, cihazın şifrelenmiş depolama alanına erişiliyor ve mevcut bir uygulama verisi dosyası açılıyor:

Kotlin

val directBootContext: Context = appContext.createDeviceProtectedStorageContext()
// Access appDataFilename that lives in device encrypted storage
val inStream: InputStream = directBootContext.openFileInput(appDataFilename)
// Use inStream to read content...

Java

Context directBootContext = appContext.createDeviceProtectedStorageContext();
// Access appDataFilename that lives in device encrypted storage
FileInputStream inStream = directBootContext.openFileInput(appDataFilename);
// Use inStream to read content...

Cihaz şifrelenmiş depolama alanını yalnızca Doğrudan Önyükleme modu sırasında erişilmesi gereken bilgiler için kullanın. Cihaz şifrelenmiş depolama alanını genel amaçlı şifrelenmiş depolama alanı olarak kullanmayın. Özel kullanıcı bilgileri veya işlem sırasında ihtiyaç duyulmayan şifrelenmiş veriler için Doğrudan Başlatma modu, kimlik bilgisi ile şifrelenmiş depolamayı kullanın.

Kullanıcının kilidi açması hakkında bildirim alma

Kullanıcı, yeniden başlatma işleminden sonra cihazın kilidini açtığında uygulamanız, kimlik bilgisiyle şifrelenmiş depolamaya erişmeye geçebilir ve kullanıcı kimlik bilgilerine bağlı olan normal sistem hizmetlerini kullanabilir.

Kullanıcı, yeniden başlatma sonrasında cihazın kilidini açtığında bildirim almak için: çalışan bir bileşenden BroadcastReceiver kaydedin kilit açma bildirim mesajlarını dinlemeyi sağlar. Kullanıcı cihazın kilidini açtığında açılıştan sonra:

  • Uygulamanızda acil bildirim gerektiren ön plan işlemleri varsa ACTION_USER_UNLOCKED mesajını dinle.
  • Uygulamanız yalnızca gecikmeli olarak işlem yapabilecek arka plan işlemleri kullanıyorsa bildirimi dinleyin, ACTION_BOOT_COMPLETED mesajını alırsınız.

Kullanıcının cihazın kilidini açıp açmadığını öğrenmek için UserManager.isUserUnlocked() numaralı telefonu arayabilirsiniz.

Mevcut verileri taşıma

Bir kullanıcı cihazını Doğrudan Başlatma modunu kullanacak şekilde güncellerse Cihazla şifrelenmiş depolama alanına taşınması gereken mevcut veriler. Tercih ve veritabanı verilerini kimlik bilgisi şifrelenmiş depolama alanı ile cihaz şifrelenmiş depolama alanı arasında taşımak için hedef bağlamı yöntem çağıran ve kaynak bağlamı bağımsız değişken olarak kullanarak Context.moveSharedPreferencesFrom() ve Context.moveDatabaseFrom()'u kullanın.

Şifreler veya yetkilendirme jetonları gibi gizli kullanıcı bilgilerini cihaz şifrelenmiş depolama alanına kimlik bilgisi şifrelenmiş depolama alanı. Neye karar vereceğiniz konusunda size en uygun gelen yanıtı verin şifreli depolama alanına taşınacak diğer veriler. Bazı durumlarda, şifrelenmiş iki depoda ayrı veri kümeleri oluşturabilir.

Şifreleme bilincine sahip uygulamanızı test etme

Şifreleme bilincine sahip uygulamanızı Doğrudan Başlatma modu etkinken test edin.

Android'in son sürümlerini çalıştıran cihazların çoğu Doğrudan Başlatma modunu etkinleştiriyor kilit ekranı kimlik bilgisi (PIN, desen veya şifre) ayarlandığında geçerlidir. Özellikle, dosya tabanlı şifreleme kullanan tüm cihazlarda bu durum geçerlidir. Bir cihazın dosya tabanlı şifreleme kullanıp kullanmadığını kontrol etmek için şu komutu çalıştırın: kabuk komutu:

adb shell getprop ro.crypto.type

Çıkış file ise cihazda dosya tabanlı şifreleme etkindir.

Varsayılan olarak dosya tabanlı şifreleme kullanmayan cihazlarda Doğrudan Başlatma modunu test etmek için başka seçenekler olabilir:

  • Tam disk şifrelemeyi (ro.crypto.type=block) kullanan ve Android 7.0 ile Android 12 arasında bir sürümü çalıştıran bazı cihazlar dosya tabanlı şifrelemeye dönüştürülebilir. Bunu yapmanın iki yolu vardır:

      Uyarı: Her iki yöntem de Dosya tabanlı şifreleme, cihazdaki tüm kullanıcı verilerini siler.

    • Cihazınızda Ayarlar > Telefon hakkında'ya gidip Derleme numarası'na yedi kez dokunarak Geliştirici seçenekleri'ni etkinleştirmediyseniz bunu yapın. Ardından Ayarlar > Geliştirici seçeneklerini tıklayın ve Dosya şifrelemesine dönüştür'ü seçin.
    • Alternatif olarak aşağıdaki kabuk komutlarını da çalıştırabilirsiniz:
      adb reboot-bootloader
      fastboot --wipe-and-use-fbe
      
  • Android 13 veya daha eski sürümleri çalıştıran cihazlar, şifrelenmiş dosyaların kilitlenmesi ve kilidinin açılmasının etkilerini simüle etmek için dosya izinlerini kullanan "taklit edilmiş" bir Doğrudan Önyükleme modunu destekler. Yalnızca emülasyonlu modu kullan Geliştirme sırasında; veri kaybına neden olabilir. Emulated Direct Boot modunu etkinleştirmek için cihazda bir kilit deseni ayarlayın, kilit deseni ayarlarken güvenli bir başlangıç ekranı istenirse "Hayır teşekkürler"i seçin ve ardından aşağıdaki kabuk komutunu çalıştırın:

    adb shell sm set-emulate-fbe true
    

    Emülasyonlu Doğrudan Başlatma modunu kapatmak için aşağıdaki kabuğu çalıştırın komut:

    adb shell sm set-emulate-fbe false
    

    Bu komutlardan birinin çalıştırılması cihazın yeniden başlatılmasına neden olur.

Cihaz politikası şifreleme durumunu kontrol etme

Kullanabilecekleri cihaz yönetimi uygulamaları DevicePolicyManager.getStorageEncryptionStatus() cihazın mevcut şifreleme durumunu kontrol edin.

Uygulamanız Android 7.0'dan (API 24) daha düşük bir API düzeyini hedefliyorsa getStorageEncryptionStatus(), cihazda doğrudan önyükleme ile tam disk şifrelemesi veya dosya tabanlı şifreleme kullanılıyorsa ENCRYPTION_STATUS_ACTIVE döndürür. Her iki durumda da veriler, kullanımda değilken her zaman şifrelenmiş halde saklanır.

Uygulamanız Android 7.0 (API 24) veya sonraki sürümleri hedefliyorsa getStorageEncryptionStatus() karşılığında iade Cihaz tam disk şifreleme kullanıyorsa ENCRYPTION_STATUS_ACTIVE. Cihaz, Doğrudan Başlatma ile dosya tabanlı şifreleme kullanıyorsa ENCRYPTION_STATUS_ACTIVE_PER_USER döndürülür.

Android 7.0'ı hedefleyen bir cihaz yönetimi uygulaması oluşturursanız cihazın şifrelenmiş olup olmadığını belirlemek için hem ENCRYPTION_STATUS_ACTIVE hem de ENCRYPTION_STATUS_ACTIVE_PER_USER değerini kontrol ettiğinizden emin olun.

Diğer kod örnekleri

DirectBoot örnek, bu sayfada ele alınan API'lerin kullanımını daha ayrıntılı bir şekilde gösterir.