I den här artikeln beskriver vi hur du anpassar Plays manipuleringsskydd för dina appar och spel. Om du vill använda anpassningsfunktionerna som beskrivs på den här sidan måste du ha aktiverat automatiskt skydd med manipuleringsskydd i Play Console.
Om anpassat manipuleringsskydd
Med anpassat manipuleringsskydd kan du identifiera specifika Java- och Kotlin-metoder i appen som kräver starkare säkerhet. När du laddar upp versionen till Play prioriterar Google Play utökat skydd för dessa specifika metoder.
Genom att identifiera metoder för förbättrat skydd kan du förbättra appens skydd mot manipulering. Du kan även använda metodskydd för att skydda mot exfiltrering av klienthemligheter från binärfilen (till exempel känsliga nycklar eller webbadresser som måste inkluderas i klienten).
Konfigurera anpassat manipuleringsskydd
Följ de här stegen för att implementera anpassat manipuleringsskydd i appens kodbas.
Steg 1: Lägg till gränssnittet för automatiskt skydd i din kodbas
Börja med att lägga till skyddsgränssnittet i appen eller spelet.
Kotlin:
package com.google.android.play.protections.annotations/**
* Beskriver att en metod är en kandidat för utökat skydd.
*
* <p>Den här kommentar tas bort automatiskt från dex-koden för
* paketet när Google Play skyddar paketet. Använd den endast som
* en kommentar på metodnivå. All annan användning (till exempel åtkomst till klassen
* reflektivt vid körning) stöds inte.
*/
@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;
/**
* Beskriver att en metod är en kandidat för förbättrat skydd.
*
* <p>Den här kommentar tas bort automatiskt från dex-koden för
* paketet när Google Play skyddar paketet. Använd den endast som
* en kommentar på metodnivå. All annan användning (till exempel åtkomst till klassen
* reflektivt vid körning) stöds inte.
*/
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface PlayAutomaticIntegrityProtection {}
# Behåll kommentarklassen och dess medlemmar.
-keep class com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection* { *; }
# Som standard behandlar ProGuard kommentarsattribut som valfria och tar bort
# dem i obfuskeringen. Den här regeln säkerställer att de sparas.
-keepattributes RuntimeVisibleAnnotations, AnnotationDefault
# Behåll alla metoder med kommentar, men tillåt att de döljs.
-keepclassmembers,allowobfuscation class * {
@com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection *;
}
Steg 2: Kommenta metoder för anpassat skydd
import com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection
@PlayAutomaticIntegrityProtection()
fun myMethod() {
// Metodtext …
}
Java
import com.google.android.play.protections.annotations.PlayAutomaticIntegrityProtection;
@PlayAutomaticIntegrityProtection()
public void myMethod() {
// Metodtext …
}Steg 3: (Valfritt) Skydda hemligheter på klientsidan
Skydd med anpassad metod döljer koden direkt i den kommenterade metodtexten. Du kan använda detta för att skydda känsliga API-nycklar.
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");
}
Steg 4: (Valfritt) Hantera resursanvändning för skyddsprestanda
Som standard lägger anrop av en skyddad metod till en användningstid på flera millisekunder. Därför får den inte anropas i prestandakänsliga scenarier eller i huvudtråden.
Om du behöver skydda en metod där snabb körning är nödvändig finns ett enklare skyddsläge tillgängligt. Du kan använda ett kommentarsattribut för att välja snabbare åtkomst (läses in vid start), men motsvarande skydd är inte lika starkt.
Kotlin:
@PlayAutomaticIntegrityProtection(loadAtStartup = true)
fun callApi() {
api.connect("YOUR_API_KEY")
}
Java:
@PlayAutomaticIntegrityProtection(loadAtStartup = true)
public static void callApi() {
api.connect("YOUR_API_KEY");
}
Om du vill använda detta lägger du till attributet interface i brödtexten i den ursprungliga kommentarsdefinitionen från steg 1:
// Uppdatering av kommentarsdefinition med Kotling
public annotation class PlayAutomaticIntegrityProtection(
/**
* Om värdet är sant läses den kommenterade metoden in vid start. Om värdet är falskt
* läses den in på begäran.
*
* <p>Om du anropar metoden för att läsa in vid behov får du ett sämre
* resultat. Vid inläsning vid start förblir metoden deobfuskerad i minnet
* under appens livslängd.
*/
val loadAtStartup: Boolean = false
) {}
Steg 5: Testa appen
Rekommendationer för att välja metoder
Ett genomtänkt urval av metoder ger ett starkare övergripande skydd. Om varje ny version har en ny skyddad metod blir den versionen av appen eller spelet mer motståndskraftig mot attacker.
Som en allmän regel för att undvika att påverka appens prestanda bör du välja kalla metoder i stället för varma metoder. Välj metoder som
- är viktiga för appen (appen slutar fungera om de tas bort).
- inte körs i huvudtråden/gränssnittstråden
- köras mer än en gång under appens livstid, men inte i en aktiv slinga
- är komplexa (metoder som innehåller komplex kod eller data).
- inte körs vid start, om möjligt
- är nya eller har genomgått omfattande omstruktureringar i versionen
- inte är abstrakta metoder, gränssnittsmetoder eller konstruktörer
- inte använder reflektion och inte läses in ett inbyggt bibliotek direkt.
Ta bort anpassat skydd
Om du inte längre vill skydda en viss metod kan du helt enkelt ta bort kommentaren @PlayAutomaticIntegrityProtection().