//========================== // apk解包打包逻辑封装 /// <summary> /// 若为apk文件,则先行解包 /// </summary> public static String apkUnpack(String apkFile, Apk2Resource.Cmd.Callback call, bool deletPublicXML = false, string UnpackDestDir = "") { // 若输入的为apk文件,则自动进行解包 if (Apk2Resource.Apktool.isApkFile(apkFile)) { if (call != null) { call("【I】" + Path.GetFileName(apkFile)); } if (call != null) { call("【I】apk解包开始..."); } string dir = Apk2Resource.Apktool.unPackage(apkFile, call, deletPublicXML, UnpackDestDir.Equals(""), UnpackDestDir); // 使用apktool进行apk的解包 if (dir.Contains("【E】")) { return(dir); } if (call != null) { call("【I】apk解包结束!\r\n"); } return(dir); } else { return(apkFile); } }
/// <summary> /// 对给定的所有apk执行自打包修改 /// </summary> public static void Modify(String[] apks, String sign, Apk2Resource.Cmd.Callback call) { int index = 0; foreach (String apk in apks) { if (call != null) { call("【T】" + "-----------------------------------------------------------"); } if (call != null) { call("【T】" + "处理第" + ++index + "个apk,共" + apks.Length + "个"); } if (call != null) { call("【T】" + "-----------------------------------------------------------"); } //// 设置修改后的文件名称 //String Dir = apk.Replace(".apk", ""); //if (batchSign) Apk2Resource.Apktool.outputAPK_name = Dir.Substring(Dir.LastIndexOf("\\") + 1) + "_b.apk"; //else Apk2Resource.Apktool.outputAPK_name = Dir.Substring(Dir.LastIndexOf("\\") + 1) + ".apk"; //unpackPath = apkUnpack(apk, call); // apk解包 // 根据apk路径生成解包路径 string fileName = Path.GetFileNameWithoutExtension(apk).Replace("Ltsdk_", "").Replace("ltsdk_", ""); string path = Path.GetDirectoryName(apk); string UnpackDestDir = path + "\\source配置_" + fileName + "\\combine\\" + fileName; unpackPath = apkUnpack(apk, call, true, UnpackDestDir); // apk解包 //// 获取移动计费apk文件路径 //String chargeApk = getChargeApk(unpackPath, call); //if (chargeApk.Equals("")) continue; //Modify_Process(chargeApk, unpackPath, call); // 执行资源修改逻辑 if (modifyMethod != null) { call("【I】执行修改逻辑..."); modifyMethod(); // 执行指定的处理逻辑 call("【I】执行修改逻辑结束\r\n"); } //String newAPK = apkPackage(unpackPath, sign, call); // apk打包 } }
/// <summary> /// 执行apk打包逻辑 /// </summary> public static String apkPackage(String apkUnPackageDir, String signFileName0, Apk2Resource.Cmd.Callback call) { // 重新打包apk,并签名 if (call != null) { call("【I】apk打包开始..."); } String result0 = Apk2Resource.Apktool.package(apkUnPackageDir, call); // 使用apktool进行打包 if (result0.Contains("【E】")) { return(result0); } if (call != null) { call("【I】apk未签名文件已生成!\r\n"); } String apkNAME = Apk2Resource.Apktool.outputAPK_name; List <String> signs = new List <String>(); if (batchSign) { signs = Signs; } else { signs.Add(signFileName0); } String apkName = apkUnPackageDir + "..apk"; // 生成的未签名apk // 执行批量签名逻辑 foreach (String signFileName in signs) { // 生成新的输出名 int index = apkNAME.LastIndexOf(".apk"); Apk2Resource.Apktool.outputAPK_name = apkNAME.Substring(0, index) + "_" + signFileName + ".apk"; String result = result0; if (batchSign && call != null) { call("【I】批量签名,执行中..."); } // 若有签名文件,则进行签名 if (!signFileName.Equals("")) { if (call != null) { call("【I】apk签名中," + signFileName + "..."); } String pem = SinPath() + "\\" + signFileName + ".x509.pem"; String pk8 = SinPath() + "\\" + signFileName + ".pk8"; String psw = "letang123"; result = Apk2Resource.Apktool.Sign(apkName, pem, pk8, psw, call); if (result.Contains("【E】")) { return(result); } if (call != null) { call("【I】apk签名完成!\r\n"); } //// 删除打包生成的未签名文件 //if (!batchSign && File.Exists(apkName)) File.Delete(apkName); } } if (File.Exists(apkName)) { File.Delete(apkName); // 删除打包生成的未签名文件 } if (call != null) { call("【I】apk打包结束!\r\n"); } // 打包完成后清除缓存中的解包文件 if (call != null) { call("【I】清除缓存目录," + apkUnPackageDir); } Apk2Resource.Apktool.DeletDir(apkUnPackageDir); batchSign = false; return(""); }