use of org.gradle.api.tasks.TaskAction in project atlas by alibaba.
the class DataBindingRenameTask method createAwbPackages.
/**
* 生成so的目录
*/
@TaskAction
void createAwbPackages() throws ExecutionException, InterruptedException {
AndroidDependencyTree androidDependencyTree = AtlasBuildContext.androidDependencyTrees.get(getVariantName());
if (null == androidDependencyTree) {
return;
}
ExecutorServicesHelper executorServicesHelper = new ExecutorServicesHelper(taskName, getLogger(), 0);
List<Runnable> runnables = new ArrayList<>();
for (final AwbBundle awbBundle : androidDependencyTree.getAwbBundles()) {
runnables.add(new Runnable() {
@Override
public void run() {
try {
File dataBindingClazzFolder = appVariantOutputContext.getVariantContext().getJAwbavaOutputDir(awbBundle);
String packageName = ManifestFileUtils.getPackage(awbBundle.getOrgManifestFile());
String appName = appVariantContext.getVariantConfiguration().getOriginalApplicationId();
//删除那些已经存在的类
File dataMapperClazz = new File(dataBindingClazzFolder, "android/databinding/DataBinderMapper.class");
if (!dataMapperClazz.exists()) {
throw new GradleException("missing datamapper class");
}
FileInputStream fileInputStream = new FileInputStream(dataMapperClazz);
ClassReader in1 = new ClassReader(fileInputStream);
ClassWriter cw = new ClassWriter(0);
Map<String, String> reMapping = new HashedMap();
reMapping.put(appName.replace(".", "/") + "/BR", packageName.replace(".", "/") + "/BR");
RemappingClassAdapter remappingClassAdapter = new RemappingClassAdapter(cw, new SimpleRemapper(reMapping));
in1.accept(remappingClassAdapter, 8);
ClassReader in2 = new ClassReader(cw.toByteArray());
ClassWriter cw2 = new ClassWriter(0);
Set<String> renames = new HashSet<String>();
renames.add("android/databinding/DataBinderMapper");
in2.accept(new ClassRenamer(cw2, renames, packageName.replace(".", "/") + "/DataBinderMapper"), 8);
File destClass = new File(dataBindingClazzFolder, packageName.replace(".", "/") + "/DataBinderMapper.class");
destClass.getParentFile().mkdirs();
FileOutputStream fileOutputStream = new FileOutputStream(destClass);
fileOutputStream.write(cw2.toByteArray());
IOUtils.closeQuietly(fileOutputStream);
IOUtils.closeQuietly(fileInputStream);
FileUtils.deleteDirectory(new File(dataBindingClazzFolder, "android/databinding"));
FileUtils.deleteDirectory(new File(dataBindingClazzFolder, "com/android/databinding"));
File appDir = new File(dataBindingClazzFolder, appName.replace(".", "/"));
if (appDir.exists()) {
File[] files = appDir.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isFile() && !pathname.isDirectory();
}
});
for (File tmp : files) {
FileUtils.forceDelete(tmp);
}
}
} catch (Throwable e) {
e.printStackTrace();
throw new GradleException("package awb failed");
}
}
});
}
executorServicesHelper.execute(runnables);
}
use of org.gradle.api.tasks.TaskAction in project atlas by alibaba.
the class PrepareAwoBundleTask method doFullTaskAction.
@TaskAction
public void doFullTaskAction() throws IOException {
AwbBundle awbBundle = libVariantContext.getAwbBundle();
prepare(awbBundle.getBundle(), awbBundle.getFolder(), true);
List<SoLibrary> soLibraries = awbBundle.getSoLibraries();
for (final SoLibrary soLibrary : soLibraries) {
prepare(soLibrary.getSoLibFile(), soLibrary.getFolder(), false);
}
List<? extends AndroidLibrary> aarBundles = awbBundle.getLibraryDependencies();
for (final AndroidLibrary libraryDependency : aarBundles) {
if (libraryDependency instanceof AarBundle) {
AarBundle aarBundle = (AarBundle) libraryDependency;
prepare(aarBundle.getBundle(), aarBundle.getFolder(), true);
}
}
}
use of org.gradle.api.tasks.TaskAction in project atlas by alibaba.
the class DexInstallTask method doTask.
@TaskAction
public void doTask() throws IOException, SigningException {
dexFile = getDexFile();
File targetPatch = getKernelSoFile();
ZipOutputStream out = null;
try {
out = new ZipOutputStream(new BufferedOutputStream(new FileOutputStream(targetPatch)));
zip(new File[] { dexFile }, "", out);
} catch (Throwable e) {
throw new RuntimeException(e);
}
if (out != null) {
try {
out.close();
} catch (Throwable e) {
}
}
AwoInstaller.installAwoSo(getBuilder(), targetPatch, getPackageName(), getLogger());
}
use of org.gradle.api.tasks.TaskAction in project atlas by alibaba.
the class TPatchDiffResAPBuildTask method doAction.
@TaskAction
protected void doAction() throws IOException {
manifestFile = getManifestFile();
aaptOptions = getAaptOptions();
diffResDir = getDiffResDir();
resourceConfigs = getResourceConfigs();
preferredDensity = getPreferredDensity();
//TODO minifyManifest
File miniManifest = new File(packageOutputFile.getParentFile(), "AndroidManifest.xml");
try {
ManifestFileUtils.minifyManifest(manifestFile, miniManifest);
} catch (DocumentException e) {
throw new GradleException(e.getMessage());
}
File assetsFolder = new File(diffResDir, "assets");
File resFolder = new File(diffResDir, "res");
if (!assetsFolder.exists()) {
assetsFolder.mkdirs();
}
if (!resFolder.exists()) {
resFolder.mkdirs();
}
AaptPackageProcessBuilder aaptPackageCommandBuilder = new AaptPackageProcessBuilder(miniManifest, aaptOptions).setAssetsFolder(assetsFolder).setResFolder(resFolder).setLibraries(libraries).setPackageForR(packageForR).setResPackageOutput(packageOutputFile.getAbsolutePath()).setType(type).setDebuggable(debuggable).setPseudoLocalesEnabled(pseudoLocalesEnabled).setResourceConfigs(resourceConfigs).setSplits(splits).setPreferredDensity(preferredDensity);
@NonNull AndroidBuilder builder = getBuilder();
MergingLog mergingLog = new MergingLog(mergeBlameLogFolder);
ProcessOutputHandler processOutputHandler = new ParsingProcessOutputHandler(new ToolOutputParser(new AaptOutputParser(), getILogger()), new MergingLogRewriter(mergingLog, builder.getErrorReporter()));
try {
if (builder instanceof AtlasBuilder) {
((AtlasBuilder) builder).processResources(aaptPackageCommandBuilder, enforceUniquePackageName, processOutputHandler);
}
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
} catch (ProcessException e) {
throw new RuntimeException(e);
}
}
use of org.gradle.api.tasks.TaskAction in project atlas by alibaba.
the class TPatchTask method doTPatch.
@TaskAction
public void doTPatch() throws Exception {
patchContext = getPatchContext();
signingConfig = getSigningConfig();
outPatchFolder = getOutPatchFolder();
// 获取容器版本
String baseApkVersion = patchContext.getBaseVersionName();
String newApkVersion = patchContext.versionName;
File baseApk = patchContext.getBaseApk();
File newApk = patchContext.diffApkFile;
boolean retainMainBundleRes = true;
if (null == newApk || !newApk.exists()) {
newApk = patchContext.newApk;
retainMainBundleRes = false;
}
getLogger().info("BaseApk:" + baseApk + ",baseVersion:" + baseApkVersion + ",newApk:" + newApk + ",newApkVersion:" + newApkVersion);
TPatchTool tPatchTool = new TPatchTool(baseApk, newApk, baseApkVersion, newApkVersion, patchContext.diffBundleDex);
tPatchTool.setMainBundleName(patchContext.mainBundleName);
if (StringUtils.isNotBlank(patchContext.excludeFiles)) {
tPatchTool.setNotIncludeFiles(patchContext.excludeFiles.split(","));
}
tPatchTool.setRetainMainBundleRes(retainMainBundleRes);
if (null != patchContext.artifactBundleInfos) {
tPatchTool.setArtifactBundleInfos(patchContext.artifactBundleInfos);
}
tPatchTool.setBaseApkFileList(patchContext.getBaseApkFiles());
tPatchTool.setNewApkFileList(patchContext.getNewApkFiles());
tPatchTool.setLogger(getILogger());
tPatchTool.setOnlyIncludeModifyBundle(patchContext.onlyBuildModifyAwb);
tPatchTool.setNoPatchBundles(patchContext.notPatchBundles);
ApkFileList apkFileList = AtlasBuildContext.finalApkFileList;
try {
tPatchTool.setDexcode(apkFileList.getMainBundle().get("classes.dex"));
FileUtils.writeStringToFile(new File(getOutPatchFolder(), "tpatch-bundles.json"), JSON.toJSONString(patchContext.artifactBundleInfos));
getLogger().info("start to do patch");
tPatchTool.doPatch(outPatchFolder, true, new File(getOutPatchFolder(), "patchs.json"), StringUtils.isNotEmpty(patchContext.tpatchHistoryUrl), patchContext.tpatchHistoryUrl, patchContext.appSignName);
getLogger().info("finish do patch");
File patchJson = new File(getOutPatchFolder(), "patchs.json");
File updateJson = new File(getOutPatchFolder(), "update.json");
String json = FileUtils.readFileToString(patchJson);
BuildPatchInfos patchInfos = JSON.parseObject(json, BuildPatchInfos.class);
UpdateInfo updateInfo = new UpdateInfo(patchInfos);
FileUtils.writeStringToFile(updateJson, JSON.toJSONString(updateInfo, true));
} catch (Exception e) {
e.printStackTrace();
throw new StopExecutionException(e.getMessage());
}
File baseVesrionApk = new File(patchContext.newApk.getParentFile(), patchContext.newApk.getName().replace(".apk", "-" + baseApkVersion + ".apk"));
FileUtils.copyFile(patchContext.getBaseApk(), baseVesrionApk);
if (patchContext.writeBuildInfo && StringUtils.isNotEmpty(patchContext.buildId)) {
File buildFile = new File(getOutPatchFolder(), "build.txt");
FileUtils.writeStringToFile(buildFile, patchContext.buildId + "," + patchContext.versionName + "," + apkFileList.getMainBundle().get("classes.dex"));
if (buildFile != null && buildFile.exists()) {
getLogger().debug("write build to apk!");
BuildHelper.writeFileToApk(buildFile, baseVesrionApk, "assets/build.txt");
}
BuildHelper.reSign(baseVesrionApk, signingConfig);
}
FileUtils.forceDelete(patchContext.newApk);
}
Aggregations