content: /*
   *
   *
   *                                  Apache License
   *                            Version 2.0, January 2004
   *                         http://www.apache.org/licenses/
   *
   *    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
   *
   *    1. Definitions.
   *
   *       "License" shall mean the terms and conditions for use, reproduction,
   *       and distribution as defined by Sections 1 through 9 of this document.
   *
   *       "Licensor" shall mean the copyright owner or entity authorized by
   *       the copyright owner that is granting the License.
   *
   *       "Legal Entity" shall mean the union of the acting entity and all
   *       other entities that control, are controlled by, or are under common
   *       control with that entity. For the purposes of this definition,
   *       "control" means (i) the power, direct or indirect, to cause the
   *       direction or management of such entity, whether by contract or
   *       otherwise, or (ii) ownership of fifty percent (50%) or more of the
   *       outstanding shares, or (iii) beneficial ownership of such entity.
   *
   *       "You" (or "Your") shall mean an individual or Legal Entity
   *       exercising permissions granted by this License.
   *
   *       "Source" form shall mean the preferred form for making modifications,
   *       including but not limited to software source code, documentation
   *       source, and configuration files.
   *
   *       "Object" form shall mean any form resulting from mechanical
   *       transformation or translation of a Source form, including but
   *       not limited to compiled object code, generated documentation,
   *       and conversions to other media types.
   *
   *       "Work" shall mean the work of authorship, whether in Source or
   *       Object form, made available under the License, as indicated by a
   *       copyright notice that is included in or attached to the work
   *       (an example is provided in the Appendix below).
   *
   *       "Derivative Works" shall mean any work, whether in Source or Object
   *       form, that is based on (or derived from) the Work and for which the
   *       editorial revisions, annotations, elaborations, or other modifications
   *       represent, as a whole, an original work of authorship. For the purposes
   *       of this License, Derivative Works shall not include works that remain
   *       separable from, or merely link (or bind by name) to the interfaces of,
   *       the Work and Derivative Works thereof.
   *
   *       "Contribution" shall mean any work of authorship, including
   *       the original version of the Work and any modifications or additions
   *       to that Work or Derivative Works thereof, that is intentionally
   *       submitted to Licensor for inclusion in the Work by the copyright owner
   *       or by an individual or Legal Entity authorized to submit on behalf of
   *       the copyright owner. For the purposes of this definition, "submitted"
   *       means any form of electronic, verbal, or written communication sent
   *       to the Licensor or its representatives, including but not limited to
   *       communication on electronic mailing lists, source code control systems,
   *       and issue tracking systems that are managed by, or on behalf of, the
   *       Licensor for the purpose of discussing and improving the Work, but
   *       excluding communication that is conspicuously marked or otherwise
   *       designated in writing by the copyright owner as "Not a Contribution."
   *
   *       "Contributor" shall mean Licensor and any individual or Legal Entity
   *       on behalf of whom a Contribution has been received by Licensor and
   *       subsequently incorporated within the Work.
   *
   *    2. Grant of Copyright License. Subject to the terms and conditions of
   *       this License, each Contributor hereby grants to You a perpetual,
   *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   *       copyright license to reproduce, prepare Derivative Works of,
   *       publicly display, publicly perform, sublicense, and distribute the
   *       Work and such Derivative Works in Source or Object form.
   *
   *    3. Grant of Patent License. Subject to the terms and conditions of
   *       this License, each Contributor hereby grants to You a perpetual,
   *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   *       (except as stated in this section) patent license to make, have made,
   *       use, offer to sell, sell, import, and otherwise transfer the Work,
   *       where such license applies only to those patent claims licensable
   *       by such Contributor that are necessarily infringed by their
   *       Contribution(s) alone or by combination of their Contribution(s)
   *       with the Work to which such Contribution(s) was submitted. If You
   *       institute patent litigation against any entity (including a
   *       cross-claim or counterclaim in a lawsuit) alleging that the Work
   *       or a Contribution incorporated within the Work constitutes direct
   *       or contributory patent infringement, then any patent licenses
   *       granted to You under this License for that Work shall terminate
   *       as of the date such litigation is filed.
   *
   *    4. Redistribution. You may reproduce and distribute copies of the
   *       Work or Derivative Works thereof in any medium, with or without
   *       modifications, and in Source or Object form, provided that You
   *       meet the following conditions:
   *
   *       (a) You must give any other recipients of the Work or
   *           Derivative Works a copy of this License; and
   *
   *       (b) You must cause any modified files to carry prominent notices
   *           stating that You changed the files; and
   *
   *       (c) You must retain, in the Source form of any Derivative Works
   *           that You distribute, all copyright, patent, trademark, and
   *           attribution notices from the Source form of the Work,
   *           excluding those notices that do not pertain to any part of
   *           the Derivative Works; and
   *
   *       (d) If the Work includes a "NOTICE" text file as part of its
   *           distribution, then any Derivative Works that You distribute must
   *           include a readable copy of the attribution notices contained
   *           within such NOTICE file, excluding those notices that do not
   *           pertain to any part of the Derivative Works, in at least one
   *           of the following places: within a NOTICE text file distributed
   *           as part of the Derivative Works; within the Source form or
   *           documentation, if provided along with the Derivative Works; or,
   *           within a display generated by the Derivative Works, if and
   *           wherever such third-party notices normally appear. The contents
   *           of the NOTICE file are for informational purposes only and
   *           do not modify the License. You may add Your own attribution
   *           notices within Derivative Works that You distribute, alongside
   *           or as an addendum to the NOTICE text from the Work, provided
   *           that such additional attribution notices cannot be construed
   *           as modifying the License.
   *
   *       You may add Your own copyright statement to Your modifications and
   *       may provide additional or different license terms and conditions
   *       for use, reproduction, or distribution of Your modifications, or
   *       for any such Derivative Works as a whole, provided Your use,
   *       reproduction, and distribution of the Work otherwise complies with
   *       the conditions stated in this License.
   *
   *    5. Submission of Contributions. Unless You explicitly state otherwise,
   *       any Contribution intentionally submitted for inclusion in the Work
   *       by You to the Licensor shall be under the terms and conditions of
   *       this License, without any additional terms or conditions.
   *       Notwithstanding the above, nothing herein shall supersede or modify
   *       the terms of any separate license agreement you may have executed
   *       with Licensor regarding such Contributions.
   *
   *    6. Trademarks. This License does not grant permission to use the trade
   *       names, trademarks, service marks, or product names of the Licensor,
   *       except as required for reasonable and customary use in describing the
   *       origin of the Work and reproducing the content of the NOTICE file.
   *
   *    7. Disclaimer of Warranty. Unless required by applicable law or
   *       agreed to in writing, Licensor provides the Work (and each
   *       Contributor provides its Contributions) on an "AS IS" BASIS,
   *       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
   *       implied, including, without limitation, any warranties or conditions
   *       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
   *       PARTICULAR PURPOSE. You are solely responsible for determining the
   *       appropriateness of using or redistributing the Work and assume any
   *       risks associated with Your exercise of permissions under this License.
   *
   *    8. Limitation of Liability. In no event and under no legal theory,
   *       whether in tort (including negligence), contract, or otherwise,
   *       unless required by applicable law (such as deliberate and grossly
   *       negligent acts) or agreed to in writing, shall any Contributor be
   *       liable to You for damages, including any direct, indirect, special,
   *       incidental, or consequential damages of any character arising as a
   *       result of this License or out of the use or inability to use the
   *       Work (including but not limited to damages for loss of goodwill,
   *       work stoppage, computer failure or malfunction, or any and all
   *       other commercial damages or losses), even if such Contributor
   *       has been advised of the possibility of such damages.
   *
   *    9. Accepting Warranty or Additional Liability. While redistributing
   *       the Work or Derivative Works thereof, You may choose to offer,
   *       and charge a fee for, acceptance of support, warranty, indemnity,
   *       or other liability obligations and/or rights consistent with this
   *       License. However, in accepting such obligations, You may act only
   *       on Your own behalf and on Your sole responsibility, not on behalf
   *       of any other Contributor, and only if You agree to indemnify,
   *       defend, and hold each Contributor harmless for any liability
   *       incurred by, or claims asserted against, such Contributor by reason
   *       of your accepting any such warranty or additional liability.
   *
   *    END OF TERMS AND CONDITIONS
   *
   *    APPENDIX: How to apply the Apache License to your work.
   *
   *       To apply the Apache License to your work, attach the following
   *       boilerplate notice, with the fields enclosed by brackets "[]"
   *       replaced with your own identifying information. (Don't include
   *       the brackets!)  The text should be enclosed in the appropriate
   *       comment syntax for the file format. We also recommend that a
   *       file or class name and description of purpose be included on the
   *       same "printed page" as the copyright notice for easier
   *       identification within third-party archives.
   *
   *    Copyright 2016 Alibaba Group
   *
   *    Licensed under the Apache License, Version 2.0 (the "License");
   *    you may not use this file except in compliance with the License.
   *    You may obtain a copy of the License at
   *
   *        http://www.apache.org/licenses/LICENSE-2.0
   *
   *    Unless required by applicable law or agreed to in writing, software
   *    distributed under the License is distributed on an "AS IS" BASIS,
   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *    See the License for the specific language governing permissions and
   *    limitations under the License.
   *
   *
   */
  package com.taobao.android.tools;
  /*
   *
   *
   *                                  Apache License
   *                            Version 2.0, January 2004
   *                         http://www.apache.org/licenses/
   *
   *    TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
   *
   *    1. Definitions.
   *
   *       "License" shall mean the terms and conditions for use, reproduction,
   *       and distribution as defined by Sections 1 through 9 of this document.
   *
   *       "Licensor" shall mean the copyright owner or entity authorized by
   *       the copyright owner that is granting the License.
   *
   *       "Legal Entity" shall mean the union of the acting entity and all
   *       other entities that control, are controlled by, or are under common
   *       control with that entity. For the purposes of this definition,
   *       "control" means (i) the power, direct or indirect, to cause the
   *       direction or management of such entity, whether by contract or
   *       otherwise, or (ii) ownership of fifty percent (50%) or more of the
   *       outstanding shares, or (iii) beneficial ownership of such entity.
   *
   *       "You" (or "Your") shall mean an individual or Legal Entity
   *       exercising permissions granted by this License.
   *
   *       "Source" form shall mean the preferred form for making modifications,
   *       including but not limited to software source code, documentation
   *       source, and configuration files.
   *
   *       "Object" form shall mean any form resulting from mechanical
   *       transformation or translation of a Source form, including but
   *       not limited to compiled object code, generated documentation,
   *       and conversions to other media types.
   *
   *       "Work" shall mean the work of authorship, whether in Source or
   *       Object form, made available under the License, as indicated by a
   *       copyright notice that is included in or attached to the work
   *       (an example is provided in the Appendix below).
   *
   *       "Derivative Works" shall mean any work, whether in Source or Object
   *       form, that is based on (or derived from) the Work and for which the
   *       editorial revisions, annotations, elaborations, or other modifications
   *       represent, as a whole, an original work of authorship. For the purposes
   *       of this License, Derivative Works shall not include works that remain
   *       separable from, or merely link (or bind by name) to the interfaces of,
   *       the Work and Derivative Works thereof.
   *
   *       "Contribution" shall mean any work of authorship, including
   *       the original version of the Work and any modifications or additions
   *       to that Work or Derivative Works thereof, that is intentionally
   *       submitted to Licensor for inclusion in the Work by the copyright owner
   *       or by an individual or Legal Entity authorized to submit on behalf of
   *       the copyright owner. For the purposes of this definition, "submitted"
   *       means any form of electronic, verbal, or written communication sent
   *       to the Licensor or its representatives, including but not limited to
   *       communication on electronic mailing lists, source code control systems,
   *       and issue tracking systems that are managed by, or on behalf of, the
   *       Licensor for the purpose of discussing and improving the Work, but
   *       excluding communication that is conspicuously marked or otherwise
   *       designated in writing by the copyright owner as "Not a Contribution."
   *
   *       "Contributor" shall mean Licensor and any individual or Legal Entity
   *       on behalf of whom a Contribution has been received by Licensor and
   *       subsequently incorporated within the Work.
   *
   *    2. Grant of Copyright License. Subject to the terms and conditions of
   *       this License, each Contributor hereby grants to You a perpetual,
   *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   *       copyright license to reproduce, prepare Derivative Works of,
   *       publicly display, publicly perform, sublicense, and distribute the
   *       Work and such Derivative Works in Source or Object form.
   *
   *    3. Grant of Patent License. Subject to the terms and conditions of
   *       this License, each Contributor hereby grants to You a perpetual,
   *       worldwide, non-exclusive, no-charge, royalty-free, irrevocable
   *       (except as stated in this section) patent license to make, have made,
   *       use, offer to sell, sell, import, and otherwise transfer the Work,
   *       where such license applies only to those patent claims licensable
   *       by such Contributor that are necessarily infringed by their
   *       Contribution(s) alone or by combination of their Contribution(s)
   *       with the Work to which such Contribution(s) was submitted. If You
   *       institute patent litigation against any entity (including a
   *       cross-claim or counterclaim in a lawsuit) alleging that the Work
   *       or a Contribution incorporated within the Work constitutes direct
   *       or contributory patent infringement, then any patent licenses
   *       granted to You under this License for that Work shall terminate
   *       as of the date such litigation is filed.
   *
   *    4. Redistribution. You may reproduce and distribute copies of the
   *       Work or Derivative Works thereof in any medium, with or without
   *       modifications, and in Source or Object form, provided that You
   *       meet the following conditions:
   *
   *       (a) You must give any other recipients of the Work or
   *           Derivative Works a copy of this License; and
   *
   *       (b) You must cause any modified files to carry prominent notices
   *           stating that You changed the files; and
   *
   *       (c) You must retain, in the Source form of any Derivative Works
   *           that You distribute, all copyright, patent, trademark, and
   *           attribution notices from the Source form of the Work,
   *           excluding those notices that do not pertain to any part of
   *           the Derivative Works; and
   *
   *       (d) If the Work includes a "NOTICE" text file as part of its
   *           distribution, then any Derivative Works that You distribute must
   *           include a readable copy of the attribution notices contained
   *           within such NOTICE file, excluding those notices that do not
   *           pertain to any part of the Derivative Works, in at least one
   *           of the following places: within a NOTICE text file distributed
   *           as part of the Derivative Works; within the Source form or
   *           documentation, if provided along with the Derivative Works; or,
   *           within a display generated by the Derivative Works, if and
   *           wherever such third-party notices normally appear. The contents
   *           of the NOTICE file are for informational purposes only and
   *           do not modify the License. You may add Your own attribution
   *           notices within Derivative Works that You distribute, alongside
   *           or as an addendum to the NOTICE text from the Work, provided
   *           that such additional attribution notices cannot be construed
   *           as modifying the License.
   *
   *       You may add Your own copyright statement to Your modifications and
   *       may provide additional or different license terms and conditions
   *       for use, reproduction, or distribution of Your modifications, or
   *       for any such Derivative Works as a whole, provided Your use,
   *       reproduction, and distribution of the Work otherwise complies with
   *       the conditions stated in this License.
   *
   *    5. Submission of Contributions. Unless You explicitly state otherwise,
   *       any Contribution intentionally submitted for inclusion in the Work
   *       by You to the Licensor shall be under the terms and conditions of
   *       this License, without any additional terms or conditions.
   *       Notwithstanding the above, nothing herein shall supersede or modify
   *       the terms of any separate license agreement you may have executed
   *       with Licensor regarding such Contributions.
   *
   *    6. Trademarks. This License does not grant permission to use the trade
   *       names, trademarks, service marks, or product names of the Licensor,
   *       except as required for reasonable and customary use in describing the
   *       origin of the Work and reproducing the content of the NOTICE file.
   *
   *    7. Disclaimer of Warranty. Unless required by applicable law or
   *       agreed to in writing, Licensor provides the Work (and each
   *       Contributor provides its Contributions) on an "AS IS" BASIS,
   *       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
   *       implied, including, without limitation, any warranties or conditions
   *       of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
   *       PARTICULAR PURPOSE. You are solely responsible for determining the
   *       appropriateness of using or redistributing the Work and assume any
   *       risks associated with Your exercise of permissions under this License.
   *
   *    8. Limitation of Liability. In no event and under no legal theory,
   *       whether in tort (including negligence), contract, or otherwise,
   *       unless required by applicable law (such as deliberate and grossly
   *       negligent acts) or agreed to in writing, shall any Contributor be
   *       liable to You for damages, including any direct, indirect, special,
   *       incidental, or consequential damages of any character arising as a
   *       result of this License or out of the use or inability to use the
   *       Work (including but not limited to damages for loss of goodwill,
   *       work stoppage, computer failure or malfunction, or any and all
   *       other commercial damages or losses), even if such Contributor
   *       has been advised of the possibility of such damages.
   *
   *    9. Accepting Warranty or Additional Liability. While redistributing
   *       the Work or Derivative Works thereof, You may choose to offer,
   *       and charge a fee for, acceptance of support, warranty, indemnity,
   *       or other liability obligations and/or rights consistent with this
   *       License. However, in accepting such obligations, You may act only
   *       on Your own behalf and on Your sole responsibility, not on behalf
   *       of any other Contributor, and only if You agree to indemnify,
   *       defend, and hold each Contributor harmless for any liability
   *       incurred by, or claims asserted against, such Contributor by reason
   *       of your accepting any such warranty or additional liability.
   *
   *    END OF TERMS AND CONDITIONS
   *
   *    APPENDIX: How to apply the Apache License to your work.
   *
   *       To apply the Apache License to your work, attach the following
   *       boilerplate notice, with the fields enclosed by brackets "[]"
   *       replaced with your own identifying information. (Don't include
   *       the brackets!)  The text should be enclosed in the appropriate
   *       comment syntax for the file format. We also recommend that a
   *       file or class name and description of purpose be included on the
   *       same "printed page" as the copyright notice for easier
   *       identification within third-party archives.
   *
   *    Copyright 2016 Alibaba Group
   *
   *    Licensed under the Apache License, Version 2.0 (the "License");
   *    you may not use this file except in compliance with the License.
   *    You may obtain a copy of the License at
   *
   *        http://www.apache.org/licenses/LICENSE-2.0
   *
   *    Unless required by applicable law or agreed to in writing, software
   *    distributed under the License is distributed on an "AS IS" BASIS,
   *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   *    See the License for the specific language governing permissions and
   *    limitations under the License.
   *
   *
   */
  
  import com.google.common.collect.Lists;
  import com.taobao.android.apatch.AndFixFilterImpl;
  import com.taobao.android.apatch.ApkPatch;
  import com.taobao.android.apatch.FastBuild;
  import com.taobao.android.apatch.MergePatch;
  import com.taobao.android.apatch.annotation.MethodReplaceAnnotation;
  import com.taobao.android.apatch.utils.SmaliDiffUtils;
  import com.taobao.android.differ.dex.PatchException;
  import com.taobao.android.object.DexDiffInfo;
  import com.taobao.android.repatch.FastPatchObject;
  import com.taobao.android.repatch.InsTructionsReIClassDef;
  import com.taobao.android.repatch.Utils.DefineUtils;
  import com.taobao.android.repatch.mapping.MappingProcessor;
  import com.taobao.android.repatch.mapping.MappingProcessorImpl;
  import com.taobao.android.repatch.mapping.MappingReader;
  import com.taobao.android.repatch.processor.MappingClassProcessor;
  import com.taobao.android.tpatch.utils.SmaliUtils;
  import org.antlr.runtime.RecognitionException;
  import org.apache.commons.io.FileUtils;
  import org.jf.dexlib2.DexFileFactory;
  import org.jf.dexlib2.Opcodes;
  import org.jf.dexlib2.dexbacked.DexBackedClassDef;
  import org.jf.dexlib2.dexbacked.DexBackedMethod;
  import org.jf.dexlib2.iface.ClassDef;
  import org.jf.dexlib2.iface.DexFile;
  import org.jf.dexlib2.iface.Method;
  import org.jf.dexlib2.immutable.ImmutableDexFile;
  
  import javax.annotation.Nonnull;
  import java.io.File;
  import java.io.IOException;
  import java.security.KeyStoreException;
  import java.security.NoSuchAlgorithmException;
  import java.security.UnrecoverableEntryException;
  import java.security.cert.CertificateException;
  import java.util.*;
  
  /**
   * Created by lilong on 16/6/30.
   */
  public class FastPatchTool {
  
      private List<FastPatchObject> patchObjects = new ArrayList<FastPatchObject>();
      private File outDir;
      private File mappingFile;
      private String bundleName = "com_taobao_maindex";
      private List<File> patchJarFiles = new ArrayList<File>();
  
      public Map<String, String> getSuperClassMap() {
          return superClassMap;
      }
  
      public void setSuperClassMap(Map<String, String> superClassMap) {
          this.superClassMap = superClassMap;
      }
  
      private Map<String,String>superClassMap = new HashMap<String, String>();
      File outPatchFile;
  
      public void setOutDir(File outDir) {
          this.outDir = outDir;
      }
  
      public void setModifyClasses(List<FastPatchObject> list) {
          this.patchObjects = list;
      }
  
      public void setMappingFile(File mappingFile) {
          this.mappingFile = mappingFile;
      }
  
  
      public void doPatch() throws IOException, PatchException, RecognitionException {
          MappingReader mappingReader = null;
          MappingProcessor mappingProcessor = null;
  
          if (outDir == null || !outDir.exists()) {
              return;
          }
          outPatchFile = new File(outDir, "apatch-unsigned.apatch");
  
          if (mappingFile != null && mappingFile.exists()) {
              mappingReader = new MappingReader(mappingFile);
              mappingProcessor = new MappingProcessorImpl(superClassMap);
              mappingReader.pump(mappingProcessor);
              mappingProcessor.updateMethod();
              mappingProcessor.updateFieldType();
          }
  
          for (FastPatchObject fastPatchObject : patchObjects) {
              Set<ClassDef> classes = new HashSet<ClassDef>();
              Map<ClassDef, List<Method>> patchClassDefs = new HashMap<ClassDef, List<Method>>();
              Set<ClassDef>addedClasses = new HashSet<ClassDef>();
              Map<ClassDef, List<Method>> newClassDef = new HashMap<ClassDef, List<Method>>();
  
              ArrayList<Method> methods = new ArrayList<Method>();
  
              for (File dexFile : fastPatchObject.DexFiles) {
                  DexFile dFile = DexFileFactory.loadDexFile(dexFile.getAbsolutePath(), Opcodes.getDefault());
                  classes.addAll(dFile.getClasses());
              }
              final Set<ClassDef> newClasses = new HashSet<ClassDef>();
              for (ClassDef classDef : classes) {
                  String type = classDef.getType();
                  if (fastPatchObject.addedClass.contains(SmaliUtils.getDalvikClassName(type))){
                      System.out.println("patch added class:"+type);
                      addedClasses.add(classDef);
                      continue;
                  }
                  for (Map.Entry<String,List<String>> entry : fastPatchObject.modifyClasses.entrySet()) {
                      if (entry.getKey().equals(SmaliUtils.getDalvikClassName(type))) {
                          ArrayList<Method> newMethods = new ArrayList<Method>();
                          for (Method method : classDef.getMethods()) {
                              System.err.println(getMethodFullName(method));
                              if (entry.getValue().contains(getMethodFullName(method))) {
                                  newMethods.add(method);
                              }
  
                          }
                          patchClassDefs.put(classDef, newMethods);
                          break;
                      }
                  }
              }
              if (patchClassDefs.size() == 0&&addedClasses.size() == 0) {
                  continue;
              }
  
  
              if (mappingFile != null && mappingFile.exists()) {
                  //第一步先将prepareclass混淆掉
                  for (String className : fastPatchObject.prepareClasses) {
                      ApkPatch.prepareClasses.add(mappingProcessor.getNewClassName(className).className);
                  }
                  //将replaceanatation混淆掉
                  MethodReplaceAnnotation.ANNOTATION= DefineUtils.getDefineClassName(mappingProcessor.getNewClassName(DefineUtils.getDalvikClassName("Lcom/alipay/euler/andfix/annotation/MethodReplace;")).className,false);
                  //将dex代码混淆掉
                  InsTructionsReIClassDef insTructionsReDef = new InsTructionsReIClassDef(new MappingClassProcessor(mappingProcessor));
                  for (ClassDef c : classes) {
                      if (patchClassDefs.containsKey(c)) {
                          for (Method method : c.getMethods()) {
                              if (patchClassDefs.get(c).contains(method)) {
                                  methods.add(insTructionsReDef.reMethod(method));
                              }
                          }
                          newClassDef.put(insTructionsReDef.reClassDef(c), methods);
                      }else if (addedClasses.contains(c)){
                          newClassDef.put(insTructionsReDef.reClassDef(c),new ArrayList<Method>());
                      }
                      if (c.getType().contains("/R$")) {
                          continue;
                      }
                      newClasses.add(insTructionsReDef.reClassDef(c));
                  }
  
              }else {
                  ApkPatch.prepareClasses.addAll(fastPatchObject.prepareClasses);
              }
  
              File patchDexFile = new File(outDir, "patch.dex");
              for (ClassDef classDef:newClassDef.keySet()){
                  System.out.println("modify class:"+classDef.getType());
              }
              if (newClassDef.size() > 0) {
                  DexFileFactory.writeDexFile(patchDexFile.getAbsolutePath(), new ImmutableDexFile(Opcodes.getDefault(),newClassDef.keySet()));
              } else if (patchClassDefs.size() > 0) {
                  DexFileFactory.writeDexFile(patchDexFile.getAbsolutePath(), new ImmutableDexFile(Opcodes.getDefault(),patchClassDefs.keySet()));
              }
  
              File tempDexFile = new File(outDir, "temp.dex");
              if (newClasses.size() > 0) {
                  DexFileFactory.writeDexFile(tempDexFile.getAbsolutePath(), new DexFile() {
                      @Nonnull
                      @Override
                      public Set<? extends ClassDef> getClasses() {
                          return new AbstractSet<ClassDef>() {
                              @Nonnull
                              @Override
                              public Iterator<ClassDef> iterator() {
                                  return newClasses.iterator();
                              }
  
                              @Override
                              public int size() {
                                  return newClasses.size();
                              }
                          };
                      }
  
                      @Nonnull
                      @Override
                      public Opcodes getOpcodes() {
                          return Opcodes.getDefault();
                      }
                  });
              } else if (classes.size() > 0) {
                  DexFileFactory.writeDexFile(tempDexFile.getAbsolutePath(), new ImmutableDexFile(Opcodes.getDefault(),classes));
  
              }
  
              SmaliDiffUtils.scanClasses(new File(outDir,"smali2"), Lists.newArrayList(tempDexFile));
  
  
  
              DexFile patchDex = DexFileFactory.loadDexFile(patchDexFile.getAbsolutePath(), Opcodes.getDefault());
              DexFile tempDex = DexFileFactory.loadDexFile(tempDexFile.getAbsolutePath(), Opcodes.getDefault());
              Set<? extends ClassDef> patchClasses = patchDex.getClasses();
              DexDiffInfo dexDiffInfo = new DexDiffInfo();
              for (ClassDef patchClassDef : patchClasses) {
                  String type = patchClassDef.getType();
                  if (fastPatchObject.addedClass.contains(SmaliUtils.getDalvikClassName(type))){
                      dexDiffInfo.getAddedClasses().add((DexBackedClassDef) patchClassDef);
                      dexDiffInfo.addManifestAddClass(type);
                      continue;
                  }
  
                  for (Method method : patchClassDef.getMethods()) {
                      List<? extends CharSequence> parameters = method.getParameterTypes();
                      if (methods.size() > 0) {
                          for (Method modifyMethod : methods) {
                              List<? extends CharSequence> modifyParameters = modifyMethod.getParameterTypes();
                              if (parameters.size() != modifyParameters.size()||!isEqualObj(parameters,modifyParameters)){
                                  continue;
                              }
  
                              if (modifyMethod.getName().equals(method.getName()))
                                  dexDiffInfo.addModifiedMethods((DexBackedMethod) method);
                          }
                      } else if (patchClassDefs.size() > 0) {
                          for (ClassDef classDef : patchClassDefs.keySet()) {
                              if (classDef.getType().equals(patchClassDef.getType())) {
                                  List<Method> methodList = patchClassDefs.get(classDef);
                                  for (Method method1 : methodList) {
                                      if (method1.getName().equals(method.getName())) {
                                          dexDiffInfo.addModifiedMethods((DexBackedMethod) method);
                                      }
                                  }
                              }
                          }
  
  
                      }
                  }
              }
              FastBuild fastBuild = new FastBuild(fastPatchObject.bundleName, new File(outDir,bundleName));
              fastBuild.setClasses(tempDex.getClasses());
              fastBuild.setDiffInfo(dexDiffInfo);
              new AndFixFilterImpl(dexDiffInfo).filterDex();
              dexDiffInfo.update();
              File adiffFile = new File(outDir, "apatch-diff.txt");
              File adiffJsonFile = new File(outDir, "apatch-diff.json");
              dexDiffInfo.writeToFile(fastPatchObject.bundleName,adiffFile,adiffJsonFile);
              try {
                  File patchJarFile = fastBuild.dopatch();
                  patchJarFiles.add(patchJarFile);
              } catch (CertificateException e) {
                  e.printStackTrace();
              } catch (NoSuchAlgorithmException e) {
                  e.printStackTrace();
              } catch (KeyStoreException e) {
                  e.printStackTrace();
              } catch (UnrecoverableEntryException e) {
                  e.printStackTrace();
              }
          }
  
          File[] aPatchFiles = new File[patchJarFiles.size()];
          aPatchFiles = patchJarFiles.toArray(aPatchFiles);
          File mergePatchFile = null;
          if (null != aPatchFiles && aPatchFiles.length > 1) {
              MergePatch mergePatch = new MergePatch(aPatchFiles, "com_taobao_android", outDir);
              mergePatchFile = mergePatch.doMerge();
          } else if (null != aPatchFiles && aPatchFiles.length == 1) {
              mergePatchFile = aPatchFiles[0];
          }
          if (null != mergePatchFile && mergePatchFile.exists()) {
              FileUtils.moveFile(mergePatchFile, outPatchFile);
          }
  
      }
  
      private String getMethodFullName(Method method) {
          StringBuilder stringBuilder = new StringBuilder();
          String methodName = method.getName();
          stringBuilder.append(methodName).append("(");
          for (CharSequence c:method.getParameterTypes()){
              stringBuilder.append(c);
          }
          stringBuilder.append(")").append(method.getReturnType());
          return stringBuilder.toString();
  
      }
  
      private boolean isEqualObj(List<? extends CharSequence> parameters, List<? extends CharSequence> modifyParameters) {
          if (parameters.size() != modifyParameters.size()){
              return false;
          }
          if (!parameters.toString().equals(modifyParameters.toString())){
              return false;
          }
  
          return true;
  
      }
  
  
  
  }
  