Siga as práticas recomendadas

Ao trabalhar com regras de manutenção, é importante atingir a quantidade certa de especificidade para garantir que você veja benefícios e mantenha o comportamento do app. Consulte as seções a seguir para saber mais sobre bons padrões e o que evitar nas regras de retenção.

Bons padrões em regras de retenção

As regras de retenção bem definidas são o mais específicas possível:

  • Para a especificação de classe, sempre especifique uma classe, classe base ou classe anotada específica, se possível, conforme mostrado nos exemplos a seguir:

    -keepclassmembers class com.example.MyClass {
      void someSpecificMethod();
    }
    
    -keepclassmembers ** extends com.example.MyBaseClass {
      void someSpecificMethod();
    }
    
    -keepclassmembers @com.example.MyAnnotation class ** {
      void someSpecificMethod();
    }
    
  • Sempre que possível, a especificação do membro precisa ser declarada e referenciar apenas as partes da classe que precisam ser mantidas para o funcionamento do app. Recomendamos não aplicar uma regra a uma classe inteira definindo o escopo de membro opcional como { *; }, a menos que seja estritamente necessário.

    -keepclassmembers com.example.MyClass {
      void someSpecificMethod();
      void @com.example.MyAnnotation *;
    }
    

Se não for possível seguir essas diretrizes, isole temporariamente o código que precisa ser mantido em um pacote dedicado e aplique a regra de preservação a ele. No entanto, essa não é uma solução de longo prazo. Para saber mais, consulte Adotar otimizações de forma incremental. Para usar uma regra de permanência em um pacote, defina uma regra de permanência, conforme mostrado no exemplo a seguir:

-keepclassmembers class com.example.pkg.** { *; }

O que deve ser evitado

A sintaxe da regra de permanência tem muitas opções, mas para benefícios de desempenho sustentáveis e mensuráveis, recomendamos não usar o seguinte:

  • Evite usar o operador de inversão ! em regras de manutenção, porque você pode aplicar uma regra sem querer a quase todas as classes no seu aplicativo.
  • Não use regras de manutenção em todo o pacote, como -keep class com.example.pkg.** { *; }, a longo prazo. Eles podem ser usados temporariamente para contornar problemas ao configurar o R8. Para mais informações, consulte Limitar o escopo da otimização. Em geral, tenha cuidado com os caracteres curinga. Mantenha apenas o código necessário.

Se não for possível seguir essas regras, talvez você esteja usando muita reflexão aberta. Nesse caso, evite a reflexão ou a biblioteca usando reflexão. Consulte o estudo de caso do Gson.