/* * Tencent is pleased to support the open source community by making Tinker available. * * Copyright (C) 2016 THL A29 Limited, a Tencent company. All rights reserved. * * Licensed under the BSD 3-Clause License (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * * https://opensource.org/licenses/BSD-3-Clause * * Unless required by applicable law or agreed to in writing, software distributed under the License is * distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied. See the License for the specific language governing permissions and * limitations under the License. */ package com.tencent.tinker.loader.shareutil; import com.tencent.tinker.loader.TinkerRuntimeException; import java.util.ArrayList; /** * Created by zhangshaowen on 16/4/11. */ public class ShareDexDiffPatchInfo { public final String rawName; public final String destMd5InDvm; public final String destMd5InArt; public final String oldDexCrC; public final String dexDiffMd5; public final String path; public final String dexMode; public final boolean isJarMode; /** * if it is jar mode, and the name is end of .dex, we should repackage it with zip, with renaming name.dex.jar */ public final String realName; public ShareDexDiffPatchInfo(String name, String path, String destMd5InDvm, String destMd5InArt, String dexDiffMd5, String oldDexCrc, String dexMode) { // TODO Auto-generated constructor stub this.rawName = name; this.path = path; this.destMd5InDvm = destMd5InDvm; this.destMd5InArt = destMd5InArt; this.dexDiffMd5 = dexDiffMd5; this.oldDexCrC = oldDexCrc; this.dexMode = dexMode; if (dexMode.equals(ShareConstants.DEXMODE_JAR)) { this.isJarMode = true; if (SharePatchFileUtil.isRawDexFile(name)) { realName = name + ShareConstants.JAR_SUFFIX; } else { realName = name; } } else if (dexMode.equals(ShareConstants.DEXMODE_RAW)) { this.isJarMode = false; this.realName = name; } else { throw new TinkerRuntimeException("can't recognize dex mode:" + dexMode); } } public static void parseDexDiffPatchInfo(String meta, ArrayList<ShareDexDiffPatchInfo> dexList) { if (meta == null || meta.length() == 0) { return; } String[] lines = meta.split("\n"); for (final String line : lines) { if (line == null || line.length() <= 0) { continue; } final String[] kv = line.split(",", 7); if (kv == null || kv.length < 7) { continue; } // key final String name = kv[0].trim(); final String path = kv[1].trim(); final String destMd5InDvm = kv[2].trim(); final String destMd5InArt = kv[3].trim(); final String dexDiffMd5 = kv[4].trim(); final String oldDexCrc = kv[5].trim(); final String dexMode = kv[6].trim(); ShareDexDiffPatchInfo dexInfo = new ShareDexDiffPatchInfo(name, path, destMd5InDvm, destMd5InArt, dexDiffMd5, oldDexCrc, dexMode); dexList.add(dexInfo); } } public static boolean checkDexDiffPatchInfo(ShareDexDiffPatchInfo info) { if (info == null) { return false; } String name = info.rawName; String md5 = (ShareTinkerInternals.isVmArt() ? info.destMd5InArt : info.destMd5InDvm); if (name == null || name.length() <= 0 || md5 == null || md5.length() != ShareConstants.MD5_LENGTH) { return false; } return true; } @Override public String toString() { StringBuffer sb = new StringBuffer(); sb.append(rawName); sb.append(","); sb.append(path); sb.append(","); sb.append(destMd5InDvm); sb.append(","); sb.append(destMd5InArt); sb.append(","); sb.append(oldDexCrC); sb.append(","); sb.append(dexDiffMd5); sb.append(","); sb.append(dexMode); return sb.toString(); } }