Google berkomitmen untuk mendorong terwujudnya keadilan ras bagi komunitas Kulit Hitam. Lihat caranya.

Praktik terbaik keamanan aplikasi

Dengan menjadikan aplikasi Anda lebih aman, Anda membantu menjaga kepercayaan pengguna dan integritas perangkat.

Halaman ini menyajikan praktik terbaik yang memiliki dampak positif dan signifikan pada keamanan aplikasi.

Menerapkan komunikasi yang aman

Dengan mengamankan data yang dipertukarkan antara aplikasi Anda dengan aplikasi lain, atau antara aplikasi Anda dengan sebuah situs, Anda akan meningkatkan stabilitas aplikasi dan melindungi data yang Anda kirim dan terima.

Gunakan intent implisit dan penyedia konten yang tidak diekspor

Menampilkan pemilih aplikasi

Jika sebuah intent implisit dapat meluncurkan minimal dua aplikasi pada perangkat pengguna, maka tampilkan pemilih aplikasi secara eksplisit. Strategi interaksi ini memungkinkan pengguna mentransfer informasi sensitif ke aplikasi yang mereka percayai.

Kotlin

val intent = Intent(ACTION_SEND)
val possibleActivitiesList: List<ResolveInfo> =
        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 =
        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);
}

Info terkait:

Menerapkan izin berbasis tanda tangan

Saat berbagi data antara dua aplikasi yang Anda kontrol atau miliki, gunakan izin berbasis tanda tangan. Izin ini tidak mengharuskan konfirmasi pengguna dan, sebagai gantinya, memeriksa bahwa aplikasi yang mengakses data ditandatangani menggunakan kunci penandatanganan yang sama. Oleh karena itu, izin ini menawarkan pengalaman pengguna yang lebih aman dan sederhana.

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp">
    <permission android:name="my_custom_permission_name"
                android:protectionLevel="signature" />

Info terkait:

Melarang akses ke penyedia konten aplikasi Anda

Kecuali jika bermaksud mengirimkan data dari aplikasi Anda ke aplikasi lain yang bukan milik Anda, Anda harus secara eksplisit melarang aplikasi developer lain untuk mengakses objek ContentProvider yang dimuat aplikasi Anda. Setelan ini sangat penting jika aplikasi Anda dapat diinstal di perangkat yang menjalankan Android 4.1.1 (API level 16) atau yang lebih rendah, karena atribut android:exported elemen <provider> secara default adalah true pada versi Android tersebut.

<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>

Minta kredensial sebelum menampilkan informasi sensitif

Saat meminta kredensial dari pengguna agar mereka dapat mengakses informasi sensitif atau konten premium dalam aplikasi Anda, mintalah PIN/sandi/pola atau kredensial biometrik, seperti menggunakan pengenalan wajah atau pengenalan sidik jari.

Untuk mempelajari cara meminta kredensial biometrik lebih lanjut, lihat panduan tentang autentikasi biometrik.

Menerapkan langkah pengamanan jaringan

Bagian berikut menjelaskan cara meningkatkan keamanan jaringan aplikasi.

Menggunakan traffic SSL

Jika aplikasi Anda berkomunikasi dengan server web yang memiliki sertifikat dari CA yang terkenal dan tepercaya, permintaan HTTPS-nya sangat sederhana:

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();

Menambahkan konfigurasi keamanan jaringan

Jika aplikasi Anda menggunakan CA baru atau kustom, Anda dapat mendeklarasikan setelan keamanan jaringan dalam file konfigurasi. Proses ini memungkinkan Anda membuat konfigurasi tanpa mengubah kode aplikasi apa pun.

Untuk menambahkan file konfigurasi keamanan ke aplikasi Anda, ikuti langkah-langkah berikut:

  1. Deklarasikan konfigurasi dalam manifes aplikasi Anda:
  2. <manifest ... >
        <application
            android:networkSecurityConfig="@xml/network_security_config"
            ... >
            <!-- Place child elements of <application> element here. -->
        </application>
    </manifest>
    
  3. Tambahkan file resource XML, yang terletak di res/xml/network_security_config.xml.

    Tentukan bahwa semua traffic ke domain tertentu harus menggunakan HTTPS dengan menonaktifkan clear-text:

    <network-security-config>
        <domain-config cleartextTrafficPermitted="false">
            <domain includeSubdomains="true">secure.example.com</domain>
            ...
        </domain-config>
    </network-security-config>
    

    Selama proses pengembangan, Anda dapat menggunakan elemen <debug-overrides> untuk secara eksplisit mengizinkan sertifikat yang diinstal oleh pengguna. Elemen ini menggantikan opsi yang penting bagi keamanan aplikasi Anda selama proses debug dan pengujian tanpa memengaruhi konfigurasi rilis aplikasi. Cuplikan berikut menunjukkan cara menetapkan elemen ini dalam file XML konfigurasi keamanan jaringan aplikasi Anda:

    <network-security-config>
        <debug-overrides>
            <trust-anchors>
                <certificates src="user" />
            </trust-anchors>
        </debug-overrides>
    </network-security-config>
    

