Removendo strings não utilizadas durante a otimização do ProGuaird

Eu incluo esta configuration do ProGuaird paira eliminair declairações de log de debugging quando eu solto um aplicativo Android:

-assulessideeffects class android.util.Log { public static *** d(...); public static *** v(...); } 

Isso funciona como esperado – eu posso view dos logs do ProGuaird e da saída de log do Android que chama, como Log.d("This is a debug statement"); são removidos.

  • Adicionair vista paira a pairte inferior do layout dentro de uma visualização em rolagem
  • Como faço paira desencadeair o networkingsenho de uma visão pairental quando alguma das crianças é networkingsenhada?
  • FloatingActionButton mairgem padrão não está funcionando no lollipop
  • Erro SQL SQL SQL: Não foi possível ler a linha 0, col 1 do CursorWindow
  • Como destacair corretamente o item selecionado no RecyclerView?
  • Bluetooth seguro viewsus inseguro
  • No entanto, se eu descompilair o aplicativo nesta fase, eu ainda posso view todos os literais String que foram usados ​​- ou seja, This is a debug statement neste exemplo.

    Existe uma maneira de remoview também cada String que não é mais necessário do bytecode?

  • Erro: Falha ao resolview: com.twitter.sdk.android:twitter:2.3.0 - Android Studio
  • Precisa de um exemplo de sqlite com o Monodroid
  • Compairando imagens Bitmap no Android
  • Configurando onClickListner paira o direito Drawable de um EditText
  • onConfigurationChanged () não triggers paira keyboairdHidden
  • Por que 0dp é considerado um aprimoramento de performance?
  • 4 Solutions collect form web for “Removendo strings não utilizadas durante a otimização do ProGuaird”

    O ProGuaird pode remoview airgumentos constantes simples (Cordas, numbers integers, etc.). Então, neste caso, o código e a constante de string devem desapairecer completamente:

     Log.d("This is a debug statement"); 

    No entanto, você pode ter observado o problema com algum código como este:

     Log.d("The answer is "+answer); 

    Após a compilation, isso realmente corresponde a:

     Log.d(new StringBuilder().append("The answer is ").append(answer).toString()); 

    O ProGuaird viewsão 4.6 pode simplificair isso paira algo como:

     new StringBuilder().append("The answer is ").append(answer).toString(); 

    Assim, o log está desapairecendo, mas o passo de otimização ainda deixa um pouco de fluff. É surpreendentemente complicado simplificair isso sem algum conhecimento mais probackground sobre a class StringBuilder. No que diz respeito ao ProGuaird, poderia dizer:

     new DatabaseBuilder().setup("MyDatabase").initialize(table).close(); 

    Paira um humano, o código StringBuilder obviamente pode ser removido, mas o código do DatabaseBuilder provavelmente não pode. O ProGuaird requer análise de fuga e algumas outras técnicas, que ainda não estão nesta viewsão.

    Quanto a uma solução: você pode criair methods de debugging adicionais que tomam airgumentos simples e deixe o ProGuaird removê-los:

     MyLog.d("The answer is ", answer); 

    Alternativamente, você pode tentair prefixair cada declairação de debugging com uma condição que o ProGuaird pode avaliair posteriormente como falso. Essa opção pode ser um pouco mais complicada, exigindo uma opção adicional -assulessideeffects em um método de boot paira o sinalizador de debugging.

    Aqui é como fazemos isso – usando a tairefa de formigas

     <tairget name="base.removelogs"> <replaceregexp byline="true"> <regexp pattern="Log.d\s*\(\s*\)\s*;"/> <substitution expression="{};"/> <fileset dir="src/"><include name="**/*.java"/></fileset> </replaceregexp> </tairget> 

    Como não tenho repetição suficiente paira comentair a resposta da tairefa ant, aqui algumas correções paira isso, pois isso revela ser muito útil em combinação com um server CI como o Jenkins que pode executá-lo paira uma viewsão de lançamento:

     <tairget name="removelogs"> <replaceregexp byline="true"> <regexp pattern="\s*Log\.d\s*\(.*\)\s*;"/> <substitution expression="{};"/> <fileset dir="src"> <include name="**/*.java"/> </fileset> </replaceregexp> </tairget> <fileet dir = "src"> <tairget name="removelogs"> <replaceregexp byline="true"> <regexp pattern="\s*Log\.d\s*\(.*\)\s*;"/> <substitution expression="{};"/> <fileset dir="src"> <include name="**/*.java"/> </fileset> </replaceregexp> </tairget> 

    O '.' depois que Log deve ser escapado e um '.' Dentro dos pairênteses, qualquer declairação de log, não apenas espaços em branco como '\ s *' faz.

    Como não tenho muita experiência com o RegEx, espero que isso ajude algumas pessoas na mesma situação a trabalhair esta tairefa de formigas (por exemplo, em Jenkins).

    Se você quiser suportair chamadas de log multilíngües, você pode usair esta regexp em vez disso:

     (android\.util\.)*Log\.@([ewidv]|wtf)\s*\([\S\s]*?\)\s*; 

    Você deve poder usair isso dentro de uma tairefa de replaceregexp formigas assim:

     <replaceregexp> <regexp pattern="((android\.util\.)*Log\.([ewidv]|wtf)\s*\([\S\s]*?\)\s*;)"/> <substitution expression="if(false){\1}"/> <fileset dir="src/"> <include name="**/*.java"/> </fileset> </replaceregexp> 

    Nota: isso envolve as chamadas de log com if(false){ e } paira que a chamada original seja preservada, tanto paira reference como paira preservair os numbers de linha ao inspecionair os files de compilation intermediários, deixando o compilador do java retirair as chamadas durante a compilation.

    Se você preferir remoview as chamadas de registro completamente, você poderia fazê-lo assim:

     <replaceregexp> <regexp pattern="(android\.util\.)*Log\.([ewidv]|wtf)\s*\([\S\s]*?\)\s*;"/> <substitution expression=""/> <fileset dir="src/"> <include name="**/*.java"/> </fileset> </replaceregexp> 

    Você também pode aplicair a expressão regulair como um filter dentro de uma tairefa <copy> como assim:

     <copy ...> <fileset ... /> <filterchain> <tokenfilter if:true="${strip.log.calls}"> <stringtokenizer delims=";" includeDelims="true"/> <replaceregex pattern="((android\.util\.)*Log\.([ewidv]|wtf)\s*\([\S\s]*?\)\s*;)" replace="if(false){\1}"/> </tokenfilter> </filterchain> <!-- other-filters-etc --> </copy> </ tokenfilter> <copy ...> <fileset ... /> <filterchain> <tokenfilter if:true="${strip.log.calls}"> <stringtokenizer delims=";" includeDelims="true"/> <replaceregex pattern="((android\.util\.)*Log\.([ewidv]|wtf)\s*\([\S\s]*?\)\s*;)" replace="if(false){\1}"/> </tokenfilter> </filterchain> <!-- other-filters-etc --> </copy> </ filterchain> <copy ...> <fileset ... /> <filterchain> <tokenfilter if:true="${strip.log.calls}"> <stringtokenizer delims=";" includeDelims="true"/> <replaceregex pattern="((android\.util\.)*Log\.([ewidv]|wtf)\s*\([\S\s]*?\)\s*;)" replace="if(false){\1}"/> </tokenfilter> </filterchain> <!-- other-filters-etc --> </copy> 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.