рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ProGuard


рдпрджрд┐ рдЖрдкрдиреЗ рдХрднреА рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ рдерд╛, рдпрд╛ рдХрд┐рд╕реА рддрд░рд╣ рдЕрдкрдиреЗ рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рддреЛ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░реЛрдЧреБрд░реНрдб рдХреНрдпрд╛ рд╣реИред рд╢рд╛рдпрдж рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░ рдЪреБрдХреЗ рд╣реИрдВ рдпрд╛ рдкреНрд░рд▓реЗрдЦрди рдкрд░ рдХрд╛рдмреВ рдкрд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИрдВ, рд╡рд┐рд╢рд╛рд▓ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдФрд░ рдкрддрд╛ рд▓рдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдирд┐рдпрдореЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдпрд╛ рдХреБрдЫ рдЙрдкрдпреЛрдЧреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ ProGuard рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕рд╕реЗ рдЬреБрдбрд╝реЗ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдореИрдВ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ ProGuard рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ - рдмрд┐рд▓реНрд▓реА рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

ProGuard рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрдИ рдЧрд▓рдд рд╣реИрдВ, рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рдпрд╣ рдПрдХ рдЕрдкреНрд░рд┐рдп рд╡реНрдпрдХреНрддрд┐ рд╣реИ, рдЬреЛ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдирд╣реАрдВ рд╣реИ:

  • рдпрд╣ рдХреЛрдб рдирд╣реАрдВ рдорд┐рд▓рд╛рддрд╛ рд╣реИ
  • рдпрд╣ рдХреЛрдб рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

ProGuard рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рд╡рд╕реНрддреБрдУрдВ, рд╡рд░реНрдЧреЛрдВ, рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдо рдмрджрд▓рдирд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд░рд┐рд╡рд░реНрд╕ рдЗрдВрдЬреАрдирд┐рдпрд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП, рдХреЛрдб рдХрд╛ рдЕрдиреБрдХреВрд▓рди рднреА рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЕрдВрддрддрдГ, рд╢рд╛рд╕реНрддреНрд░реАрдп рдЕрд░реНрде рдореЗрдВ, рдЗрд╕реЗ рдПрдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рддреЛ рд╣рдо рдХрд┐рд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ?


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, ProGuard рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ рдЬреЛ рдЬрд╛рд╡рд╛ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╣рд╛рдВ, рдФрд░ рдпрд╣ рдЬрд╛рд╡рд╛ рдореЗрдВ рднреА рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рдЬреЛ рд▓реЛрдЧ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВ, рд╡реЗ рдбреЗрдХреНрд╕рдЧрд╛рд░реНрдб рднреА рд╡рд┐рдХрд╕рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдЦреБрд▓реЗ рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ рднреА рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдЖрдк рдПрдХ рд╢реЛрд░ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рд╕рдордп-рд╕рдордп рдкрд░ рд╡рд┐рд▓рдп рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдбреЗрдХреНрд╕рдЧрд╛рд░реНрдб рдХреЛ рднреБрдЧрддрд╛рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕реА рдкреНрд░реЛрдЧрд╛рд░реНрдб рдХрд╛ рдЕрдзрд┐рдХ рдХрдард┐рди рд╕рдВрд╕реНрдХрд░рдг рд╣реИред

рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ ProGuard рдПрдХ рдЬрд╛рд░ рдлрд╝рд╛рдЗрд▓ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рд╡рд░реНрдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреА рд╣реИ, рдЗрд╕реЗ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддреА рд╣реИ рдФрд░ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рд╕реБрд░рдХреНрд╖рд╛ рдмрдврд╝рд╛рддреА рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, ProGuard 26 рдЕрдкрд░рдХреЗрд╕ рдФрд░ рдЕрдВрдЧреНрд░реЗрдЬреА рдЕрдХреНрд╖рд░реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдкреНрд░реЙрдЧрд╛рд░реНрдб рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдШрд╕реАрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЗрдирд╡рд┐рдЬрд┐рдмрд▓ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕реНрдкрд░реНрд╢ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ - рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╛ рдлрд┐рд░ рдХреБрдЫ рдирд╛рд░рдХреАрдп рд▓рд╛рд▓ рд░реЗрдЦрд╛рдПрдБ рд╢реБрд░реВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ, рдЬрд┐рд╕реЗ рдХреЛрдИ рднреА рдареАрдХ рдХрд░рдирд╛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЬрд╛рдирдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИред рдФрд░ рдХреБрдЫ рджреИрд╡рдЬреНрдЮреЛрдВ рдиреЗ рдЗрди рдирд┐рдпрдореЛрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд┐рдпрд╛, рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд▓рдЧрднрдЧ рд╕рд╛рдд рдмрд╛рд░ рдореБрдбрд╝рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рдПрдХ рдкрдХреНрд╖реА рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВ рдФрд░ рджреЛ рдШрдВрдЯреЗ рд╕реИрдВрддрд╛рд▓реАрд╕ рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рджрдХреНрд╖рд┐рдг-рдкрд╢реНрдЪрд┐рдо рдореЗрдВ рдЙрдбрд╝рд╛рди рднрд░реЗрдВред

рдЦреИрд░, рдЪреВрдВрдХрд┐ рдХреЛрдИ рднреА рд╡рд╣рд╛рдВ рдирд╣реАрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдХрд┐рд╕реА рдХреЛ рднреА рд╡рд╣рд╛рдВ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдЗрдПред

рдпрджрд┐ рдЖрдк рдкреНрд░реЛрдЧрд╛рд░реНрдб рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рддреБрд░рдВрдд рдЗрд╕рдХреЗ рдореБрдЦреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЕрдм рддрдХ, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИред рддреЛ рдЪрд▓рд┐рдП рдореБрдЦреНрдп рд╡рд░реНрдЧ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓рддреЗ рд╣реИрдВред

public class ProGuard { //тАж private final MultiValueMap<String, String> injectedClassNameMap = new MultiValueMap<String, String>(); //... /** * The main method for ProGuard. */ public static void main(String[] args) { if (args.length == 0) { System.out.println(VERSION); System.out.println("Usage: java proguard.ProGuard [options ...]"); System.exit(1); } // Create the default options. Configuration configuration = new Configuration(); try { // Parse the options specified in the command line arguments. ConfigurationParser parser = new ConfigurationParser(args, System.getProperties()); //... 

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдпрд╣рд╛рдБ рд╕реНрдкрд╖реНрдЯ рдореБрдЦреНрдп рд╡рд┐рдзрд┐ рдореЗрдВ рдЪрд▓рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдирд┐рдпрдо рдХреИрд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдЦреБрдж рдХреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдкреЗрдХреНрд╖рд┐рдд рдСрдмреНрдЬреЗрдХреНрдЯ рдЗрдВрдЬреЗрдХреНрдЯреЗрдбрдХреНрд▓рд╛рд╕рдирд╛рдореЗрдкрд╛рдЗрдк рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдлрд╛рдЗрд▓ рдмрд┐рд▓реНрдб / рдЖрдЙрдЯрдкреБрдЯ / рдкреНрд░реЙрдкрдЧрд╛рд░реНрдб / рд░рд┐рд▓реАрдЬ / рдореИрдкрд┐рдВрдЧ.рдЯреЗрдХреНрд╕реНрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рд╣рдо рдЕрдЪрд╛рдирдХ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдХреЛрдб рдЦреЛрд▓рдирд╛ рдФрд░ рдЙрд╕реЗ рдкрдардиреАрдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ mapping.txt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдо рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдкреАрдХреЗ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ Google Play рдХрдВрд╕реЛрд▓ рдореЗрдВ mapping.txt рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдЕрдм рдЖрдк рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдкрд╛рд░реНрд╕рд░ рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдбреЗрд╡рд▓рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред

