Home | History | Annotate | Download | only in lockedregioncodeinjection
      1 /*
      2  * Copyright (C) 2017 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
      5  * in compliance with the License. You may obtain a copy of the License at
      6  *
      7  * http://www.apache.org/licenses/LICENSE-2.0
      8  *
      9  * Unless required by applicable law or agreed to in writing, software distributed under the License
     10  * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
     11  * or implied. See the License for the specific language governing permissions and limitations under
     12  * the License.
     13  */
     14 package lockedregioncodeinjection;
     15 
     16 import java.io.BufferedInputStream;
     17 import java.io.FileOutputStream;
     18 import java.io.IOException;
     19 import java.io.InputStream;
     20 import java.io.OutputStream;
     21 import java.util.Collections;
     22 import java.util.Enumeration;
     23 import java.util.List;
     24 import java.util.zip.ZipEntry;
     25 import java.util.zip.ZipFile;
     26 import java.util.zip.ZipOutputStream;
     27 import org.objectweb.asm.ClassReader;
     28 import org.objectweb.asm.ClassWriter;
     29 
     30 public class Main {
     31     public static void main(String[] args) throws IOException {
     32         String inJar = null;
     33         String outJar = null;
     34 
     35         String legacyTargets = null;
     36         String legacyPreMethods = null;
     37         String legacyPostMethods = null;
     38         for (int i = 0; i < args.length; i++) {
     39             if ("-i".equals(args[i].trim())) {
     40                 i++;
     41                 inJar = args[i].trim();
     42             } else if ("-o".equals(args[i].trim())) {
     43                 i++;
     44                 outJar = args[i].trim();
     45             } else if ("--targets".equals(args[i].trim())) {
     46                 i++;
     47                 legacyTargets = args[i].trim();
     48             } else if ("--pre".equals(args[i].trim())) {
     49                 i++;
     50                 legacyPreMethods = args[i].trim();
     51             } else if ("--post".equals(args[i].trim())) {
     52                 i++;
     53                 legacyPostMethods = args[i].trim();
     54             }
     55 
     56         }
     57 
     58         // TODO(acleung): Better help message than asserts.
     59         assert inJar != null;
     60         assert outJar != null;
     61         assert legacyTargets == null || (legacyPreMethods != null && legacyPostMethods != null);
     62 
     63         ZipFile zipSrc = new ZipFile(inJar);
     64         ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outJar));
     65         List<LockTarget> targets = null;
     66         if (legacyTargets != null) {
     67             targets = Utils.getTargetsFromLegacyJackConfig(legacyTargets, legacyPreMethods,
     68                     legacyPostMethods);
     69         } else {
     70             targets = Collections.emptyList();
     71         }
     72 
     73         Enumeration<? extends ZipEntry> srcEntries = zipSrc.entries();
     74         while (srcEntries.hasMoreElements()) {
     75             ZipEntry entry = srcEntries.nextElement();
     76             ZipEntry newEntry = new ZipEntry(entry.getName());
     77             zos.putNextEntry(newEntry);
     78             BufferedInputStream bis = new BufferedInputStream(zipSrc.getInputStream(entry));
     79 
     80             if (entry.getName().endsWith(".class")) {
     81                 convert(bis, zos, targets);
     82             } else {
     83                 while (bis.available() > 0) {
     84                     zos.write(bis.read());
     85                 }
     86                 zos.closeEntry();
     87                 bis.close();
     88             }
     89         }
     90         zos.finish();
     91         zos.close();
     92         zipSrc.close();
     93     }
     94 
     95     private static void convert(InputStream in, OutputStream out, List<LockTarget> targets)
     96             throws IOException {
     97         ClassReader cr = new ClassReader(in);
     98         ClassWriter cw = new ClassWriter(0);
     99         LockFindingClassVisitor cv = new LockFindingClassVisitor(targets, cw);
    100         cr.accept(cv, 0);
    101         byte[] data = cw.toByteArray();
    102         out.write(data);
    103     }
    104 }
    105