Uygulamanızı daha güvenli hale getirerek kullanıcıların size güvenmeye devam etmesini ve cihaz bütünlüğünü sağlarsınız.
Bu sayfada, uygulamanızın güvenliği üzerinde önemli ve olumlu bir etkiye sahip olan çeşitli en iyi uygulamalar sunulmaktadır.
Güvenli iletişimi zorunlu kılma
Uygulamanız ile diğer uygulamalar arasında paylaşılan verileri koruma altına aldığınızda hem uygulamanızı daha kararlı hale getirir hem de gönderip aldığınız verileri korursunuz.
Uygulamalar arasındaki iletişimi koruma
Uygulamalar arasında daha güvenli iletişim kurmak için uygulama seçici, imzaya dayalı izinler ve dışa aktarılmayan içerik sağlayıcılarla birlikte örtülü amaçları kullanın.
Uygulama seçiciyi gösterme
Örtülü bir amaç, kullanıcının cihazında en az iki olası uygulamayı başlatabiliyorsa uygulama seçiciyi açıkça gösterin. Bu etkileşim stratejisi, kullanıcıların hassas bilgileri güvendikleri bir uygulamaya aktarmasına olanak tanır.
Kotlin
val intent = Intent(Intent.ACTION_SEND) val possibleActivitiesList: List<ResolveInfo> = packageManager.queryIntentActivities(intent, PackageManager.MATCH_ALL) // Verify that an activity in at least two apps on the user's device // can handle the intent. Otherwise, start the intent only if an app // on the user's device can handle the intent. if (possibleActivitiesList.size > 1) { // Create intent to show chooser. // Title is something similar to "Share this photo with." val chooser = resources.getString(R.string.chooser_title).let { title -> Intent.createChooser(intent, title) } startActivity(chooser) } else if (intent.resolveActivity(packageManager) != null) { startActivity(intent) }
Java
Intent intent = new Intent(Intent.ACTION_SEND); List<ResolveInfo> possibleActivitiesList = getPackageManager() .queryIntentActivities(intent, PackageManager.MATCH_ALL); // Verify that an activity in at least two apps on the user's device // can handle the intent. Otherwise, start the intent only if an app // on the user's device can handle the intent. if (possibleActivitiesList.size() > 1) { // Create intent to show chooser. // Title is something similar to "Share this photo with." String title = getResources().getString(R.string.chooser_title); Intent chooser = Intent.createChooser(intent, title); startActivity(chooser); } else if (intent.resolveActivity(getPackageManager()) != null) { startActivity(intent); }
İlgili bilgiler:
İmza tabanlı izinleri uygulama
Kontrol ettiğiniz veya sahibi olduğunuz iki uygulama arasında veri paylaşırken imza tabanlı izinleri kullanın. Bu izinler için kullanıcı onayı gerekmez. Bunun yerine, verilere erişen uygulamaların aynı imzalama anahtarı kullanılarak imzalandığı kontrol edilir. Bu nedenle, bu izinler daha sorunsuz ve güvenli bir kullanıcı deneyimi sunar.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <permission android:name="my_custom_permission_name" android:protectionLevel="signature" />
İlgili bilgiler:
Uygulamanızın içerik sağlayıcılarına erişimi engelleme
Uygulamanızdaki verileri sahip olmadığınız farklı bir uygulamaya göndermeyi planlamıyorsanız diğer geliştiricilerin uygulamalarının, uygulamanızın ContentProvider
nesnelerine erişmesini açıkça engelleyin. Bu ayar, uygulamanız Android 4.1.1 (API düzeyi 16) veya daha eski sürümlerin yüklü olduğu cihazlara yüklenebiliyorsa özellikle önemlidir. Çünkü <provider>
öğesinin android:exported
özelliği, Android'in bu sürümlerinde varsayılan olarak true
'dir.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ... > <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.myapp.fileprovider" ... android:exported="false"> <!-- Place child elements of <provider> here. --> </provider> ... </application> </manifest>
Hassas bilgileri göstermeden önce kimlik bilgisi isteme
Uygulamanızdaki hassas bilgilere veya premium içeriğe erişebilmeleri için kullanıcılardan kimlik bilgisi isterken bir PIN/şifre/desen ya da biyometrik kimlik bilgisi (ör. yüz tanıma veya parmak izi tanıma özelliğini kullanarak) talep edin.
Biyometrik kimlik bilgilerini nasıl isteyeceğiniz hakkında daha fazla bilgi edinmek için biyometrik kimlik doğrulama rehberine bakabilirsiniz.
Ağ güvenliği önlemleri uygulama
Aşağıdaki bölümlerde, uygulamanızın ağ güvenliğini nasıl artırabileceğiniz açıklanmaktadır.
TLS trafiğini kullanma
Uygulamanız, tanınmış ve güvenilir bir sertifika yetkilisi (CA) tarafından verilmiş sertifikaya sahip bir web sunucusuyla iletişim kuruyorsa aşağıdaki gibi bir HTTPS isteği kullanın:
Kotlin
val url = URL("https://www.google.com") val urlConnection = url.openConnection() as HttpsURLConnection urlConnection.connect() urlConnection.inputStream.use { ... }
Java
URL url = new URL("https://www.google.com"); HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection(); urlConnection.connect(); InputStream in = urlConnection.getInputStream();
Ağ güvenliği yapılandırması ekleme
Uygulamanızda yeni veya özel CA'lar kullanılıyorsa ağınızın güvenlik ayarlarını bir yapılandırma dosyasında belirtebilirsiniz. Bu işlem, herhangi bir uygulama kodunu değiştirmeden yapılandırma oluşturmanıza olanak tanır.
Uygulamanıza ağ güvenliği yapılandırma dosyası eklemek için aşağıdaki adımları uygulayın:
- Yapılandırmayı uygulamanızın manifest dosyasında bildirin:
-
res/xml/network_security_config.xml
konumunda bulunan bir XML kaynak dosyası ekleyin.Belirli alanlara yönelik tüm trafiğin HTTPS kullanması gerektiğini belirtmek için düz metni devre dışı bırakın:
<network-security-config> <domain-config cleartextTrafficPermitted="false"> <domain includeSubdomains="true">secure.example.com</domain> ... </domain-config> </network-security-config>
Geliştirme işlemi sırasında, kullanıcı tarafından yüklenen sertifikalara açıkça izin vermek için
<debug-overrides>
öğesini kullanabilirsiniz. Bu öğe, uygulamanın yayın yapılandırmasını etkilemeden hata ayıklama ve test sırasında uygulamanızın güvenlikle ilgili önemli seçeneklerini geçersiz kılar. Aşağıdaki snippet'te, bu öğenin uygulamanızın ağ güvenliği yapılandırması XML dosyasında nasıl tanımlanacağı gösterilmektedir:<network-security-config> <debug-overrides> <trust-anchors> <certificates src="user" /> </trust-anchors> </debug-overrides> </network-security-config>
<manifest ... > <application android:networkSecurityConfig="@xml/network_security_config" ... > <!-- Place child elements of <application> element here. --> </application> </manifest>
İlgili bilgiler: Ağ güvenliği yapılandırması
Kendi güven yöneticinizi oluşturma
TLS denetleyiciniz her sertifikayı kabul etmemelidir. Aşağıdaki koşullardan biri kullanım alanınız için geçerliyse bir güven yöneticisi ayarlamanız ve oluşan tüm TLS uyarılarını ele almanız gerekebilir:
- Yeni veya özel bir CA tarafından imzalanmış sertifikası olan bir web sunucusuyla iletişim kuruyorsunuz.
- Bu CA, kullandığınız cihaz tarafından güvenilir olarak kabul edilmiyor.
- Ağ güvenliği yapılandırması kullanamazsınız.
Bu adımları tamamlama hakkında daha fazla bilgi edinmek için bilinmeyen bir sertifika yetkilisini işleme konusundaki tartışmaya bakın.
İlgili bilgiler:
WebView nesnelerini dikkatli kullanma
WebView
Uygulamanızdaki nesneler, kullanıcıların kontrolünüz dışındaki sitelere gitmesine izin vermemelidir. Mümkün olduğunda, uygulamanızın WebView
nesneleri tarafından yüklenen içeriği kısıtlamak için izin verilenler listesi kullanın.
Ayrıca, uygulamanızın WebView
nesnelerindeki içeriği tamamen kontrol etmediğiniz ve güvenmediğiniz sürece JavaScript arayüzü
desteğini asla etkinleştirmeyin.
HTML ileti kanallarını kullanma
Uygulamanızın Android 6.0 (API düzeyi 23) ve sonraki sürümlerin yüklü olduğu cihazlarda JavaScript arayüzü desteğini kullanması gerekiyorsa aşağıdaki kod snippet'inde gösterildiği gibi bir web sitesi ile uygulamanız arasında iletişim kurmak yerine HTML mesaj kanallarını kullanın:
Kotlin
val myWebView: WebView = findViewById(R.id.webview) // channel[0] and channel[1] represent the two ports. // They are already entangled with each other and have been started. val channel: Array<out WebMessagePort> = myWebView.createWebMessageChannel() // Create handler for channel[0] to receive messages. channel[0].setWebMessageCallback(object : WebMessagePort.WebMessageCallback() { override fun onMessage(port: WebMessagePort, message: WebMessage) { Log.d(TAG, "On port $port, received this message: $message") } }) // Send a message from channel[1] to channel[0]. channel[1].postMessage(WebMessage("My secure message"))
Java
WebView myWebView = (WebView) findViewById(R.id.webview); // channel[0] and channel[1] represent the two ports. // They are already entangled with each other and have been started. WebMessagePort[] channel = myWebView.createWebMessageChannel(); // Create handler for channel[0] to receive messages. channel[0].setWebMessageCallback(new WebMessagePort.WebMessageCallback() { @Override public void onMessage(WebMessagePort port, WebMessage message) { Log.d(TAG, "On port " + port + ", received this message: " + message); } }); // Send a message from channel[1] to channel[0]. channel[1].postMessage(new WebMessage("My secure message"));
İlgili bilgiler:
Doğru izinleri verme
Uygulamanızın düzgün çalışması için gereken minimum sayıda izin isteyin. Mümkün olduğunda, uygulamanızın artık ihtiyaç duymadığı izinleri istemekten vazgeçin.
İzinleri ertelemek için amaçları kullanma
Mümkün olduğunda, başka bir uygulamada tamamlanabilecek bir işlemi tamamlamak için uygulamanıza izin eklemeyin. Bunun yerine, isteği gerekli izne zaten sahip olan farklı bir uygulamaya ertelemek için bir amaç kullanın.
Aşağıdaki örnekte, kullanıcılardan READ_CONTACTS
ve WRITE_CONTACTS
izinlerini istemek yerine onları bir kişiler uygulamasına yönlendirmek için bir amaç nasıl kullanılacağı gösterilmektedir:
Kotlin
// Delegates the responsibility of creating the contact to a contacts app, // which has already been granted the appropriate WRITE_CONTACTS permission. Intent(Intent.ACTION_INSERT).apply { type = ContactsContract.Contacts.CONTENT_TYPE }.also { intent -> // Make sure that the user has a contacts app installed on their device. intent.resolveActivity(packageManager)?.run { startActivity(intent) } }
Java
// Delegates the responsibility of creating the contact to a contacts app, // which has already been granted the appropriate WRITE_CONTACTS permission. Intent insertContactIntent = new Intent(Intent.ACTION_INSERT); insertContactIntent.setType(ContactsContract.Contacts.CONTENT_TYPE); // Make sure that the user has a contacts app installed on their device. if (insertContactIntent.resolveActivity(getPackageManager()) != null) { startActivity(insertContactIntent); }
Ayrıca, uygulamanızın dosya tabanlı G/Ç işlemleri (ör. depolamaya erişme veya dosya seçme) gerçekleştirmesi gerekiyorsa sistem, işlemleri uygulamanız adına tamamlayabildiğinden özel izinlere ihtiyacı yoktur. Daha da iyisi, kullanıcı belirli bir URI'deki içeriği seçtikten sonra, çağıran uygulamaya seçilen kaynağa erişim izni verilir.
İlgili bilgiler:
- Sık Kullanılan Amaçlar (Common Intents)
Intent
Uygulamalar arasında verileri güvenli bir şekilde paylaşma
Uygulamanızın içeriğini diğer uygulamalarla daha güvenli bir şekilde paylaşmak için aşağıdaki en iyi uygulamalardan yararlanın:
- Gerektiğinde salt okunur veya yalnızca yazma izinlerini zorunlu kılın.
-
FLAG_GRANT_READ_URI_PERMISSION
veFLAG_GRANT_WRITE_URI_PERMISSION
işaretlerini kullanarak istemcilere verilere tek seferlik erişim izni verin. - Veri paylaşırken
content://
URI'lerini kullanın,file://
URI'lerini kullanmayın. Aşağıdaki durumlardaFileProvider
sizin için bu işlemi yapar.
Aşağıdaki kod snippet'inde, bir uygulamanın PDF dosyasını ayrı bir PDF görüntüleyici uygulamasında göstermek için URI izni verme işaretlerinin ve içerik sağlayıcı izinlerinin nasıl kullanılacağı gösterilmektedir:
Kotlin
// Create an Intent to launch a PDF viewer for a file owned by this app. Intent(Intent.ACTION_VIEW).apply { data = Uri.parse("content://com.example/personal-info.pdf") // This flag gives the started app read access to the file. addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) }.also { intent -> // Make sure that the user has a PDF viewer app installed on their device. intent.resolveActivity(packageManager)?.run { startActivity(intent) } }
Java
// Create an Intent to launch a PDF viewer for a file owned by this app. Intent viewPdfIntent = new Intent(Intent.ACTION_VIEW); viewPdfIntent.setData(Uri.parse("content://com.example/personal-info.pdf")); // This flag gives the started app read access to the file. viewPdfIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); // Make sure that the user has a PDF viewer app installed on their device. if (viewPdfIntent.resolveActivity(getPackageManager()) != null) { startActivity(viewPdfIntent); }
Not: Yazılabilir uygulama ana dizininden dosya çalıştırmak W^X ihlalidir.
Bu nedenle, Android 10'u (API düzeyi 29) ve sonraki sürümleri hedefleyen güvenilmeyen uygulamalar, uygulamanın ana dizinindeki dosyalar üzerinde exec()
işlevini çağıramaz. Bu işlev yalnızca uygulamanın APK dosyasına yerleştirilmiş ikili kod üzerinde çağrılabilir.
Ayrıca Android 10 ve sonraki sürümleri hedefleyen uygulamalar, dlopen()
ile açılan dosyalardaki yürütülebilir kodu bellekte değiştiremez. Bu, metin yeniden konumlandırmaları içeren tüm paylaşılan nesne (.so
) dosyalarını kapsar.
İlgili bilgiler:
android:grantUriPermissions
Verileri güvenli bir şekilde saklama
Uygulamanızın hassas kullanıcı bilgilerine erişmesi gerekse de kullanıcılar, verilerini uygun şekilde koruyacağınıza güvendikleri takdirde uygulamanıza verilerine erişim izni verir.
Dahili depolama alanında özel verileri saklama
Tüm özel kullanıcı verilerini, uygulama başına korumalı alan oluşturulan cihazın dahili depolama alanında saklayın. Uygulamanızın bu dosyaları görüntülemek için izin istemesi gerekmez ve diğer uygulamalar bu dosyalara erişemez. Ek bir güvenlik önlemi olarak, kullanıcı bir uygulamanın yüklemesini kaldırdığında cihaz, uygulamanın dahili depolama alanına kaydettiği tüm dosyaları siler.
Aşağıdaki kod snippet'inde, dahili depolama alanına veri yazmanın bir yolu gösterilmektedir:
Kotlin
// Creates a file with this name, or replaces an existing file // that has the same name. Note that the file name cannot contain // path separators. val FILE_NAME = "sensitive_info.txt" val fileContents = "This is some top-secret information!" File(filesDir, FILE_NAME).bufferedWriter().use { writer -> writer.write(fileContents) }
Java
// Creates a file with this name, or replaces an existing file // that has the same name. Note that the file name cannot contain // path separators. final String FILE_NAME = "sensitive_info.txt"; String fileContents = "This is some top-secret information!"; try (BufferedWriter writer = new BufferedWriter(new FileWriter(new File(getFilesDir(), FILE_NAME)))) { writer.write(fileContents); } catch (IOException e) { // Handle exception. }
Aşağıdaki kod snippet'inde, ters işlem olan dahili depolama alanından veri okuma gösterilmektedir:
Kotlin
val FILE_NAME = "sensitive_info.txt" val contents = File(filesDir, FILE_NAME).bufferedReader().useLines { lines -> lines.fold("") { working, line -> "$working\n$line" } }
Java
final String FILE_NAME = "sensitive_info.txt"; StringBuffer stringBuffer = new StringBuffer(); try (BufferedReader reader = new BufferedReader(new FileReader(new File(getFilesDir(), FILE_NAME)))) { String line = reader.readLine(); while (line != null) { stringBuffer.append(line).append('\n'); line = reader.readLine(); } } catch (IOException e) { // Handle exception. }
İlgili bilgiler:
Kullanım alanına göre verileri harici depolama alanında saklama
Uygulamanıza özel olan ve hassas olmayan büyük dosyalar ile uygulamanızın diğer uygulamalarla paylaştığı dosyalar için harici depolama alanı kullanın. Kullandığınız API'ler, uygulamanızın uygulamaya özgü dosyalara mı yoksa paylaşılan dosyalara mı erişecek şekilde tasarlandığına bağlıdır.
Bir dosya gizli veya hassas bilgiler içermiyorsa ancak kullanıcıya yalnızca uygulamanızda değer sağlıyorsa dosyayı harici depolama alanında uygulamaya özel bir dizinde saklayın.
Uygulamanızın diğer uygulamalara değer sağlayan bir dosyaya erişmesi veya bu dosyayı depolaması gerekiyorsa kullanım alanınıza bağlı olarak aşağıdaki API'lerden birini kullanın:
- Medya dosyaları: Uygulamalar arasında paylaşılan resimleri, ses dosyalarını ve videoları depolamak ve bunlara erişmek için Media Store API'yi kullanın.
- Diğer dosyalar: İndirilen dosyalar da dahil olmak üzere diğer paylaşılan dosya türlerini depolamak ve bunlara erişmek için Depolama Erişim Çerçevesi'ni kullanın.
Depolama biriminin kullanılabilirliğini kontrol etme
Uygulamanız çıkarılabilir bir harici depolama cihazıyla etkileşimde bulunuyorsa kullanıcının, uygulamanız depolama cihazına erişmeye çalışırken depolama cihazını çıkarabileceğini unutmayın. Depolama cihazının kullanılabilir olduğunu doğrulayacak mantık ekleyin.
Verilerin geçerliliğini kontrol etme
Uygulamanız harici depolama alanındaki verileri kullanıyorsa verilerin içeriğinin bozulmadığından veya değiştirilmediğinden emin olun. Artık kararlı biçimde olmayan dosyaları işlemek için mantık ekleyin.
Aşağıdaki kod snippet'inde bir karma doğrulayıcı örneği yer almaktadır:
Kotlin
val hash = calculateHash(stream) // Store "expectedHash" in a secure location. if (hash == expectedHash) { // Work with the content. } // Calculating the hash code can take quite a bit of time, so it shouldn't // be done on the main thread. suspend fun calculateHash(stream: InputStream): String { return withContext(Dispatchers.IO) { val digest = MessageDigest.getInstance("SHA-512") val digestStream = DigestInputStream(stream, digest) while (digestStream.read() != -1) { // The DigestInputStream does the work; nothing for us to do. } digest.digest().joinToString(":") { "%02x".format(it) } } }
Java
Executor threadPoolExecutor = Executors.newFixedThreadPool(4); private interface HashCallback { void onHashCalculated(@Nullable String hash); } boolean hashRunning = calculateHash(inputStream, threadPoolExecutor, hash -> { if (Objects.equals(hash, expectedHash)) { // Work with the content. } }); if (!hashRunning) { // There was an error setting up the hash function. } private boolean calculateHash(@NonNull InputStream stream, @NonNull Executor executor, @NonNull HashCallback hashCallback) { final MessageDigest digest; try { digest = MessageDigest.getInstance("SHA-512"); } catch (NoSuchAlgorithmException nsa) { return false; } // Calculating the hash code can take quite a bit of time, so it shouldn't // be done on the main thread. executor.execute(() -> { String hash; try (DigestInputStream digestStream = new DigestInputStream(stream, digest)) { while (digestStream.read() != -1) { // The DigestInputStream does the work; nothing for us to do. } StringBuilder builder = new StringBuilder(); for (byte aByte : digest.digest()) { builder.append(String.format("%02x", aByte)).append(':'); } hash = builder.substring(0, builder.length() - 1); } catch (IOException e) { hash = null; } final String calculatedHash = hash; runOnUiThread(() -> hashCallback.onHashCalculated(calculatedHash)); }); return true; }
Önbellek dosyalarında yalnızca hassas olmayan verileri depolayın.
Hassas olmayan uygulama verilerine daha hızlı erişim sağlamak için bu verileri cihazın önbelleğinde saklayın. 1 MB'tan büyük önbellekler için getExternalCacheDir()
kullanın.
1 MB veya daha küçük önbellekler için getCacheDir()
kullanın.
Her iki yöntem de size uygulamanızın önbelleğe alınmış verilerini içeren File
nesnesini sağlar.
Aşağıdaki kod snippet'inde, uygulamanızın yakın zamanda indirdiği bir dosyanın nasıl önbelleğe alınacağı gösterilmektedir:
Kotlin
val cacheFile = File(myDownloadedFileUri).let { fileToCache -> File(cacheDir.path, fileToCache.name) }
Java
File cacheDir = getCacheDir(); File fileToCache = new File(myDownloadedFileUri); String fileToCacheName = fileToCache.getName(); File cacheFile = new File(cacheDir.getPath(), fileToCacheName);
Not: Uygulamanızın önbelleğini paylaşılan depolama alanına yerleştirmek için getExternalCacheDir()
kullanırsanız kullanıcı, uygulamanız çalışırken bu depolama alanını içeren medyayı çıkarabilir. Bu kullanıcı davranışının neden olduğu önbellek isabet etmemesini düzgün bir şekilde işleyecek mantık ekleyin.
Dikkat: Bu dosyalarda güvenlik uygulanmaz.
Bu nedenle, Android 10'u (API düzeyi 29) veya önceki sürümleri hedefleyen ve
WRITE_EXTERNAL_STORAGE
iznine sahip olan tüm uygulamalar bu önbelleğin içeriğine erişebilir.
İlgili bilgiler: Veri ve dosya depolamaya genel bakış
SharedPreferences'ı özel modda kullanma
Uygulamanızın SharedPreferences
nesnelerini oluşturmak veya bunlara erişmek için getSharedPreferences()
kullanırken MODE_PRIVATE
kullanın. Bu sayede, paylaşılan tercihler dosyasındaki bilgilere yalnızca uygulamanız erişebilir.
Uygulamalar arasında veri paylaşmak istiyorsanız SharedPreferences
nesnelerini kullanmayın. Bunun yerine, uygulamalar arasında verileri güvenli bir şekilde paylaşma adımlarını uygulayın.
İlgili bilgiler:
Hizmetleri ve bağımlılıkları güncel tutma
Çoğu uygulama, özel görevleri tamamlamak için harici kitaplıkları ve cihaz sistem bilgilerini kullanır. Uygulamanızın bağımlılarını güncel tutarak bu iletişim noktalarını daha güvenli hale getirirsiniz.
Google Play Hizmetleri güvenlik sağlayıcısını kontrol etme
Not: Bu bölüm yalnızca Google Play Hizmetleri'nin yüklü olduğu cihazları hedefleyen uygulamalar için geçerlidir.
Uygulamanız Google Play Hizmetleri'ni kullanıyorsa uygulamanızın yüklü olduğu cihazda Google Play Hizmetleri'nin güncellendiğinden emin olun. Kontrolü eşzamansız olarak, kullanıcı arayüzü iş parçacığı dışında gerçekleştirin. Cihaz güncel değilse yetkilendirme hatası tetiklenir.
Uygulamanızın yüklü olduğu cihazda Google Play Hizmetleri'nin güncel olup olmadığını belirlemek için SSL suistimallerine karşı koruma için güvenlik sağlayıcınızı güncelleme hakkındaki kılavuzda yer alan adımları uygulayın.
İlgili bilgiler:
Tüm uygulama bağımlılıklarını güncelleme
Uygulamanızı dağıtmadan önce tüm kitaplıkların, SDK'ların ve diğer bağımlıların güncel olduğundan emin olun:
- Android SDK gibi birinci taraf bağımlılıkları için Android Studio'da bulunan güncelleme araçlarını (ör. SDK Yöneticisi) kullanın.
- Üçüncü taraf bağımlılıkları için uygulamanızın kullandığı kitaplıkların web sitelerini kontrol edin ve mevcut güncellemeleri ve güvenlik yamalarını yükleyin.
İlgili bilgiler: Derleme bağımlılıkları ekleme
Daha fazla bilgi
Uygulamanızı daha güvenli hale getirme hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara göz atın:
- Temel uygulama kalitesi güvenlik kontrol listesi
- Uygulama güvenliğini iyileştirme programı
- YouTube'daki Android Developers kanalı
- Android Protected Confirmation: İşlem güvenliğini bir üst seviyeye taşıma