Info terkait: Konfigurasi Keamanan Jaringan

Membuat pengelola kepercayaan Anda sendiri

Pemeriksa SSL Anda tidak boleh menerima setiap sertifikat. Anda mungkin perlu menyiapkan pengelola kepercayaan dan menangani semua peringatan SSL yang terjadi jika salah satu dari kondisi berikut terjadi dalam kasus penggunaan Anda:

  • Anda berkomunikasi dengan server web yang memiliki sertifikat yang ditandatangani oleh CA baru atau kustom.
  • CA itu tidak dipercayai oleh perangkat yang Anda gunakan.
  • Anda tidak dapat menggunakan konfigurasi keamanan jaringan.

Untuk mempelajari cara menyelesaikan langkah-langkah ini lebih lanjut, lihat pembahasan tentang menangani certificate authority yang tidak dikenal.

Info terkait:

Menggunakan objek WebView dengan hati-hati

Jika memungkinkan, hanya muat konten yang diizinkan dalam objek WebView. Dengan kata lain, objek WebView dalam aplikasi Anda tidak boleh mengizinkan pengguna untuk membuka situs yang berada di luar kendali Anda.

Selain itu, sebaiknya jangan mengaktifkan dukungan antarmuka JavaScript kecuali jika Anda sepenuhnya mengontrol dan memercayai konten dalam objek WebView aplikasi.

Gunakan saluran pesan HTML

Jika aplikasi Anda harus menggunakan dukungan antarmuka JavaScript di perangkat yang menjalankan Android 6.0 (API level 23) dan yang lebih tinggi, gunakan saluran pesan HTML, dan bukan berkomunikasi antara situs dan aplikasi Anda, seperti yang ditunjukkan dalam cuplikan kode berikut:

Kotlin

val myWebView: WebView = findViewById(R.id.webview)

// messagePorts[0] and messagePorts[1] represent the two ports.
// They are already tangled to 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);

// messagePorts[0] and messagePorts[1] represent the two ports.
// They are already tangled to 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"));

Info terkait:

Memberikan izin yang tepat

Aplikasi Anda sebaiknya hanya meminta izin sebanyak yang diperlukan untuk menjalankan fungsi dengan benar. Jika memungkinkan, aplikasi Anda harus melepaskan sebagian izin ini setelah tidak diperlukan lagi.

Gunakan intent untuk mengalihkan izin

Jika memungkinkan, jangan tambahkan izin ke aplikasi untuk menyelesaikan tindakan yang dapat diselesaikan di aplikasi lain. Sebagai gantinya, gunakan intent untuk mengalihkan permintaan tersebut ke aplikasi lain yang sudah memiliki izin yang diperlukan.

Contoh berikut menunjukkan cara menggunakan intent untuk mengarahkan pengguna ke aplikasi kontak, bukan meminta izin READ_CONTACTS dan WRITE_CONTACTS:

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);
}

Selain itu, jika aplikasi Anda perlu melakukan I/O berbasis file—seperti mengakses penyimpanan atau memilih file—aplikasi tersebut tidak memerlukan izin khusus karena sistem dapat menyelesaikan operasi itu atas nama aplikasi Anda. Lebih baik lagi, setelah pengguna memilih konten di URI tertentu, aplikasi panggilan mendapat izin ke resource yang dipilih.

Info terkait:

Berbagi data dengan banyak aplikasi dengan aman

Ikuti praktik terbaik berikut untuk membagikan konten aplikasi Anda kepada aplikasi lain dengan cara yang lebih aman:

Cuplikan kode berikut menunjukkan cara menggunakan tanda pemberian izin URI dan izin penyedia konten untuk menampilkan file PDF aplikasi dalam aplikasi Penampil PDF tersendiri:

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);
}

Catatan: Aplikasi tidak tepercaya yang menargetkan Android 10 (API level 29) dan yang lebih tinggi tidak dapat memanggil exec() pada file dalam direktori utama aplikasi tersebut. Eksekusi file dari direktori utama aplikasi yang dapat ditulis ini melanggar W^X. Aplikasi hanya boleh memuat kode biner yang tersemat dalam file APK aplikasi. Selain itu, aplikasi yang menargetkan Android 10 dan yang lebih tinggi tidak dapat menjalankan modifikasi dalam memori atas kode executable yang berasal dari file yang dibuka dengan dlopen(). Ini termasuk semua file objek bersama (.so) yang berisi relokasi teks.

Info terkait: android:grantUriPermissions

Menyimpan data dengan aman