 public class ConfigurationParser { //... /** * Parses and returns the configuration. * @param configuration the configuration that is updated as a side-effect. * @throws ParseException if the any of the configuration settings contains * a syntax error. * @throws IOException if an IO error occurs while reading a configuration. */ public void parse(Configuration configuration) throws ParseException, IOException { while (nextWord != null) { lastComments = reader.lastComments(); // First include directives. if (ConfigurationConstants.AT_DIRECTIVE .startsWith(nextWord) || ConfigurationConstants.INCLUDE_DIRECTIVE .startsWith(nextWord)) configuration.lastModified = parseIncludeArgument(configuration.lastModified); else if (ConfigurationConstants.BASE_DIRECTORY_DIRECTIVE .startsWith(nextWord)) parseBaseDirectoryArgument(); // Then configuration options with or without arguments. else if (ConfigurationConstants.INJARS_OPTION .startsWith(nextWord)) configuration.programJars = parseClassPathArgument(configuration.programJars, false); else if (ConfigurationConstants.OUTJARS_OPTION .startsWith(nextWord)) configuration.programJars = parseClassPathArgument(configuration.programJars, true); //тАж else if (ConfigurationConstants.KEEP_CLASSES_WITH_MEMBER_NAMES_OPTION .startsWith(nextWord)) configuration.keep = parseKeepClassSpecificationArguments(configuration.keep, false, true, true, null); else if (ConfigurationConstants.PRINT_SEEDS_OPTION .startsWith(nextWord)) configuration.printSeeds = parseOptionalFile(); // After '-keep'. else if (ConfigurationConstants.KEEP_DIRECTORIES_OPTION .startsWith(nextWord)) configuration.keepDirectories = parseCommaSeparatedList("directory name", true, true, false, true, false, true, true, false, false, configuration.keepDirectories); //... 

рдЙрд╣, рдореИрдВрдиреЗ рдЗрд╕реЗ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдирд╣реАрдВ рдХрд╣рд╛, рдпрд╣ рдЕрд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рдЖрдк рд╕рдВрдкреВрд░реНрдг obfuscate рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХреИрд╕реЗ?


рдпрджрд┐ рдЖрдк рдКрдкрд░ рдХреА рд╕реНрдХреНрд░реАрди рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЗ рдирд╛рдо рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ (SimpleNameFactory, ClassRenamer ...)ред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдХрд╣рд╛, 26 рд▓реИрдЯрд┐рди рдЕрдХреНрд╖рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 public class SimpleNameFactory implements NameFactory { private static final int CHARACTER_COUNT = 26; private static final List cachedMixedCaseNames = new ArrayList(); private static final List cachedLowerCaseNames = new ArrayList(); private final boolean generateMixedCaseNames; private int index = 0; //тАж 

SimpleNameFactory рд╡рд░реНрдЧ рдореЗрдВ, PrintNameSamples () рдХреА рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЕрдкреЗрдХреНрд╖рд┐рдд рдорд╛рди рджреЗрдЧрд╛

  public static void main(String[] args) { System.out.println("Some mixed-case names:"); printNameSamples(new SimpleNameFactory(true), 60); System.out.println("Some lower-case names:"); printNameSamples(new SimpleNameFactory(false), 60); System.out.println("Some more mixed-case names:"); printNameSamples(new SimpleNameFactory(true), 80); System.out.println("Some more lower-case names:"); printNameSamples(new SimpleNameFactory(false), 80); } private static void printNameSamples(SimpleNameFactory factory, int count) { for (int counter = 0; counter < count; counter++) { System.out.println(" ["+factory.nextName()+"]"); } } 

 Some mixed-case names: [a] [b] [c] [d] [e] [f] [g] [h] [i] [j] [k] ... 

Obfuscator рд╡рд░реНрдЧ "obfuscation" рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдПрдХ рдПрдХрд▓ рдирд┐рд╖реНрдкрд╛рджрди рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд╣рд╛рдБ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдХрдХреНрд╖рд╛рдУрдВ рдХреЗ рдкреВрд░реЗ рдПрдХрддреНрд░рд┐рдд рдкреВрд▓ рдФрд░ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

 public class Obfuscator { private final Configuration configuration; //... public void execute(ClassPool programClassPool, ClassPool libraryClassPool) throws IOException { // Check if we have at least some keep commands. if (configuration.keep == null && configuration.applyMapping == null && configuration.printMapping == null) { throw new IOException("You have to specify '-keep' options for the obfuscation step."); } //... 

ProGuard рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рд╣реИ рдЬреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рд╡рд░реНрдЧ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЧреИрд░-рдкрд░рд┐рдЪрд╛рд▓рди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХрд╛рд░реНрдп рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдХреЛрдб рдХреА рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╣рдореЗрд╢рд╛ рдЗрд╕рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдиреБрдХреВрд▓рди рдкреНрд░реЛрдЧреБрд░реНрдб рд╡рд░реНрдЧ рд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

  /** * Performs the optimization step. */ private boolean optimize(int currentPass, int maxPasses) throws IOException { if (configuration.verbose) { System.out.println("Optimizing (pass " + currentPass + "/" + maxPasses + ")..."); } // Perform the actual optimization. return new Optimizer(configuration).execute(programClassPool, libraryClassPool, injectedClassNameMap); } 

рдкреНрд░рд╣рд░реА рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

  1. рдкреНрд░реАрд╕реЗрдЯ рдирд┐рдпрдо рдкрдврд╝реЗрдВ
  2. рдЕрдиреБрдХреВрд▓рди
  3. рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рд╕рдВрдкрддреНрддрд┐рдпрд╛рдБ рд╣рдЯрд╛ рджреА рдЧрдИрдВ
  4. рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВ
  5. рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд░рд┐рдХреЙрд░реНрдб

рдЖрдк рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЧрд╛рд░реНрдб рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 java -jar proguard.jar @android.pro 

рдЬрд╣рд╛рдВ Proguard.jar ProGuard рджреНрд╡рд╛рд░рд╛ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИ, рдФрд░ android.pro рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рд╣реИрдВред

рдХреНрдпреЛрдВ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ ProGuard рд▓рд┐рдЦрдирд╛ рдмрд╣реБрдд рджрд░реНрджрдирд╛рдХ рд╣реИ


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрдм рдореИрдВ рдкреНрд░реЛрдЧрд╛рд░реНрдб рдХреЛрдб рдкрд░ рдЪрдврд╝ рд░рд╣рд╛ рдерд╛, рддреЛ рдореБрдЭреЗ рд▓реЗрдЦрдХ рдХреЗ рдХреЙрд▓рдо рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдирд╛рдо рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ - рдПрд░рд┐рдХ рд▓реЙрдлреНрдпреВрдиред рдЬрд▓реНрджреА рд╕реЗ рдЧреБрдЧрд▓реА рдХрд░рдиреЗ рд╕реЗ, рдореБрдЭреЗ рдЙрд╕рдХреА рдирд┐рдЬреА рд╕рд╛рдЗрдЯ рдорд┐рд▓ рдЧрдИ , рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИ, рддреЛ рдЖрдк рдЙрд╕рдХреЗ рд╕рд╛рде рдЦреБрдж рдХреЛ рдкрд░рд┐рдЪрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

Google рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ ProGuard рдбрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдПрдХрдорд╛рддреНрд░ рд╣реИред рдЕрдиреНрдп рд╕рднреА рд╕рдорд╛рдзрд╛рди рдпрд╛ рддреЛ рднреБрдЧрддрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ рдЧрд┐рдЯреНрдмреБрдм рдкрд░ рдФрд░ рдзреВрд▓ рд╕реЗ рдврдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рджреВрдВрдЧрд╛ рдХрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдХрд┐рд╕реА рднреА рдХреНрд╖рдг рдореЗрдВ рдЦрд░рд╛рдмреА, рдЦрд░рд╛рдмреА, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдФрд░ рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рдореБрдЦреНрдп рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЯрдХрд░рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЪреВрдВрдХрд┐ рдХреЛрдб рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕ рддрд░рд╣ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдпрдерд╛рд╕рдВрднрд╡ рдХрд╕рдХрд░ рдХрд╡рд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЬреЛ рдРрд╕рд╛ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ? :) рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╣рд░ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВред

рдХреНрдпреЛрдВ ProGuard рдХрд╛ рдЙрдкрдпреЛрдЧ рдмреЗрдХрд╛рд░ рд╣реИ


ProGuard рдЙрди рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЬреНрдЮрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдирд┐рдпрдореЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдмрд╕ рдЗрд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд▓рд╛рд╡рд░ рдХреЗ рд▓рд┐рдП рдХреЛрдб рддрдХ рдкрд╣реБрдВрдЪрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЗрдирд╡рд░реНрдЯрд░ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП рд╣реИрдВ рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЛрдореЗрди рдореЗрдВ рд╣реИрдВред рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рд╖рдп рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдирд┐рдпрдореЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЕрдзрд┐рдХ рдХрдард┐рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╣реБрдд рдХрдоред рд░рд╛рд╕реНрддрд╛ рдХреНрдпрд╛ рд╣реИ?

рдЬрд┐рди рдХрдВрдкрдирд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдХреЛрдб рдЫрд┐рдкрд╛рдирд╛ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ, ProGuard рдХреЗ рд╕рд╛рде рд░рд╣рдирд╛ рдФрд░ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛, рдЬрд┐рд╕рд╕реЗ рдПрдХ рдЕрдиреВрдард╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред

рдХреНрдпреЛрдВ, рдХреНрдпреЛрдВ, рдЖрдкрдХреЛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ?


рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдкреНрд░рд╛рдЧрд╛рд░реНрдб рдПрдХ рдмрд╣реБрдд рдмрдбрд╝реА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдирд╣реАрдВ рд╣реИ рдФрд░ рд╡рд╣рд╛рдВ рдХреБрдЫ рднреА рдЕрд▓реМрдХрд┐рдХ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдХрдк рдЪрд╛рдп рдХреЗ рд╕рд╛рде рд╢рд╛рдо рдмрд┐рддрд╛рдиреЗ рдФрд░ рдПрдХ рдмрд┐рд▓реНрд▓реА рдХреЛ рдкрдердкрд╛рдХрд░, рд╕реНрд░реЛрдд рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рдЬрд┐рди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рд╡реЗ рдЖрдкрдХреЗ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпрд╛ рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рди рдХреЗрд╡рд▓ ProGuard рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рддреГрддреАрдп-рдкрдХреНрд╖ рдХреЛрдб рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЖрдкрдХрд╛ рдХреЛрдб рдЖрдкрдХреА рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░реА рдХрд╛ рдХреНрд╖реЗрддреНрд░ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рд╕рд╛рдл рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛, рд╡рд┐рдХрд╛рд╕ рдХрд░рдиреЗ рдХреА рдмрд╛рдд рдХреНрдпрд╛ рд╣реИ?

рдпрд╣ рд▓реЗрдЦ рд▓рдЧрднрдЧ рдЫрд╣ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдкреНрд░рд╛рдЧрд╛рд░реНрдб рд▓рдЧрд╛рддрд╛рд░ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЕрдВрд╢ рдЕрдм рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред

PS рдореИрдВ рд╕рднреА рд╕рдВрдЧреНрд░рд╣ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдирд▓ @paradisecurity рдореЗрдВ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рдФрд░ рд▓рд┐рдВрдХ рдореЗрд░реА рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╛ рдирд╛рдо рд╕реЗ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдХреА рдЦреЛрдЬ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi436564/


All Articles