Yerel ağ izni

Yerel alan ağındaki (LAN) cihazlara, INTERNET iznine sahip tüm uygulamalar erişebilir. Bu, uygulamaların yerel cihazlara bağlanmasını kolaylaştırır ancak kullanıcının parmak izini oluşturma ve konum için proxy olma gibi gizlilik etkileri de vardır.

Yerel Ağ Korumaları projesi, yerel ağa erişimi yeni bir çalışma zamanı izniyle sınırlayarak kullanıcının gizliliğini korumayı amaçlar.

Etki

Android 16'da bu izin, isteğe bağlı olarak etkinleştirilebilen bir özelliktir. Bu nedenle, yalnızca bu izni etkinleştiren uygulamalar etkilenir. Bu özelliği etkinleştirmenin amacı, uygulama geliştiricilerin uygulamalarının hangi bölümlerinin örtülü yerel ağ erişimine bağlı olduğunu anlamalarını sağlamaktır. Böylece, gelecekteki bir Android sürümünde bu bölümler için izin koruması hazırlayabilirler.

Uygulamalar, kullanıcının yerel ağına aşağıdaki yöntemlerle erişirse etkilenir:

  • Yerel ağ adreslerinde ham soketlerin doğrudan veya kütüphane tarafından kullanılması (ör. Multicast DNS (mDNS) veya Simple Service Discovery Protocol (SSDP)).
  • Yerel ağa erişen çerçeve düzeyindeki sınıfların (ör. NsdManager) kullanılması.

Etkinin ayrıntıları

Yerel ağ adresine ve adresinden gelen trafik için yerel ağ erişimi izni gerekir. Aşağıdaki tabloda sık rastlanan bazı durumlar listelenmiştir:

Uygulama Düşük Düzeyli Ağ İşlemi Yerel Ağ İzni Gerekli
Giden TCP bağlantısı oluşturma evet
Gelen TCP bağlantısını kabul etme evet
UDP tek noktaya yayın, çok noktaya yayın veya yayın gönderme evet
Gelen UDP tek yayını, çoklu yayını, yayını alma evet

Bu kısıtlamalar ağ yığınına derinlemesine uygulanır ve bu nedenle tüm ağ API'leri için geçerlidir. Platformda veya yönetilen kodda oluşturulan soketler, Cronet ve OkHttp gibi ağ kitaplıkları ve bunların üzerinde uygulanan tüm API'ler buna dahildir. Yerel ağda .local soneki olan hizmetleri çözümlemek için yerel ağ izni gerekir.

Önceki kurallarla ilgili istisnalar:

  • Bir cihazın DNS sunucusu yerel ağdaysa bu sunucuya / sunucudan gelen trafik (53 numaralı bağlantı noktasında) için yerel ağ erişim izni gerekmez.
  • Uygulama içi seçici olarak Çıkış Değiştirici'yi kullanan uygulamaların yerel ağ izinlerine ihtiyacı olmayacak (daha fazla bilgi sonraki bir sürümde paylaşılacaktır).

Android 17'nin Uygulanması

Android 17'den itibaren, Android 17 veya sonraki sürümleri hedefleyen uygulamalar için yerel ağ korumaları zorunlu hale getirilmiş ve uygulanmaya başlanmıştır.

En Boy Oranı Android 16 Android 17
Hedef SDK 36 37 veya sonraki sürümler
İzin Geçici olarak NEARBY_WIFI_DEVICES kullanıldı ACCESS_LOCAL_NETWORK
Varsayılan erişim Yerel ağ erişimi açık olmalıdır. Hedef SDK'sını güncelleyen tüm uygulamalar için yerel ağ varsayılan olarak engellenir.
İzin Grubu Mevcut NEARBY_DEVICES izin grubunun bir parçası

Uygulama işlevselliğinin yaptırım uygulandıktan sonra bozulmadığını doğrulamak için SDK 37 veya sonraki sürümleri hedefleyen uygulamaların yerel ağ erişimini yönetmek üzere aşağıdaki yollardan birini kullanması gerekir:

1. yol: Gizliliği korumaya yönelik seçicileri kullanma

