Doğrudan Başlatma modunu destekleyin

Android 7.0, cihaz açılmış ancak kullanıcının cihazın kilidini açmadığı durumlarda güvenli bir Doğrudan Başlatma modunda çalışır. Bu özelliği desteklemek için sistem, veriler için iki depolama yeri sağlar:

  • Varsayılan depolama konumu olan ve yalnızca kullanıcı cihazın kilidini açtıktan sonra kullanılabilen kimlik bilgisi ile şifrelenmiş depolama alanı.
  • Cihaz şifrelemeli depolama alanı: Bu, hem Doğrudan Başlatma modunda hem de kullanıcı cihazın kilidini açtıktan sonra kullanılabilen bir depolama konumudur.

Varsayılan olarak, uygulamalar Doğrudan Başlatma modunda çalışmaz. Uygulamanızın Doğrudan Başlatma modu sırasında işlem yapması gerekiyorsa uygulama bileşenlerini bu modda çalışacak şekilde kaydedebilirsiniz. Doğrudan Açılış modunda çalışması gereken uygulamaların bazı yaygın kullanım alanları şunlardır:

  • Çalar saat uygulamaları gibi planlanmış bildirimleri olan uygulamalar.
  • SMS uygulamaları gibi önemli kullanıcı bildirimleri sağlayan uygulamalar.
  • TalkBack gibi erişilebilirlik hizmetleri sunan uygulamalar.

Uygulamanızın Doğrudan Önyükleme modunda çalışırken verilere erişmesi gerekiyorsa cihaz şifrelenmiş depolama alanını kullanın. 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 bilgileriyle şifrelenmiş depolama alanı 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 isteme

Uygulamalar, Doğrudan Başlatma modunda çalışabilmek veya cihazın şifrelenmiş depolama alanına erişebilmek için bileşenlerini sisteme kaydettirmelidir. Uygulamalar, bileşenleri şifreleme bilincine sahip olarak işaretleyerek sisteme kaydedilir. Bileşeninizi şifreleme bilincine sahip olarak işaretlemek için manifest dosyanızda android:directBootAware özelliğini true olarak ayarlayın.

Şifreleme bilincine sahip bileşenler, cihaz yeniden başlatıldığında sistemden ACTION_LOCKED_BOOT_COMPLETED yayın mesajı almak için kaydolabilir. Bu noktada cihaz şifrelenmiş depolama alanı kullanılabilir ve bileşeniniz, planlanmış bir alarmı tetikleme gibi Doğrudan Başlatma modunda çalıştırılması gereken görevleri yürütebilir.

Aşağıdaki kod snippet'i, BroadcastReceiver değerinin şifreleme bilincine sahip olarak nasıl kaydedileceğini ve uygulama manifest dosyasına ACTION_LOCKED_BOOT_COMPLETED için bir intent filtresi ekleneceğini gösteren bir örnektir:

<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 cihaz şifrelenmiş depolama alanına hem de kimlik bilgisi şifrelenmiş depolama alanına erişebilir.

Cihazla şifrelenmiş depolama alanına eriş

Cihaz şifrelenmiş depolama alanına erişmek için Context.createDeviceProtectedStorageContext() çağrısı yaparak ikinci bir Context örneği oluşturun. Bu bağlam kullanılarak yapılan tüm Storage API çağrıları, cihazın şifrelenmiş depolama alanına erişir. Aşağıdaki örnek, cihazın şifrelenmiş depolama alanına erişir ve mevcut bir uygulama veri dosyasını açar:

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. Cihazla şifrelenmiş depolama alanını genel amaçlı şifrelenmiş depolama alanı olarak kullanmayın. Özel kullanıcı bilgileri veya Doğrudan Başlatma modunda gerekmeyen şifrelenmiş veriler için kimlik bilgileriyle şifrelenmiş depolama alanı 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 kaydederek kilit açma bildirim mesajlarını dinleyin. Kullanıcı, başlatma sonrasında cihazın kilidini açtığında:

  • Uygulamanızda anında bildirim gerektiren ön plan işlemleri varsa ACTION_USER_UNLOCKED mesajını dinleyin.
  • Uygulamanız yalnızca gecikmeli bildirimde işlem yapabilecek arka plan işlemleri kullanıyorsa ACTION_BOOT_COMPLETED mesajını dinleyin.

