Artikel ini menjelaskan cara menyesuaikan perlindungan dari modifikasi tidak sah di Google Play untuk aplikasi dan game Anda. Untuk menggunakan fitur penyesuaian yang dijelaskan di halaman ini, Anda harus mengaktifkan perlindungan otomatis dengan perlindungan dari modifikasi tidak sah di Konsol Play.
Tentang perlindungan dari modifikasi tidak sah yang disesuaikan
Perlindungan dari modifikasi tidak sah yang disesuaikan memungkinkan Anda mengidentifikasi metode Java dan Kotlin tertentu dalam aplikasi Anda yang memerlukan keamanan lebih kuat. Saat rilis Anda diupload ke Google Play, Google Play memprioritaskan perlindungan yang ditingkatkan untuk metode tertentu ini.
Dengan mengidentifikasi metode yang memerlukan perlindungan yang ditingkatkan, Anda dapat memperkuat pertahanan aplikasi terhadap modifikasi tidak sah. Anda juga dapat menggunakan perlindungan metode untuk mencegah pemindahan rahasia klien yang tidak sah dari biner Anda (misalnya, kunci atau URL sensitif yang harus disertakan dalam klien).
Menyiapkan perlindungan dari modifikasi tidak sah yang disesuaikan
Ikuti langkah-langkah berikut untuk menerapkan perlindungan dari modifikasi tidak sah yang disesuaikan di codebase aplikasi Anda.
Langkah 1: Tambahkan antarmuka perlindungan otomatis ke codebase Anda
Pertama, tambahkan antarmuka perlindungan ke aplikasi atau game Anda.
Kotlin:
package com.google.android.play.protections.annotations/**
* Menjelaskan bahwa suatu metode merupakan kandidat untuk perlindungan yang ditingkatkan.
*
* <p>Anotasi ini akan otomatis dihapus dari kode dex
* bundle Anda pada saat Google Play melindungi bundle Anda. Hanya gunakan sebagai
* anotasi tingkat metode. Penggunaan lainnya (misalnya, mengakses class
* secara reflektif saat runtime) tidak didukung.
*/
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.FUNCTION)
public annotation class PlayAutomaticIntegrityProtection() {}
Java:
package com.google.android.play.protections.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Menjelaskan bahwa suatu metode merupakan kandidat untuk perlindungan yang ditingkatkan.
*
* <p>Anotasi ini akan otomatis dihapus dari kode dex
* bundle Anda pada saat Google Play melindungi bundle Anda. Hanya gunakan sebagai
* anotasi tingkat metode. Penggunaan lainnya (misalnya, mengakses class
* secara reflektif saat runtime) tidak didukung.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PlayAutomaticIntegrityProtection {}
# Pertahankan class anotasi dan elemennya.
-keep class com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection* { *; }
# Secara default, ProGuard memperlakukan atribut anotasi sebagai opsional, dan menghapusnya
# dalam langkah obfuscation. Aturan ini akan memastikan bahwa atribut anotasi tersebut tetap ada.
-keepattributes RuntimeVisibleAnnotations, AnnotationDefault
# Pertahankan metode apa pun dengan anotasi, tetapi izinkan metode tersebut di-obfuscate.
-keepclassmembers,allowobfuscation class * {
@com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection *;
}
Langkah 2: Anotasi metode untuk perlindungan kustom
import com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection
@PlayAutomaticIntegrityProtection()
fun myMethod() {
// Method body...
}
Java
import com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection;
@PlayAutomaticIntegrityProtection()
public void myMethod() {
// Isi metode...
}Langkah 3: (Opsional) Lindungi rahasia sisi klien
Perlindungan metode kustom meng-obfuscate (menyembunyikan) kode langsung di dalam isi metode yang dianotasi. Anda dapat menggunakan pendekatan ini untuk melindungi kunci API sensitif.
Kotlin:
import com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection
@PlayAutomaticIntegrityProtection()
fun callApi() {
api.connect("YOUR_API_KEY")
}
Java:
import com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection;
@PlayAutomaticIntegrityProtection()
public static void callApi() {
api.connect("YOUR_API_KEY");
}
Langkah 4: (Opsional) Kelola overhead performa perlindungan
Secara default, memanggil metode yang dilindungi akan menambahkan overhead beberapa milidetik. Oleh karena itu, metode ini tidak boleh dipanggil dalam skenario yang sensitif terhadap performa atau di thread utama.
Jika Anda perlu melindungi metode yang memerlukan eksekusi cepat, tersedia mode perlindungan dengan overhead yang lebih rendah. Anda dapat menggunakan atribut anotasi untuk memilih akses yang lebih cepat (dimuat saat sistem dimulai), meskipun tingkat perlindungannya tidak sekuat mode standar.
Kotlin:
@PlayAutomaticIntegrityProtection(loadAtStartup = true)
fun callApi() {
api.connect("YOUR_API_KEY")
}
Java:
@PlayAutomaticIntegrityProtection(loadAtStartup = true)
public static void callApi() {
api.connect("YOUR_API_KEY");
}
Untuk menggunakannya, tambahkan atribut antarmuka ke isi definisi anotasi asli Anda dari Langkah 1:
// Pembaruan Definisi Anotasi Kotlin
public annotation class PlayAutomaticIntegrityProtection(
/**
* Jika nilainya benar, metode yang dianotasi akan dimuat saat sistem dimulai. Jika nilainya salah, metode tersebut
* akan dimuat secara on demand.
*
* <p>Untuk pemuatan on demand, memanggil metode ini akan menyebabkan penurunan
* performa. Untuk pemuatan saat sistem dimulai, metode akan tetap di-deobfuscate di memori
* selama masa aktif aplikasi.
*/
val loadAtStartup: Boolean = false
) {}
Langkah 5: Uji aplikasi Anda
Praktik terbaik untuk memilih metode
Pemilihan metode yang cermat akan menghasilkan perlindungan keseluruhan yang lebih kuat. Jika setiap rilis baru memiliki metode yang baru dilindungi, versi aplikasi atau game tersebut akan lebih memiliki ketahanan terhadap serangan.
Sebagai aturan umum untuk menghindari dampak pada performa aplikasi Anda, pilih metode cold daripada metode hot. Untuk perlindungan maksimum, pilih metode yang:
- Sangat penting untuk aplikasi (aplikasi akan gagal jika metode tersebut dihapus).
- Tidak dijalankan di thread utama/UI thread.
- Dijalankan lebih dari sekali selama masa aktif aplikasi, tetapi tidak dijalankan dalam loop hot.
- Bersifat signifikan (metode yang berisi kode atau data yang bersifat signifikan).
- Tidak dijalankan selama sistem dimulai, jika memungkinkan.
- Baru diperkenalkan atau direfaktorisasi secara signifikan dalam rilis.
- Bukan metode abstrak, metode antarmuka, atau konstruktor.
- Tidak menggunakan refleksi dan tidak memuat library native secara langsung.
Menghapus perlindungan yang disesuaikan
Jika tidak ingin lagi melindungi metode tertentu, Anda dapat cukup menghapus anotasi @PlayAutomaticIntegrityProtection().