Search in sources :

Example 1 with InjectParam

use of com.taobao.android.builder.tools.classinject.InjectParam in project atlas by alibaba.

the class DexBuildTask method doFullTaskAction.

@TaskAction
public void doFullTaskAction() throws IOException {
    classJar = getClassJar();
    dependencyJars = getDependencyJars();
    File mergeJar = new File(classJar.getParentFile(), "merge.jar");
    JarMergerWithOverride jarMergerWithOverride = new JarMergerWithOverride(mergeJar);
    jarMergerWithOverride.addJar(classJar);
    for (File file : dependencyJars) {
        jarMergerWithOverride.addJar(file);
    }
    jarMergerWithOverride.close();
    ClassPool classPool = initClassPool(mergeJar);
    String jarFileName = classJar.getName();
    String outFileName = FilenameUtils.getBaseName(jarFileName) + "-inject.jar";
    File outPutJar = new File(classJar.getParentFile(), outFileName);
    CodeInjectByJavassist.inject(classPool, mergeJar, outPutJar, new InjectParam());
    getOutputDexFile().getParentFile().mkdirs();
    outputDexFile = DexBuilderUtils.buildDexInJvm(outPutJar, getOutputDexFile(), new ArrayList<String>());
}
Also used : JarMergerWithOverride(com.taobao.android.builder.tools.jarmerge.JarMergerWithOverride) ClassPool(javassist.ClassPool) ArrayList(java.util.ArrayList) File(java.io.File) InjectParam(com.taobao.android.builder.tools.classinject.InjectParam) MtlBaseTaskAction(com.taobao.android.builder.tasks.manager.MtlBaseTaskAction)

Example 2 with InjectParam

use of com.taobao.android.builder.tools.classinject.InjectParam in project atlas by alibaba.

the class ClassInjectTransform method transform.

@Override
public void transform(TransformInvocation transformInvocation) throws TransformException, IOException, InterruptedException {
    TransformOutputProvider outputProvider = transformInvocation.getOutputProvider();
    checkNotNull(outputProvider, "Missing output object for transform " + getName());
    // Gather a full list of all inputs.
    List<JarInput> jarInputs = Lists.newArrayList();
    List<DirectoryInput> directoryInputs = Lists.newArrayList();
    for (TransformInput input : transformInvocation.getInputs()) {
        jarInputs.addAll(input.getJarInputs());
        directoryInputs.addAll(input.getDirectoryInputs());
    }
    outputProvider.deleteAll();
    ClassPool classPool = initClassPool(jarInputs, directoryInputs);
    Set<String> outFileNames = Sets.newHashSet();
    InjectParam injectParam = null;
    try {
        injectParam = AtlasBuildContext.sApkInjectInfoCreator.creteInjectParam(appVariantContext);
    } catch (DocumentException e) {
        throw new TransformException(e);
    }
    for (JarInput jarInput : jarInputs) {
        if (null != logger) {
            logger.debug("[ClassInject]" + jarInput.getFile().getAbsolutePath());
        }
        String jarFileName = jarInput.getFile().getName();
        if (jarFileName.equalsIgnoreCase("classes.jar")) {
            jarFileName = jarInput.getFile().getParentFile().getParentFile().getParentFile().getName() + "-" + jarInput.getFile().getParentFile().getParentFile().getName() + DOT_JAR;
        }
        String outFileName = jarFileName.substring(0, jarFileName.length() - DOT_JAR.length());
        String fileName = outFileName;
        int index = 1;
        while (outFileNames.contains(fileName)) {
            fileName = outFileName + "-" + index;
            index++;
        }
        outFileNames.add(fileName);
        File to = outputProvider.getContentLocation(fileName, jarInput.getContentTypes(), getScopes(), Format.JAR);
        //只对 atlas 做代码注入, 没有做多jarmerge
        if (injectParam.removePreverify && !jarFileName.contains("atlas") && jarInputs.size() > 1) {
            FileUtils.copyFile(jarInput.getFile(), to);
        } else {
            CodeInjectByJavassist.inject(classPool, jarInput.getFile(), to, injectParam);
        }
    }
    for (DirectoryInput directoryInput : directoryInputs) {
        if (null != logger) {
            logger.debug("[ClassInject]" + directoryInput.getFile().getAbsolutePath());
        }
        String folderName = directoryInput.getFile().getName();
        File to = outputProvider.getContentLocation(folderName, getOutputTypes(), getScopes(), Format.DIRECTORY);
        if (!injectParam.removePreverify) {
            CodeInjectByJavassist.injectFolder(classPool, directoryInput.getFile(), to, injectParam);
        } else {
            FileUtils.copyDirectory(directoryInput.getFile(), to);
        }
    }
}
Also used : TransformOutputProvider(com.android.build.api.transform.TransformOutputProvider) ClassPool(javassist.ClassPool) TransformException(com.android.build.api.transform.TransformException) TransformInput(com.android.build.api.transform.TransformInput) DocumentException(org.dom4j.DocumentException) JarInput(com.android.build.api.transform.JarInput) File(java.io.File) InjectParam(com.taobao.android.builder.tools.classinject.InjectParam) DirectoryInput(com.android.build.api.transform.DirectoryInput)

Aggregations

InjectParam (com.taobao.android.builder.tools.classinject.InjectParam)2 File (java.io.File)2 ClassPool (javassist.ClassPool)2 DirectoryInput (com.android.build.api.transform.DirectoryInput)1 JarInput (com.android.build.api.transform.JarInput)1 TransformException (com.android.build.api.transform.TransformException)1 TransformInput (com.android.build.api.transform.TransformInput)1 TransformOutputProvider (com.android.build.api.transform.TransformOutputProvider)1 MtlBaseTaskAction (com.taobao.android.builder.tasks.manager.MtlBaseTaskAction)1 JarMergerWithOverride (com.taobao.android.builder.tools.jarmerge.JarMergerWithOverride)1 ArrayList (java.util.ArrayList)1 DocumentException (org.dom4j.DocumentException)1