Sistem aracılı keşif ve bağlantı görevlerinde, çalışma zamanında geniş kapsamlı izin isteğinde bulunmamak için seçicileri kullanın. Kullanım alanınıza bağlı olarak aşağıdaki seçicileri kullanın:

  • Medya oynatma: Google Cast'i destekleyen uygulamalarda çıkış değiştirici özelliği kullanılabilir. Bu sayede geliştiriciler, uygulamanın geniş kapsamlı ACCESS_LOCAL_NETWORK iznini istemesine gerek kalmadan kullanıcıların belirli aktarım cihazlarını seçmesine olanak tanıyabilir.
  • Genel Bağlantı: NsdManager, mDNS keşfi için sistem tarafından çalıştırılan bir hizmet seçici içerir. Uygulama tüm ağı taramak yerine, sistem kullanıcının uygulamaya erişim için tek bir cihaz seçmesine olanak tanıyan bir iletişim kutusu gösterir.
val discoveryRequest = DiscoveryRequest.Builder("_http._tcp")
    .setFlags(DiscoveryRequest.FLAG_SHOW_PICKER)
    .build()

nsdManager.registerServiceInfoCallback(discoveryRequest, executor, object : NsdManager.ServiceInfoCallback {
    override fun onServiceUpdated(serviceInfo: NsdServiceInfo) {
        // Handle the user-selected and discovered service
        // NsdServiceInfo.getHostAddresses() can now be connected to
        // without ACCESS_LOCAL_NETWORK permission
    }
})

B yolu: Çalışma zamanı izni isteme (geniş erişim)

Bu yol, yerel ağa geniş ve kalıcı erişim gerektiren ev otomasyonu veya IoT cihaz yönetimi gibi karmaşık kullanım alanları için gereklidir.

  • Manifest Dosyasında İzin Bildirme: Geliştiriciler, ACCESS_LOCAL_NETWORK iznini AndroidManifest.xml içinde açıkça bildirmelidir.

  • Çalışma Zamanında İzin İste: Uygulamalar, yerel ağ erişimi denemeden önce iznin verilip verilmediğini kontrol etmelidir. Aksi takdirde, standart sistem istemini tetiklemek için Activity.requestPermission() numaralı telefonu aramaları gerekir.

  • Önceden verilmiş senaryo: ACCESS_LOCAL_NETWORK izni, NEARBY_DEVICES izin grubunun bir parçasıdır. Bu grupta başka bir izin (ör. Bluetooth izinleri) vermiş olan kullanıcılara yerel ağ erişimi için tekrar istem gösterilmez.

  • Reddetme ve İptal İşlemleri: Uygulamalar, kullanıcının isteği reddettiği veya daha sonra sistem ayarlarında izni iptal ettiği durumları sorunsuz bir şekilde ele almalıdır. Bu gibi senaryolarda yerel ağ trafiği engellenir.

İzin isteği sıfırlama sayacı stratejisi

Platform, bir uygulamanın daha önce NEARBY_DEVICES izin grubunu (artık ACCESS_LOCAL_NETWORK iznini de içeriyor) reddetmesinin, gerekçesini yeterince sunduktan sonra izni istemesini engellediği senaryoları ele alan bir sayaç sıfırlama stratejisi uygular. Bu mekanizma, uygulamanın requestPermission() API'sini çağırması için ek fırsatlar sunar ve ACCESS_LOCAL_NETWORK izniyle ilgili ret sayısını etkili bir şekilde sıfırlar. Bu sayede, özellikle ilk ret, uygulama temel işlevi için yerel ağ erişiminin gerekliliğini iletmeden önce gerçekleştiyse kullanıcıyla daha ayrıntılı bir yeniden etkileşim sağlanabilir.

Bölünmüş izin modeli

Yerel Ağ İzni, hedef SDK'larına göre yeni ve eski uygulamaları farklı şekilde işlemek için bölünmüş izin taşıma stratejisi kullanır.

Kategori Hedef SDK düzeyi Yerel ağ erişimi davranışı Geliştiricinin yapması gereken işlem
Yeni Uygulamalar / Güncellenen Uygulamalar >= 37 (Android 17) Varsayılan olarak engellenir ACCESS_LOCAL_NETWORK çalışma zamanı iznini beyan etme ve isteme
Eski uygulamalar < 37 INTERNET izni olan uygulamalar, ACCESS_LOCAL_NETWORK için örtülü bir izin alır ve erişimlerini koruyabilir. Bu durum geçicidir ve uygulama, hedef SDK'yı 37'ye yükselttiğinde varsayılan olarak engellenir. Hemen kod değişikliği yapmanız gerekmez.