Kullanıcı cihazın kilidini açtıysa UserManager.isUserUnlocked() numaralı telefonu arayarak bunu öğrenebilirsiniz.

Mevcut verileri taşıma

Bir kullanıcı cihazını Doğrudan Önyükleme modunu kullanacak şekilde güncelliyorsa cihaz şifrelenmiş depolama alanına taşınması gereken mevcut verileriniz olabilir. Tercih ve veritabanı verilerini kimlik bilgisi şifrelenmiş depolama alanı ile cihaz şifrelenmiş depolama alanı arasında taşımak için yöntem çağırıcı olarak hedef bağlamı ve bağımsız değişken olarak kaynak bağlamı ile Context.moveSharedPreferencesFrom() ve Context.moveDatabaseFrom() kullanın.

Şifre veya yetkilendirme jetonu gibi gizli kullanıcı bilgilerini, kimlik bilgisi şifrelenmiş depolama alanından cihaz şifrelenmiş depolama alanına taşımayın. Cihaz şifrelenmiş depolama alanına hangi diğer verilerin taşınacağına karar verirken dikkatli olun. Bazı durumlarda, iki şifrelenmiş mağazada ayrı veri kümelerini yönetmeniz gerekebilir.

Şifrelemeye duyarlı uygulamanızı test etme

Doğrudan Başlatma modu etkinken şifrelemeye duyarlı uygulamanızı test edin.

Android'in son sürümlerini çalıştıran çoğu cihaz, kilit ekranı kimlik bilgisi (PIN, desen veya şifre) ayarlandığında Doğrudan Başlatma modunu etkinleştirir. Ö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 aşağıdaki kabuk komutunu çalıştırın:

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 şifrelemesi (ro.crypto.type=block) kullanan ve Android 7.0 ile Android 12 arasındaki sürümleri çalıştıran bazı cihazlar dosya tabanlı şifrelemeye dönüştürülebilir. Bunu yapmanın iki yolu vardır:

      Uyarı: Dosya tabanlı şifrelemeye dönüştürme yöntemlerinden hangisi kullanılırsa kullanılsın cihazdaki tüm kullanıcı verileri silinir.

    • Henüz yapmadıysanız cihazda Ayarlar > Telefon hakkında'ya gidip Derleme numarası'na yedi kez dokunarak Geliştirici seçenekleri'ni etkinleştirin. Ardından, Ayarlar > Geliştirici seçenekleri'ne gidip Dosya şifrelemeye 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 geliştirme sırasında emülasyon modunu kullanın. Bu mod, veri kaybına neden olabilir. Emüle doğrudan önyükleme 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 kabuk komutunu çalıştırın:

    adb shell sm set-emulate-fbe false
    

    Bu komutlardan herhangi biri çalıştırıldığında cihaz yeniden başlatılır.

Cihaz politikası şifreleme durumunu kontrol etme

Cihaz yönetimi uygulamaları, cihazın mevcut şifreleme durumunu kontrol etmek için DevicePolicyManager.getStorageEncryptionStatus() hizmetini kullanabilir.

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 her zaman aktif olmayan durumda şifrelenmiş olarak depolanır.

Uygulamanız Android 7.0 (API 24) veya sonraki sürümleri hedefliyorsa cihaz tam disk şifrelemesi kullanıyorsa getStorageEncryptionStatus() ENCRYPTION_STATUS_ACTIVE değerini döndürür. 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ı derliyorsanız cihazın şifrelenmiş olup olmadığını belirlemek için hem ENCRYPTION_STATUS_ACTIVE hem de ENCRYPTION_STATUS_ACTIVE_PER_USER öğesini kontrol ettiğinizden emin olun.

Ek kod örnekleri

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