use of com.taobao.android.TPatchTool 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