Meskipun aplikasi Anda mungkin memerlukan akses ke informasi pengguna yang sensitif, pengguna akan memberi aplikasi Anda akses ke data mereka jika mereka percaya bahwa Anda akan mengamankan data itu dengan baik.

Simpan data pribadi dalam penyimpanan internal

Simpan semua data pribadi pengguna dalam penyimpanan internal perangkat, yang di-sandbox untuk setiap aplikasi. Aplikasi Anda tidak perlu meminta izin untuk melihat file ini, dan aplikasi lain tidak dapat mengakses file tersebut. Sebagai pengamanan tambahan, saat pengguna meng-uninstal aplikasi, perangkat akan menghapus semua file yang disimpan oleh aplikasi tersebut dalam penyimpanan internal.

Catatan: Jika data yang Anda simpan bersifat sangat sensitif atau pribadi, pertimbangkan untuk menangani objek EncryptedFile, yang tersedia dari Library keamanan, bukan objek File.

Cuplikan kode berikut menunjukkan satu cara untuk menulis data ke penyimpanan:

Kotlin

// Although you can define your own key generation parameter specification, it's
// recommended that you use the value specified here.
val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC
val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec)

// 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 fileToWrite = "my_sensitive_data.txt"
val encryptedFile = EncryptedFile.Builder(
    File(DIRECTORY, fileToWrite),
    context,
    masterKeyAlias,
    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()

val fileContent = "MY SUPER-SECRET INFORMATION"
        .toByteArray(StandardCharsets.UTF_8)
encryptedFile.openFileOutput().apply {
    write(fileContent)
    flush()
    close()
}

Java

// Although you can define your own key generation parameter specification, it's
// recommended that you use the value specified here.
KeyGenParameterSpec keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC;
String masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec);

// 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.
String fileToWrite = "my_sensitive_data.txt";
EncryptedFile encryptedFile = new EncryptedFile.Builder(
        new File(DIRECTORY, fileToWrite),
        context,
        masterKeyAlias,
        EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build();

byte[] fileContent = "MY SUPER-SECRET INFORMATION"
        .getBytes(StandardCharsets.UTF_8);
OutputStream outputStream = encryptedFile.openFileOutput();
outputStream.write(fileContent);
outputStream.flush();
outputStream.close();

Cuplikan kode berikut menunjukkan operasi terbalik, membaca data dari penyimpanan:

Kotlin

// Although you can define your own key generation parameter specification, it's
// recommended that you use the value specified here.
val keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC
val masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec)

val context = applicationContext
val fileToRead = "my_sensitive_data.txt"
val encryptedFile = EncryptedFile.Builder(
    File(DIRECTORY, fileToRead),
    context,
    masterKeyAlias,
    EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build()

val inputStream = encryptedFile.openFileInput()
val byteArrayOutputStream = ByteArrayOutputStream()
var nextByte: Int = inputStream.read()
while (nextByte != -1) {
    byteArrayOutputStream.write(nextByte)
    nextByte = inputStream.read()
}

val plaintext: ByteArray = byteArrayOutputStream.toByteArray()

Java

// Although you can define your own key generation parameter specification, it's
// recommended that you use the value specified here.
KeyGenParameterSpec keyGenParameterSpec = MasterKeys.AES256_GCM_SPEC;
String masterKeyAlias = MasterKeys.getOrCreate(keyGenParameterSpec);

Context context = getApplicationContext();
String fileToRead = "my_sensitive_data.txt";
EncryptedFile encryptedFile = new EncryptedFile.Builder(
        new File(DIRECTORY, fileToRead),
        context,
        masterKeyAlias,
        EncryptedFile.FileEncryptionScheme.AES256_GCM_HKDF_4KB
).build();

InputStream inputStream = encryptedFile.openFileInput();
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int nextByte = inputStream.read();
while (nextByte != -1) {
    byteArrayOutputStream.write(nextByte);
    nextByte = inputStream.read();
}

byte[] plaintext = byteArrayOutputStream.toByteArray();

Info terkait:

Menyimpan data dalam penyimpanan eksternal berdasarkan kasus penggunaan

Gunakan penyimpanan eksternal untuk file besar yang tidak bersifat sensitif, yang khusus untuk aplikasi Anda, serta file yang dibagikan aplikasi Anda ke aplikasi lain. API khusus yang Anda gunakan bergantung pada apakah aplikasi Anda dirancang untuk mengakses file khusus aplikasi atau mengakses file bersama.

Memeriksa ketersediaan volume penyimpanan

Jika aplikasi Anda berinteraksi dengan perangkat penyimpanan eksternal yang dapat dilepas, perlu diingat bahwa pengguna dapat melepas perangkat penyimpanan saat aplikasi Anda mencoba mengaksesnya. Sertakan logika untuk memverifikasi bahwa perangkat penyimpanan tersedia.

Mengakses file khusus aplikasi

Jika file tidak berisi informasi yang bersifat pribadi atau sensitif tetapi memberi nilai kepada pengguna hanya di aplikasi Anda saja, simpan file di direktori khusus aplikasi di penyimpanan eksternal.

Mengakses file bersama

Jika aplikasi Anda perlu mengakses atau menyimpan file yang memberi nilai kepada aplikasi lain, bergantung pada kasus penggunaan, gunakan salah satu API berikut:

Periksa validitas data

Jika aplikasi Anda menggunakan data dari penyimpanan eksternal, pastikan isi data belum rusak atau diubah. Aplikasi Anda juga harus menyertakan logika untuk menangani file yang tidak lagi dalam format yang stabil.

Contoh pemverifikasi hash muncul dalam cuplikan kode berikut:

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;
}

