Search in sources :

Example 1 with Result

use of com.taobao.android.builder.tools.proguard.domain.Result in project atlas by alibaba.

the class BundleProguarder method loadProguardFromCache.

public static Result loadProguardFromCache(AppVariantContext appVariantContext, Input input) throws Exception {
    Result result = new Result();
    String md5 = input.getMd5();
    result.key = input.getAwbBundles().get(0).getAwbBundle().getName() + "_" + md5;
    logger.info("bundle proguard for " + result.key + " with md5 key " + md5);
    File cacheDir = FileCacheCenter.queryFile(CACHE_TYPE, result.key, true, isRemoteCacheEnabled(appVariantContext));
    result.cacheDir = cacheDir;
    if (null == cacheDir || !cacheDir.exists()) {
        logger.warn("bundle proguard for " + result.key + " miss  cache " + cacheDir.getAbsolutePath());
        return result;
    }
    logger.warn("bundle proguard for " + result.key + " hit  cache ");
    File keepJson = new File(cacheDir, "keep.json");
    File proguardCfg = new File(cacheDir, "proguard.cfg");
    File usageCfg = new File(cacheDir, "usage.cfg");
    Map<String, File> md5Map = input.getMd5Files();
    if (input.getAwbBundles().get(0).getAwbBundle().isMainBundle()) {
        AtlasBuildContext.atlasMainDexHelperMap.get(appVariantContext.getVariantName()).getMainDexFiles().clear();
        AtlasBuildContext.atlasMainDexHelperMap.get(appVariantContext.getVariantName()).getInputDirs().clear();
        for (File file : cacheDir.listFiles()) {
            if (file.getName().endsWith("jar") && ZipUtils.isZipFile(file)) {
                String jarMd5 = file.getName().replace(".jar", "");
                File srcFile = md5Map.get(jarMd5);
                if (null != srcFile && srcFile.exists()) {
                    String fileName = FileNameUtils.getUniqueJarName(srcFile);
                    FileUtils.copyFile(file, new File(input.proguardOutputDir, fileName + ".jar"));
                    AtlasBuildContext.atlasMainDexHelperMap.get(appVariantContext.getVariantName()).addMainDex(new BuildAtlasEnvTask.FileIdentity(fileName, new File(input.proguardOutputDir, fileName + ".jar"), false, false));
                } else {
                    FileUtils.copyFileToDirectory(file, input.proguardOutputDir);
                    AtlasBuildContext.atlasMainDexHelperMap.get(appVariantContext.getVariantName()).addMainDex(new BuildAtlasEnvTask.FileIdentity(file.getName(), new File(input.proguardOutputDir, file.getName()), false, false));
                }
            }
        }
        File awbProguardDir = input.printConfiguration.getParentFile();
        // FileUtils.copyFileToDirectory(keepJson, awbProguardDir);
        if (proguardCfg.exists()) {
            FileUtils.copyFileToDirectory(proguardCfg, awbProguardDir);
        }
        if (usageCfg.exists()) {
            FileUtils.copyFileToDirectory(usageCfg, awbProguardDir);
        }
        result.success = true;
        return result;
    } else {
        if (!keepJson.exists()) {
            logger.error("bundle proguard for " + result.key + " missing keep.json  ");
            FileUtils.deleteDirectory(cacheDir);
            return result;
        }
        Map<AwbTransform, List<File>> transformListMap = new HashMap<>();
        for (AwbTransform awbTransform : input.getAwbBundles()) {
            File awbProguardDir = appVariantContext.getAwbProguardDir(awbTransform.getAwbBundle());
            FileUtils.copyFileToDirectory(keepJson, awbProguardDir);
            if (proguardCfg.exists()) {
                FileUtils.copyFileToDirectory(proguardCfg, awbProguardDir);
            }
            if (usageCfg.exists()) {
                FileUtils.copyFileToDirectory(usageCfg, awbProguardDir);
            }
            List<File> inputFiles = new ArrayList<>();
            transformListMap.put(awbTransform, inputFiles);
            List<File> files = new ArrayList<>();
            files.addAll(awbTransform.getInputLibraries());
            // configs.add();
            if (null != awbTransform.getInputDirs() && awbTransform.getInputDirs().size() > 0) {
                files.addAll(awbTransform.getInputDirs());
            }
            for (File oldFile : files) {
                File file = new File(cacheDir, input.getFileMd5s().get(oldFile) + ".jar");
                if (file.exists()) {
                    if (ZipUtils.isZipFile(file)) {
                        inputFiles.add(file);
                    }
                } else {
                    logger.error("miss proguard jar for :" + file.getAbsolutePath());
                    FileUtils.deleteDirectory(cacheDir);
                    logger.error("delete cache Dir " + cacheDir.getAbsolutePath());
                    return result;
                }
            }
        }
        for (AwbTransform awbTransform : input.getAwbBundles()) {
            awbTransform.setInputFiles(transformListMap.get(awbTransform));
            awbTransform.getInputDirs().clear();
            awbTransform.getInputLibraries().clear();
            awbTransform.getAwbBundle().setKeepProguardFile(keepJson);
        }
        result.success = true;
        return result;
    }
}
Also used : HashMap(java.util.HashMap) AwbTransform(com.android.build.gradle.internal.api.AwbTransform) ArrayList(java.util.ArrayList) ArrayList(java.util.ArrayList) List(java.util.List) File(java.io.File) Result(com.taobao.android.builder.tools.proguard.domain.Result) BuildAtlasEnvTask(com.taobao.android.builder.tasks.app.BuildAtlasEnvTask)

Example 2 with Result

use of com.taobao.android.builder.tools.proguard.domain.Result in project atlas by alibaba.

the class BundleProguarder method execute.

public static void execute(AppVariantContext appVariantContext, Input input) throws Exception {
    if (input.proguardOutputDir != null && input.proguardOutputDir.exists()) {
        FileUtils.cleanDirectory(input.proguardOutputDir);
    }
    if (!appVariantContext.getAtlasExtension().getTBuildConfig().isProguardCacheEnabled()) {
        doProguard(appVariantContext, input);
        return;
    }
    String md5 = input.getMd5();
    Result result = loadProguardFromCache(appVariantContext, input);
    String bundleName = input.getAwbBundles().get(0).getAwbBundle().getName();
    if (result.success) {
        fileLogger.log(bundleName + " hit cache " + result.cacheDir.getAbsolutePath());
        return;
    }
    fileLogger.log(bundleName + " miss cache " + result.cacheDir.getAbsolutePath());
    long startTime = System.currentTimeMillis();
    doProguard(appVariantContext, input);
    double during = (System.currentTimeMillis() - startTime) / 1000.0;
    fileLogger.log(bundleName + "proguard consume (s) " + during);
    // cache
    if (null != result.cacheDir) {
        try {
            cacheProguard(appVariantContext, input, result);
        } catch (Throwable e) {
            logger.error(e.getMessage(), e);
        }
    }
}
Also used : Result(com.taobao.android.builder.tools.proguard.domain.Result)

Aggregations

Result (com.taobao.android.builder.tools.proguard.domain.Result)2 AwbTransform (com.android.build.gradle.internal.api.AwbTransform)1 BuildAtlasEnvTask (com.taobao.android.builder.tasks.app.BuildAtlasEnvTask)1 File (java.io.File)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 List (java.util.List)1