Kullanım Alanına Göre LNP Stratejisi

  • Yayınlama: Medya yayınlama işlevleri için en uygun ve gizliliği koruyan strateji, çıkış değiştiriciyi kullanmaktır. Bu yöntem, sistemin kullanıcının adına yerel ağ keşfi ve bağlantısını yönetmesine olanak tanır. Böylece uygulamanın ACCESS_LOCAL_NETWORK izni istemesine gerek kalmaz.

  • Tarayıcılar: Hataların işlenmesi, protokole bağlı olarak farklı yaklaşımlar gerektirir. UDP hataları EPERM hata koduyla sonuçlanır. TCP bağlantıları için tarayıcılar, bir paketin LNP tarafından engellenip engellenmediğini belirlemek üzere NDK API'sini kullanmalıdır. Bu API android_getnetworkblockedreason(int sockFd) döndürür.ANDROID_NETWORK_BLOCKED_REASON_LNP

  • Diğer Kullanım Alanları (ör. IoT): mDNS kullanarak cihaz bulan uygulamalar, cihazların izinsiz bulunmasına olanak tanıyan android.net.nsd.DiscoveryRequest#FLAG_SHOW_PICKER'yi ve IP adreslerini almak için NsdManager#registerServiceInfoCallback / NsdManager#resolveService'yi kullanmalıdır. Bu şekilde elde edilen IP adreslerine yapılan bağlantılar için ACCESS_LOCAL_NETWORK izni gerekmez.

Doğrudan yerel ağ iletişimi gerektiren ve sistem aracılı seçicileri kullanamayan uygulamalar için önerilen yaklaşım, izin sıfırlama sayacı stratejisini kullanmaktır. ACCESS_LOCAL_NETWORK izni kullanıcı tarafından iptal edilirse bu mekanizma, uygulamanın izni yeniden istemesi için ek fırsatlar sunar. Böylece geliştiriciler, kullanıcıya daha net bir gerekçe sunabilir.

Android 16 Kılavuzu

Yerel ağ kısıtlamalarını etkinleştirmek için aşağıdakileri yapın:

  1. Cihazınıza Android 16 Beta 3 veya sonraki bir sürümün yüklü olduğu sistem görüntüsü yükleme
  2. Test edilecek uygulamayı yükleyin.
  3. adb kullanarak Appcompat yapılandırmasını etkinleştirme/devre dışı bırakma

    adb shell am compat enable RESTRICT_LOCAL_NETWORK <package_name>
    
  4. Cihazı yeniden başlatın

Artık uygulamanızın yerel ağa erişimi kısıtlanıyor ve yerel ağa erişme girişimleri soket hatalarına yol açıyor. Uygulama sürecinizin dışında yerel ağ işlemleri gerçekleştiren API'ler (ör. NsdManager) kullanıyorsanız bu API'ler kayıt sırasında etkilenmez.

Erişimi geri yüklemek için uygulamanıza NEARBY_WIFI_DEVICES izni vermeniz gerekir.

  • Uygulamanın NEARBY_WIFI_DEVICES iznini manifest içinde beyan ettiğinden emin olun.
  • Ayarlar > Uygulamalar > [Uygulama Adı] > İzinler > Yakındaki cihazlar > İzin ver'e gidin.

Uygulamanızın yerel ağa erişimi geri yüklenir ve tüm senaryolarınız, uygulamayı kaydetmeden önceki gibi çalışır. Uygulama ağı trafiği bu durumdan nasıl etkilenir?

İzin Giden LAN İsteği Giden/Gelen İnternet İsteği Gelen LAN İsteği
Verildi Works Works Works
İzin Verilmedi Başarısızlar Works Başarısızlar

Uyumluluk yapılandırmasını devre dışı bırakmak için aşağıdaki komutu kullanın.

adb shell am compat disable RESTRICT_LOCAL_NETWORK <package_name>

Hatalar

Eksik izin nedeniyle yerel ağ erişimi isteği başarısız olursa:

  • TCP bağlantıları genellikle zaman aşımı hatası ile sonuçlanır.

  • UDP hataları ve genel izin retleri genellikle EPERM hata koduyla sonuçlanır.

Hatalar

Aşağıdakilerle ilgili hata gönderin ve geri bildirimde bulunun:

  • LAN erişimindeki tutarsızlıklar (belirli bir erişimin "yerel ağ" erişimi olarak kabul edilmemesi gerektiğini düşünüyorsanız)
  • LAN erişiminin engellenmesi gerektiği ancak engellenmediği hatalar
  • LAN erişiminin engellenmemesi gerektiği halde engellendiği hatalar

Aşağıdakiler bu değişiklikten etkilenmemelidir:

  • İnternet erişimi
  • Mobil Ağ