Simpan hanya data yang tidak sensitif dalam file cache

Untuk memberikan akses lebih cepat ke data aplikasi yang tidak bersifat sensitif, simpan data tersebut dalam cache perangkat. Untuk cache yang ukurannya di atas 1 MB, gunakan getExternalCacheDir(); jika tidak, gunakan getCacheDir(). Setiap metode memberi Anda objek File yang berisi data yang di-cache aplikasi.

Cuplikan kode berikut menunjukkan cara meng-cache file yang baru saja didownload oleh aplikasi:

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);

Catatan: Jika Anda menggunakan getExternalCacheDir() untuk menempatkan cache aplikasi Anda di dalam penyimpanan bersama, pengguna mungkin mengeluarkan media yang berisi penyimpanan ini selagi aplikasi Anda berjalan. Anda harus menyertakan logika untuk menangani dengan baik cache yang tidak ditemukan yang disebabkan oleh perilaku pengguna ini.

Perhatian: Tidak ada pengamanan yang diberlakukan pada file ini. Oleh karena itu, aplikasi apa pun yang menargetkan Android 10 (API level 29) atau yang lebih rendah dan memiliki izin WRITE_EXTERNAL_STORAGE dapat mengakses konten cache ini.

Info terkait: Menyimpan file cache

Gunakan SharedPreferences dalam mode pribadi

Saat menggunakan getSharedPreferences() untuk membuat atau mengakses objek SharedPreferences pada aplikasi Anda, gunakan MODE_PRIVATE. Dengan begitu, hanya aplikasi Anda yang dapat mengakses informasi dalam file preferensi bersama ini.

Jika Anda ingin berbagi data dengan aplikasi lain, jangan gunakan objek SharedPreferences. Sebagai gantinya, ikuti langkah-langkah yang diperlukan untuk membagikan data ke banyak aplikasi dengan aman.

Info terkait: Menggunakan Preferensi Bersama

Menjaga agar layanan dan dependensi tetap terbaru

Sebagian besar aplikasi menggunakan library eksternal dan informasi sistem perangkat untuk menyelesaikan tugas-tugas khusus. Dengan menjaga dependensi aplikasi Anda tetap terbaru, Anda meningkatkan keamanan titik-titik komunikasi ini.

Periksa penyedia keamanan layanan Google Play

Catatan: Bagian ini hanya berlaku pada aplikasi yang menargetkan perangkat yang telah menginstal layanan Google Play.

Jika aplikasi Anda menggunakan layanan Google Play, pastikan layanan tersebut diupdate di perangkat yang menginstal aplikasi Anda. Pemeriksaan ini harus dilakukan secara asinkron, terlepas dari UI thread. Jika perangkat tidak menggunakan layanan versi terbaru, aplikasi Anda akan memicu error otorisasi.

Untuk menentukan apakah layanan Google Play di perangkat yang menginstal aplikasi Anda sudah merupakan versi terbaru atau bukan, ikuti langkah-langkah dalam panduan untuk Memperbarui Penyedia Keamanan untuk Melindungi dari Eksploitasi SSL.

Info terkait:

Update semua dependensi aplikasi

Sebelum men-deploy aplikasi Anda, pastikan semua library, SDK, dan dependensi lainnya adalah versi terbaru:

  • Untuk dependensi pihak pertama, seperti Android SDK, gunakan alat update yang tersedia di Android Studio, seperti SDK Manager.
  • Untuk dependensi pihak ketiga, periksa situs library yang digunakan aplikasi Anda, lalu instal semua update dan patch keamanan yang tersedia.

Info terkait: Menambahkan Dependensi Build

Informasi selengkapnya

Untuk mempelajari cara meningkatkan keamanan aplikasi Anda lebih lanjut, pelajari referensi berikut:

Resource lainnya

Untuk informasi selengkapnya tentang meningkatkan keamanan aplikasi Anda, pelajari referensi berikut.

Codelab

Blog