diff --git a/config.cfg b/config.cfg index ec44c66..e98e110 100755 --- a/config.cfg +++ b/config.cfg @@ -43,7 +43,10 @@ }, "sdkPath":"D:\\Android_src\\kuku-android-sdk", "csjPackageName":"com.iaalz.tzjyg", - "packageApkTool":"libs/apktool_2.4.1.jar", - "unPackageApkTool":"libs/apktool_2.4.1.jar", - "encryption":true + "packageApkTool":"libs/apktool_2.5.0.jar", + "unPackageApkTool":"libs/apktool_2.5.0.jar", + "encryption":true, + "aapt":"aapt", + "android":" D:\\Android\\Sdk\\platforms\\android-30\\android.jar", + "baksmali":"libs/baksmali.jar" } \ No newline at end of file diff --git a/libs/apktool_2.5.0.jar b/libs/apktool_2.5.0.jar new file mode 100644 index 0000000..a07b3d7 Binary files /dev/null and b/libs/apktool_2.5.0.jar differ diff --git a/libs/baksmali.jar b/libs/baksmali.jar new file mode 100644 index 0000000..fe354fb Binary files /dev/null and b/libs/baksmali.jar differ diff --git a/libs/pinyin4j-2.5.0.jar b/libs/pinyin4j-2.5.0.jar new file mode 100644 index 0000000..e8ede13 Binary files /dev/null and b/libs/pinyin4j-2.5.0.jar differ diff --git a/src/com/qy/ui/SmaliUi.java b/src/com/qy/ui/SmaliUi.java index e3a2990..dbe51e4 100755 --- a/src/com/qy/ui/SmaliUi.java +++ b/src/com/qy/ui/SmaliUi.java @@ -21,6 +21,7 @@ import com.qy.Interfaces.SmaliApkToolsPath; import com.qy.utils.ApkSignTools; import com.qy.utils.SmaliUtils; import com.qy.utils.StringUtils; +import com.qy.utils.Tools; import org.json.JSONObject; public class SmaliUi extends JFrame { @@ -380,6 +381,7 @@ public class SmaliUi extends JFrame { Desktop.getDesktop().open(new File(signTools.getApkFile().getAbsolutePath()+"_sign.apk").getParentFile()); lblInfo.setText("签名完成"); System.out.println("签名完成"); + Tools.exec("adb install "+signTools.getApkFile().getAbsolutePath()+"_sign.apk"); } catch (IOException ioException) { ioException.printStackTrace(); } diff --git a/src/com/qy/utils/HeiHeiTools.java b/src/com/qy/utils/HeiHeiTools.java index 0db9f24..d87dd42 100644 --- a/src/com/qy/utils/HeiHeiTools.java +++ b/src/com/qy/utils/HeiHeiTools.java @@ -1,11 +1,16 @@ package com.qy.utils; +import com.qy.Interfaces.DialogInterface; import com.qy.Interfaces.SmaliApkToolsPath; import com.qy.ui.ApkSignUi; import org.json.JSONObject; import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.Map; import java.util.Vector; public class HeiHeiTools { @@ -13,7 +18,7 @@ public class HeiHeiTools { private File pluginPath; public HeiHeiTools() { - + time = System.currentTimeMillis(); } public void setSdkPlugin(File pluginPath) { @@ -22,6 +27,17 @@ public class HeiHeiTools { public void setApk(File apk) { this.apk = apk; + if(parameterMap!=null&¶meterMap.containsValue("#apk")){ + Tools.getPackageName(apk, new DialogInterface() { + @Override + public void onOut(Object data) { + super.onOut(data); + System.out.println("包名:"+data); + parameterMap.put("#{packageName}",data.toString()); + parameterMap.put("${applicationId}",data.toString()); + } + }); + } } public void start() { @@ -29,6 +45,7 @@ public class HeiHeiTools { utils.unPack(apk.getAbsolutePath(), new SmaliApkToolsPath() { @Override public void smaliPath(String path) { + System.out.println("解包:" + path); copyLibs(new File(path)); } }); @@ -36,19 +53,35 @@ public class HeiHeiTools { private SmaliApkToolsPath packaInter; + private int getSmaliIndex(File smalipath) { + int i = 0; + for (File file : smalipath.listFiles()) { + if (file.getName().startsWith("smali")) { + i++; + } + } + return ++i; + } + private void copyLibs(File smaliPath) { if (!new File(pluginPath.getAbsolutePath() + File.separator + "libs").exists()) { - copyAssets(smaliPath, new File(pluginPath.getAbsolutePath() + File.separator + "assets")); } + //copyAssets(smaliPath, new File(pluginPath.getAbsolutePath() + File.separator + "assets")); + unpackLibs(new File(pluginPath.getAbsolutePath() + File.separator + "libs"), new SmaliApkToolsPath() { @Override public void smaliPath(String path) { + System.out.println("path = " + path); File libs = new File(path); for (File file : libs.listFiles()) { - if (file.isDirectory() && !"original".equals(file.getName())&& !"unknown".equals(file.getName())) { - Tools.copy_dir(file.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + "smali"); + if (file.isDirectory() && file.getName().contains("smali")) { + if(smali_classes) { + Tools.copy_dir(file.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + "smali_classes" + getSmaliIndex(smaliPath)); + }else { + Tools.copy_dir(file.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + "smali"); + } } - if(file.isDirectory()&& "assets".equals(file.getName())){ + if (file.isDirectory() && "assets".equals(file.getName())) { Tools.copy_dir(file.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + "assets"); } @@ -56,21 +89,43 @@ public class HeiHeiTools { packaInter = new SmaliApkToolsPath() { @Override public void smaliPath(String path) { + XMLTools.setParameter(parameterMap); XMLTools.mergeManifestXML(new File(smaliPath.getAbsolutePath() + File.separator + "AndroidManifest.xml"), new File(pluginPath.getAbsolutePath() + File.separator + "AndroidManifest.xml"), new File(smaliPath.getAbsolutePath() + File.separator + "AndroidManifest.xml")); + File icon = new File(pluginPath.getAbsolutePath() + File.separator + iconName); + File splash_h=new File(pluginPath.getAbsolutePath() + File.separator +"ll_init_logo_h.png"); + File splash_p=new File(pluginPath.getAbsolutePath() + File.separator +"ll_init_logo_p.png"); + if (icon.exists()||splash_h.exists()||splash_p.exists()) { + File appSrc = new File(smaliPath.getAbsolutePath() + File.separator + "res"); + for (File file : appSrc.listFiles()) { + if (file.getName().contains("drawable") || file.getName().contains("mipmap")) { + if (icon.exists()&&new File(file.getAbsolutePath() + File.separator + iconName).exists()) { + Tools.copyFile(icon.getAbsolutePath(), file.getAbsolutePath(), true); + } + if(splash_h.exists()&&new File(file.getAbsolutePath() + File.separator + "ll_init_logo_h.png").exists()){ + Tools.copyFile(splash_h.getAbsolutePath(), file.getAbsolutePath(), true); + } + if(splash_p.exists()&&new File(file.getAbsolutePath() + File.separator + "ll_init_logo_p.png").exists()){ + Tools.copyFile(splash_p.getAbsolutePath(), file.getAbsolutePath(), true); + } + } + } + } SmaliUtils utils = new SmaliUtils(); - utils.bale(smaliPath.getAbsolutePath(), smaliPath.getAbsolutePath()+File.separator+"game.apk", new SmaliApkToolsPath() { + if(isOutR) + utils.outR(smaliPath.getAbsolutePath()); + utils.bale(smaliPath.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + appPackageName, new SmaliApkToolsPath() { @Override public void smaliPath(String path) { - LinkedHashMap keyMap= ApkSignUi.loadKeys(); + LinkedHashMap keyMap = ApkSignUi.loadKeys(); Vector adbList = new Vector(keyMap.keySet()); - String key=adbList.get(1); - String tmp=keyMap.get(key); - System.out.println("选择签名:"+key); - JSONObject json=new JSONObject(tmp); - ApkSignTools tools=new ApkSignTools(); + String key = adbList.get(1); + String tmp = keyMap.get(key); + System.out.println("选择签名:" + key); + JSONObject json = new JSONObject(tmp); + ApkSignTools tools = new ApkSignTools(); tools.setSignFile(new File(json.getString("file"))); tools.setApkFile(new File(path)); tools.setKeyStorePassword(json.getString("alias_password")); @@ -79,6 +134,23 @@ public class HeiHeiTools { System.out.println("开始签名"); tools.sign(); System.out.println("打包完成:" + path); + System.out.println("耗时:" + (System.currentTimeMillis() - time) / 1000 + "s"); + try { + String exec = "adb install " + path.replace(appPackageName, appPackageName + "_sign.apk"); + System.out.println("exec = " + exec); + Process process = Runtime.getRuntime().exec(exec); + InputStream inputStream = process.getInputStream(); + StringBuilder builder = new StringBuilder(); + int len; + byte[] bytes = new byte[1024]; + while ((len = inputStream.read(bytes)) != -1) { + builder.append(new String(bytes, 0, len)); + } + inputStream.close(); + System.out.println(builder.toString()); + } catch (IOException e) { + e.printStackTrace(); + } } }); } @@ -95,7 +167,10 @@ public class HeiHeiTools { private void copyJniLibs(File smaliPath, File jniLibs) { File libs = new File(smaliPath.getAbsolutePath() + File.separator + "lib"); - if(libs.exists()) { + if (!libs.exists()) { + libs.mkdirs(); + } + if (libs.exists()) { for (File file : libs.listFiles()) { Tools.copy_dir(jniLibs.getAbsolutePath() + File.separator + file.getName(), file.getAbsolutePath()); } @@ -104,7 +179,8 @@ public class HeiHeiTools { } private void copyRes(File smaliPath, File res) { - Tools.copy_dir(res.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + "res"); + //Tools.copy_dir(res.getAbsolutePath(), smaliPath.getAbsolutePath() + File.separator + "res"); + XMLTools.copyResDir(res, new File(smaliPath.getAbsolutePath() + File.separator + "res")); copyCode(smaliPath, new File(pluginPath.getAbsolutePath() + File.separator + "code")); } @@ -138,8 +214,8 @@ public class HeiHeiTools { private static void unpackLibs(File libs, SmaliApkToolsPath smaliApkToolsPath) { String dx = Tools.loadConfig(new File("config.cfg")).getString("dx"); - if (new File("tmp" + File.separator + "dex").exists()) { - Tools.deleteFiles(new File("tmp" + File.separator + "dex").getAbsolutePath()); + if (new File("tmp" + File.separator + "dxs").exists()) { + Tools.deleteFiles(new File("tmp" + File.separator + "dxs").getAbsolutePath()); } if (new File("tmp" + File.separator + "dx_smali").exists()) { Tools.deleteFiles(new File("tmp" + File.separator + "dx_smali").getAbsolutePath()); @@ -166,17 +242,59 @@ public class HeiHeiTools { } } + long time; + private static String iconName = "app_icon.png"; + private static String appPackageName = "game.apk"; + private static boolean isOutR=true; + private static boolean smali_classes=true; + private static Map parameterMap; public static void main(String[] args) { - /* HeiHeiTools tools = new HeiHeiTools(); - tools.setApk(new File("D:\\ieda\\android_sdk_tools\\天命传说(嘿嘿游戏专服)_嘿嘿游戏_8.1.4_202106070951.apk")); - tools.setSdkPlugin(new File("D:\\ieda\\android_sdk_tools\\sdk_plugin\\zssdk")); + int status = 1; + String packageName = "com.game.test"; + packageName = "com.rydts.heihei.m01"; + if (status == 0) { + parameterMap = new HashMap<>(); + parameterMap.put("${applicationId}", packageName); + parameterMap.put("#{packageName}",packageName); + HeiHeiTools tools = new HeiHeiTools(); + tools.setApk(new File("D:\\ieda\\android_sdk_tools\\幻想圣域-母包.apk")); + tools.setSdkPlugin(new File("D:\\ieda\\android_sdk_tools\\sdk_plugin\\mumayi")); + tools.start(); + Tools.getPackageName(tools.apk, new DialogInterface() { + @Override + public void onOut(Object data) { + super.onOut(data); + System.out.println("APK包名 = "+data); + } + }); + } else if (status == 1) { + parameterMap=new HashMap<>(); + parameterMap.put("${applicationId}",packageName); + parameterMap.put("#{packageName}",packageName); + HeiHeiTools tools = new HeiHeiTools(); + File file = new File("D:\\ieda\\android_sdk_tools\\热血神剑-创优.apk"); + appPackageName = file.getName(); + tools.setApk(file); + tools.setSdkPlugin(new File("D:\\ieda\\android_sdk_tools\\sdk_plugin\\chuangyou")); + tools.start(); + } else if (status == 2) { + unpackLibs(new File("D:\\ieda\\android_sdk_tools\\libs\\tmp"), new SmaliApkToolsPath() { + @Override + public void smaliPath(String path) { + System.out.println("over = " + path); + } + }); + } + + /* tools.setApk(new File("D:\\ieda\\android_sdk_tools\\九州八荒录-朋克.apk")); + tools.setSdkPlugin(new File("D:\\ieda\\android_sdk_tools\\sdk_plugin\\pengke")); tools.start();*/ - unpackLibs(new File("D:\\ieda\\android_sdk_tools\\sdk_plugin\\69you\\libs"), new SmaliApkToolsPath() { + /* unpackLibs(new File("D:\\ieda\\android_sdk_tools\\libs\\tmp"), new SmaliApkToolsPath() { @Override public void smaliPath(String path) { System.out.println("over = "+path); } - }); + });*/ } } diff --git a/src/com/qy/utils/SmaliUtils.java b/src/com/qy/utils/SmaliUtils.java index 4d2e12a..23bfdbf 100755 --- a/src/com/qy/utils/SmaliUtils.java +++ b/src/com/qy/utils/SmaliUtils.java @@ -27,29 +27,29 @@ public class SmaliUtils { public static void main(String[] args) { - new SmaliUtils(); + new SmaliUtils().outR("D:\\ieda\\android_sdk_tools\\HUANXIANGSHENGYU-MUBAO"); } public SmaliUtils() { clazzList = new HashMap<>(); try { - JSONObject json =Tools.loadConfig(new File("config.cfg")); - if(package_apktool ==null){ - String path="libs/apktool_2.4.1.jar"; - if(json!=null){ - path=json.optString("packageApkTool","libs/apktool_2.4.1.jar"); + JSONObject json = Tools.loadConfig(new File("config.cfg")); + if (package_apktool == null) { + String path = "libs/apktool_2.4.1.jar"; + if (json != null) { + path = json.optString("packageApkTool", "libs/apktool_2.4.1.jar"); } System.out.println(path); - package_apktool =new URLClassLoader(new URL[]{new URL("file:"+path)}); + package_apktool = new URLClassLoader(new URL[]{new URL("file:" + path)}); } - if(un_apktool ==null){ - String path="libs/apktool_2.4.1.jar"; - if(json!=null){ - path=json.optString("unPackageApkTool","libs/apktool_2.4.1.jar"); + if (un_apktool == null) { + String path = "libs/apktool_2.4.1.jar"; + if (json != null) { + path = json.optString("unPackageApkTool", "libs/apktool_2.4.1.jar"); } - un_apktool =new URLClassLoader(new URL[]{new URL("file:"+path)}); + un_apktool = new URLClassLoader(new URL[]{new URL("file:" + path)}); } - }catch (Exception e){ + } catch (Exception e) { e.printStackTrace(); System.exit(0); } @@ -226,14 +226,23 @@ public class SmaliUtils { private boolean isEncryption = true; public void unPack(String jarPath, SmaliApkToolsPath smaliApkToolsPath) { - File path = new File(jarPath + ".out"); + File apk = new File(jarPath); + File path; + boolean isReName = false; + if (Tools.isContainChinese(apk.getName())) { + File tmp = new File(Tools.getPingYin(apk.getName())); + new File(jarPath).renameTo(tmp); + jarPath = tmp.getAbsolutePath(); + isReName = true; + } + path = new File(jarPath + ".out"); if (path.exists() && path.isDirectory()) { Tools.deleteFiles(path.getAbsolutePath()); } String[] args = new String[]{"d", "-f", jarPath}; - JSONObject json=Tools.loadConfig(new File("config.cfg")); - if(json!=null){ - isEncryption=json.optBoolean("encryption",false); + JSONObject json = Tools.loadConfig(new File("config.cfg")); + if (json != null) { + isEncryption = json.optBoolean("encryption", false); } if (isEncryption) { args = new String[]{"d", "-f", jarPath, "--only-main-classes"}; @@ -244,7 +253,10 @@ public class SmaliUtils { } System.out.println("\n"); //Main.main(args); - un_apktool.loadClass("brut.apktool.Main").getMethod("main",String[].class).invoke(null,new Object[]{args}); + un_apktool.loadClass("brut.apktool.Main").getMethod("main", String[].class).invoke(null, new Object[]{args}); + if (isReName) + new File(jarPath).renameTo(apk); + // System.out.println(jarPath+" 重命名 "+path.getAbsolutePath()); File jarFile = new File(jarPath); String name; if (jarFile.getName().contains(".jar")) { @@ -252,7 +264,7 @@ public class SmaliUtils { } else if (jarFile.getName().contains(".apk")) { name = jarFile.getName().replace(".apk", ""); } else { - name = jarFile.getName(); + name = path.getName(); } //jarFile.delete(); smaliApkToolsPath.smaliPath(new File("").getAbsolutePath() + File.separator + name); @@ -263,28 +275,29 @@ public class SmaliUtils { } public void bale(String path, String smaliPath) { - run=false; - packageError=false; + run = false; + packageError = false; bale(path, smaliPath, null); } public boolean run = false; - public static StringBuffer error=new StringBuffer(); + public static StringBuffer error = new StringBuffer(); + public void bale(String smaliPath, String path, SmaliApkToolsPath inter) { - String[] args = new String[]{"-r","b", "-f", smaliPath, "-o", path}; + String[] args = new String[]{"-r", "b", "-f", smaliPath, "-o", path}; for (String string : args) { System.err.print(string + " "); } try { run = true; - error=new StringBuffer(); + error = new StringBuffer(); new Thread(new Runnable() { @Override public void run() { try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); PrintStream printStream = new PrintStream(outputStream); - PrintStream old=System.err; + PrintStream old = System.err; System.setErr(printStream); while (run) { byte[] bs = outputStream.toByteArray(); @@ -304,7 +317,7 @@ public class SmaliUtils { System.setSecurityManager(new NoExitSecurityManager()); //Main.main(args); - package_apktool.loadClass("brut.apktool.Main").getMethod("main",String[].class).invoke(null,new Object[]{args}); + package_apktool.loadClass("brut.apktool.Main").getMethod("main", String[].class).invoke(null, new Object[]{args}); if (inter != null) { inter.smaliPath(path); } @@ -333,7 +346,9 @@ public class SmaliUtils { public void setFilter(List list) { this.list = list; } - public static boolean packageError=false; + + public static boolean packageError = false; + public static class NoExitSecurityManager extends SecurityManager { public NoExitSecurityManager() { @@ -359,10 +374,60 @@ public class SmaliUtils { private static class ExitException extends SecurityException { public ExitException(int status) { System.out.println("print exit :" + status); - if(error.length()>0){ - packageError=true; - new TextToDialog("打包异常",error.toString()); + if (error.length() > 0) { + packageError = true; + new TextToDialog("打包异常", error.toString()); } } } + + public void outR(String smaliPath){ + try { + File r=new File(smaliPath+File.separator+"R"); + r.mkdirs(); + File out=new File(smaliPath+File.separator+"out"); + out.mkdirs(); + JSONObject config= Tools.loadConfig(new File("config.cfg")); + String aapt=config.getString("aapt"); + String android=config.getString("android"); + String dx=config.getString("dx"); + String baksmali=config.getString("baksmali"); + Tools.exec(aapt+" p -m -J "+r.getAbsolutePath()+" -S "+smaliPath+File.separator+"res -M "+smaliPath+File.separator+"AndroidManifest.xml -I "+android); + File rjava=getR(r); + Tools.exec("javac "+rjava.getAbsolutePath()); + rjava.delete(); + Tools.toZip(r.listFiles()[0].getAbsolutePath(),new File(smaliPath+File.separator+"R"+File.separator+"classes.zip"),true,true); + Tools.exec("java -jar "+new File(dx).getAbsolutePath()+" --dex --output="+smaliPath+File.separator+"R"+File.separator+"classes.dex "+smaliPath+File.separator+"R"+File.separator+"classes.zip"); + Tools.exec("java -jar "+new File(baksmali).getAbsolutePath()+" -o "+out.getAbsolutePath()+" "+smaliPath+File.separator+"R"+File.separator+"classes.dex"); + File smalis=new File(smaliPath+File.separator+"smali"); + + /*for (File file : smalis.listFiles()) { + if(file.getName().startsWith("smali")){ + File tr=getR(out); + if(tr==null) + tr=new File(smaliPath); + System.out.println("搜索:"+new File(file.getAbsolutePath()+File.separator+tr.getAbsolutePath().replace(smaliPath+File.separator+"out",""))); + if(new File(file.getAbsolutePath()+File.separator+tr.getAbsolutePath().replace(smaliPath+File.separator+"out","")).exists()){ + System.out.println("找到R文件:"+new File(file.getAbsolutePath()+File.separator+getR(out).getAbsolutePath().replace(smaliPath+File.separator+"out","")).getAbsolutePath()); + Tools.copy_dir(out.getAbsolutePath(),file.getAbsolutePath()); + } + } + }*/ + Tools.copy_dir(out.getAbsolutePath(),smalis.getAbsolutePath()); + + }catch (Exception e){ + e.printStackTrace(); + } + + } + private File getR(File dir){ + if(dir.isFile()){ + return dir; + }else{ + for (File file : dir.listFiles()) { + return getR(file); + } + } + return null; + } } diff --git a/src/com/qy/utils/Tools.java b/src/com/qy/utils/Tools.java index 1cf7f14..80fc37d 100755 --- a/src/com/qy/utils/Tools.java +++ b/src/com/qy/utils/Tools.java @@ -5,13 +5,22 @@ import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; import java.rmi.server.ExportException; +import java.util.Arrays; import java.util.Random; import java.util.jar.JarOutputStream; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import java.util.zip.CRC32; import java.util.zip.CheckedInputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import com.qy.Interfaces.DialogInterface; +import net.sourceforge.pinyin4j.PinyinHelper; +import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; +import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; import org.json.JSONArray; import org.json.JSONObject; @@ -19,407 +28,501 @@ import static java.util.zip.ZipEntry.STORED; public class Tools { - public static boolean stringIsNull(String string) { - if (string == null || string.length() == 0) { - return true; - } - return false; - } + public static boolean stringIsNull(String string) { + if (string == null || string.length() == 0) { + return true; + } + return false; + } - public static String getRandomString(int length) { - String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; - Random random = new Random(); - StringBuffer sb = new StringBuffer(); - for (int i = 0; i < length; i++) { - int number = random.nextInt(str.length()); - sb.append(str.charAt(number)); - } - return sb.toString(); - } - public static int getRandomInt(int min,int max) { - int i=new Random().nextInt(max); - if(i "+destFileName); - return false; - } else if (!srcFile.isFile()) { - System.err.println("源文件是目录:"+srcFile.getAbsolutePath()); - return false; - } + public static String getRandomString(int length) { + String str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + int number = random.nextInt(str.length()); + sb.append(str.charAt(number)); + } + return sb.toString(); + } - // 判断目标文件是否存在 - File destFile = new File(destFileName); - // 如果目标文件所在目录不存在,则创建目录 - if (!destFile.exists()) { - // 目标文件所在目录不存在 - if (!destFile.mkdirs()) { - // 复制文件失败:创建目标文件所在目录失败 - System.err.println("创建文件夹失败:"+destFile.getAbsolutePath()); - return false; - } + public static int getRandomInt(int min, int max) { + int i = new Random().nextInt(max); + if (i < min) { + return getRandomInt(min, max); + } + return i; + } - }else{ - if(srcFileName.equals("Activity.smali")){ - System.out.println("文件夹已存在:"+destFileName); - } - } + public static void deleteFiles(String path) { + File files = new File(path); + if (files.exists()) { + if (files.isDirectory()) { + for (File file : files.listFiles()) { + deleteFiles(file.getAbsolutePath()); + } + } + // System.out.println("删除文件 "+files.getAbsolutePath()); + files.delete(); + } + } - // 复制文件 - int byteread = 0; // 读取的字节数 - InputStream in = null; - OutputStream out = null; + public static boolean copyFileToName(String srcFileName, String destFileName, String fileName, boolean overlay) { + File srcFile = new File(srcFileName); + // 判断源文件是否存在 + if (!srcFile.exists()) { + System.err.println("源文件不存在:" + srcFile.getAbsolutePath() + " > " + destFileName); + return false; + } else if (!srcFile.isFile()) { + System.err.println("源文件是目录:" + srcFile.getAbsolutePath()); + return false; + } - try { - if(fileName==null) { - fileName=srcFile.getName(); - } - in = new FileInputStream(srcFile); - out = new FileOutputStream(destFile + File.separator +fileName ); - byte[] buffer = new byte[1024]; + // 判断目标文件是否存在 + File destFile = new File(destFileName); + // 如果目标文件所在目录不存在,则创建目录 + if (!destFile.exists()) { + // 目标文件所在目录不存在 + if (!destFile.mkdirs()) { + // 复制文件失败:创建目标文件所在目录失败 + System.err.println("创建文件夹失败:" + destFile.getAbsolutePath()); + return false; + } - while ((byteread = in.read(buffer)) != -1) { - out.write(buffer, 0, byteread); - } - out.close(); - in.close(); - return true; - } catch (FileNotFoundException e) { - e.printStackTrace(); - return false; - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } - /** - * 复制单个文件 - * - * @param srcFileName 待复制的文件名 - * @param destFileName 目标文件名 - * @param overlay 如果目标文件存在,是否覆盖 - * @return 如果复制成功返回true,否则返回false - */ - public static boolean copyFile(String srcFileName, String destFileName, - boolean overlay) { - if(new File(srcFileName).isDirectory()){ - return copyDir(srcFileName,destFileName); - }else { - return copyFileToName(srcFileName, destFileName, null, overlay); - } - } - public static void copy_dir(String src,String desc){ - try { - //System.out.println("拷贝文件:"+src+" -> "+desc); - File dirSrc=new File(src); - if(!dirSrc.exists()){ - return; - } - for (File file : dirSrc.listFiles()) { - if(file.isDirectory()){ - new File(desc+File.separator+file.getName()).mkdirs(); - copy_dir(file.getAbsolutePath(),desc+File.separator+file.getName()); - }else{ - copyFile(file.getAbsolutePath(),desc,true); - } - } - }catch (Exception e){ - e.printStackTrace(); - } + } else { + if (srcFileName.equals("Activity.smali")) { + System.out.println("文件夹已存在:" + destFileName); + } + } - } - private static boolean copyDir(String dir,String dest){ - try{ - //System.out.println("复制文件"+dir+"到"+dest); - File src=new File(dir); - File destFile=new File(dest); - String path=""; - int index; - String ta,tb; - if(dir.length()>dest.length()){ - index=dir.length(); - ta=dir; - tb=dest; - }else{ - index=dest.length(); - ta=dest; - tb=dir; - } - for (int i = 0; i < index; i++) { - if(tb.length()>(i+1)&&ta.substring(i,i+1).equals(tb.substring(i,i+1))){ - path+=ta.substring(i,i+1); - }else { - break; - } - } - if(!destFile.exists()){ - destFile.mkdirs(); - } - for (File file : src.listFiles()) { - if(file.isDirectory()){ - copyDir(file.getAbsolutePath(),dest); - }else{ - String tmp=file.getAbsolutePath().replace(file.getName(),"").replace(new File("input"+File.separator+"Documents"+File.separator+"copy"+File.separator).getAbsolutePath(),""); - System.out.println(file.getAbsolutePath()+" "+tmp); - File out=new File(dest+tmp); - if(!out.exists()){ - out.mkdirs(); - } - copyFile(file.getAbsolutePath(),out.getAbsolutePath(),true); - } - } - }catch (Exception e){ - e.printStackTrace(); - return false; - } - return true; - } - public static void saveConfig(File file,String data){ - if(!file.exists()){ - try { - if(!file.createNewFile()){ - return; - } - } catch (IOException e) { - e.printStackTrace(); - } - } - try { - OutputStream outputStream=new FileOutputStream(file); - outputStream.write(new String(data.getBytes(),StandardCharsets.UTF_8).getBytes()); - outputStream.flush(); - outputStream.close(); - } catch (Exception e) { - e.printStackTrace(); - } + // 复制文件 + int byteread = 0; // 读取的字节数 + InputStream in = null; + OutputStream out = null; - } - public static JSONObject loadConfig(File file) { - JSONObject json = null; - BufferedReader reader; - if (!file.exists()) { - try { - file.createNewFile(); - } catch (IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } else { - String tmp, str = ""; - try { - reader = new BufferedReader( new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)); - while ((tmp = reader.readLine()) != null) { - str += tmp; - } - reader.close(); - json = new JSONObject(str); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - System.out.println(str); - } - } - return json; - } + try { + if (fileName == null) { + fileName = srcFile.getName(); + } + in = new FileInputStream(srcFile); + out = new FileOutputStream(destFile + File.separator + fileName); + byte[] buffer = new byte[1024]; - public static void toZip(String srcDir, File file, boolean KeepDirStructure,boolean zipRootName) throws RuntimeException { + while ((byteread = in.read(buffer)) != -1) { + out.write(buffer, 0, byteread); + } + out.close(); + in.close(); + return true; + } catch (FileNotFoundException e) { + e.printStackTrace(); + return false; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } - long start = System.currentTimeMillis(); - ZipOutputStream zos = null; - try { - zos = new ZipOutputStream(new FileOutputStream(file)); - File sourceFile = new File(srcDir); - compress(sourceFile, zos,file.getName(), sourceFile.getName(), KeepDirStructure,zipRootName); - long end = System.currentTimeMillis(); - System.out.println("压缩完成,耗时:" + (end - start) + " ms"); - } catch (Exception e) { - throw new RuntimeException("zip error from ZipUtils", e); - } finally { - if (zos != null) { - try { - zos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } + /** + * 复制单个文件 + * + * @param srcFileName 待复制的文件名 + * @param destFileName 目标文件名 + * @param overlay 如果目标文件存在,是否覆盖 + * @return 如果复制成功返回true,否则返回false + */ + public static boolean copyFile(String srcFileName, String destFileName, + boolean overlay) { + if (new File(srcFileName).isDirectory()) { + return copyDir(srcFileName, destFileName); + } else { + return copyFileToName(srcFileName, destFileName, null, overlay); + } + } - } - private static void compress(File sourceFile, ZipOutputStream zos,String zipName, String name, boolean KeepDirStructure,boolean zipRootName) - throws Exception { - byte[] buf = new byte[ 2 * 1024]; + public static void copy_dir(String src, String desc) { + try { + //System.out.println("拷贝文件:"+src+" -> "+desc); + File dirSrc = new File(src); + if (!dirSrc.exists()) { + return; + } + for (File file : dirSrc.listFiles()) { + if (file.isDirectory()) { + new File(desc + File.separator + file.getName()).mkdirs(); + copy_dir(file.getAbsolutePath(), desc + File.separator + file.getName()); + } else { + copyFile(file.getAbsolutePath(), desc, true); + } + } + } catch (Exception e) { + e.printStackTrace(); + } - if (sourceFile.isFile()) { - if(sourceFile.getName().equals(zipName)){ - return; - } - // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字 - ZipEntry entry=new ZipEntry(name); + } + + private static boolean copyDir(String dir, String dest) { + try { + //System.out.println("复制文件"+dir+"到"+dest); + File src = new File(dir); + File destFile = new File(dest); + String path = ""; + int index; + String ta, tb; + if (dir.length() > dest.length()) { + index = dir.length(); + ta = dir; + tb = dest; + } else { + index = dest.length(); + ta = dest; + tb = dir; + } + for (int i = 0; i < index; i++) { + if (tb.length() > (i + 1) && ta.substring(i, i + 1).equals(tb.substring(i, i + 1))) { + path += ta.substring(i, i + 1); + } else { + break; + } + } + if (!destFile.exists()) { + destFile.mkdirs(); + } + for (File file : src.listFiles()) { + if (file.isDirectory()) { + copyDir(file.getAbsolutePath(), dest); + } else { + String tmp = file.getAbsolutePath().replace(file.getName(), "").replace(new File("input" + File.separator + "Documents" + File.separator + "copy" + File.separator).getAbsolutePath(), ""); + System.out.println(file.getAbsolutePath() + " " + tmp); + File out = new File(dest + tmp); + if (!out.exists()) { + out.mkdirs(); + } + copyFile(file.getAbsolutePath(), out.getAbsolutePath(), true); + } + } + } catch (Exception e) { + e.printStackTrace(); + return false; + } + return true; + } + + public static void saveConfig(File file, String data) { + if (!file.exists()) { + try { + if (!file.createNewFile()) { + return; + } + } catch (IOException e) { + e.printStackTrace(); + } + } + try { + OutputStream outputStream = new FileOutputStream(file); + outputStream.write(new String(data.getBytes(), StandardCharsets.UTF_8).getBytes()); + outputStream.flush(); + outputStream.close(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public static JSONObject loadConfig(File file) { + JSONObject json = null; + BufferedReader reader; + if (!file.exists()) { + try { + file.createNewFile(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } else { + String tmp, str = ""; + try { + reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), StandardCharsets.UTF_8)); + while ((tmp = reader.readLine()) != null) { + str += tmp; + } + reader.close(); + json = new JSONObject(str); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + System.out.println(str); + } + } + return json; + } + + public static void toZip(String srcDir, File file, boolean KeepDirStructure, boolean zipRootName) throws RuntimeException { + + long start = System.currentTimeMillis(); + ZipOutputStream zos = null; + try { + zos = new ZipOutputStream(new FileOutputStream(file)); + File sourceFile = new File(srcDir); + compress(sourceFile, zos, file.getName(), sourceFile.getName(), KeepDirStructure, zipRootName); + long end = System.currentTimeMillis(); + System.out.println("压缩完成,耗时:" + (end - start) + " ms"); + } catch (Exception e) { + throw new RuntimeException("zip error from ZipUtils", e); + } finally { + if (zos != null) { + try { + zos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + } + + private static void compress(File sourceFile, ZipOutputStream zos, String zipName, String name, boolean KeepDirStructure, boolean zipRootName) + throws Exception { + byte[] buf = new byte[2 * 1024]; + + if (sourceFile.isFile()) { + if (sourceFile.getName().equals(zipName)) { + return; + } + // 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字 + ZipEntry entry = new ZipEntry(name); /*entry.setMethod(STORED); entry.setSize(sourceFile.length()); long crc=0; crc=calFileCRC32(sourceFile); entry.setCrc(crc);*/ - zos.putNextEntry(entry); - // copy文件到zip输出流中 - int len; - FileInputStream in = new FileInputStream(sourceFile); - while ((len = in.read(buf)) != -1) { - zos.write(buf, 0, len); - } - // Complete the entry - zos.closeEntry(); - in.close(); - } else { - File[] listFiles = sourceFile.listFiles(); - if (listFiles == null || listFiles.length == 0) { - // 需要保留原来的文件结构时,需要对空文件夹进行处理 - if (KeepDirStructure) { - // 空文件夹的处理 - ZipEntry entry=new ZipEntry(name + File.separator); - zos.putNextEntry(entry); - // 没有文件,不需要文件的copy - zos.closeEntry(); - } + zos.putNextEntry(entry); + // copy文件到zip输出流中 + int len; + FileInputStream in = new FileInputStream(sourceFile); + while ((len = in.read(buf)) != -1) { + zos.write(buf, 0, len); + } + // Complete the entry + zos.closeEntry(); + in.close(); + } else { + File[] listFiles = sourceFile.listFiles(); + if (listFiles == null || listFiles.length == 0) { + // 需要保留原来的文件结构时,需要对空文件夹进行处理 + if (KeepDirStructure) { + // 空文件夹的处理 + ZipEntry entry = new ZipEntry(name + File.separator); + zos.putNextEntry(entry); + // 没有文件,不需要文件的copy + zos.closeEntry(); + } - } else { - for (File file : listFiles) { - // 判断是否需要保留原来的文件结构 - if (KeepDirStructure) { - // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠, - // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了 - if(zipRootName) { - compress(file, zos, zipName,name + File.separator + file.getName(), KeepDirStructure,zipRootName); - }else{ - if(name.startsWith("\\")){ - compress(file, zos, zipName,name + File.separator + file.getName(), KeepDirStructure,zipRootName); - }else { - compress(file, zos,zipName, File.separator + file.getName(), KeepDirStructure, zipRootName); - } - } - } else { - compress(file, zos, zipName,file.getName(), KeepDirStructure,zipRootName); - } + } else { + for (File file : listFiles) { + // 判断是否需要保留原来的文件结构 + if (KeepDirStructure) { + // 注意:file.getName()前面需要带上父文件夹的名字加一斜杠, + // 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了 + if (zipRootName) { + compress(file, zos, zipName, name + File.separator + file.getName(), KeepDirStructure, zipRootName); + } else { + if (name.startsWith("\\")) { + compress(file, zos, zipName, name + File.separator + file.getName(), KeepDirStructure, zipRootName); + } else { + compress(file, zos, zipName, File.separator + file.getName(), KeepDirStructure, zipRootName); + } + } + } else { + compress(file, zos, zipName, file.getName(), KeepDirStructure, zipRootName); + } - } - } - } - } - public static long calFileCRC32(File file) throws IOException { - FileInputStream fi = new FileInputStream(file); - CheckedInputStream checksum = new CheckedInputStream(fi, new CRC32()); - while (checksum.read() != -1) { } - long temp = checksum.getChecksum().getValue(); - fi.close(); - checksum.close(); - return temp; - } - public static void toAJar(String dx,String inName,String outName) { + } + } + } + } - try { - File file=new File(outName); - if(file.exists()) { - file.delete(); - } - String exec="java -jar "+dx+" --dex --output="+outName+" "+inName+""; - System.out.println("java to dex:"+exec); - Process process=Runtime.getRuntime().exec(exec); - BufferedReader reader=new BufferedReader(new InputStreamReader(process.getErrorStream())); - System.out.println("read"); - String tmp=reader.readLine(); - while (tmp!=null){ - System.out.println(tmp); - tmp=reader.readLine(); - } - process.waitFor(); - System.out.println("打包完成"); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - } - } - public static void outError(InputStream inputStream){ - try { - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - String tmp; - while ((tmp = reader.readLine()) != null) { - System.out.println(tmp); - } - reader.close(); - }catch (Exception e){ - e.printStackTrace(); - } - } - public static boolean isWindowsRuntime(){ - System.out.println(System.getProperties().getProperty("os.name")); - return System.getProperties().getProperty("os.name").toLowerCase().contains("windows"); - } + public static long calFileCRC32(File file) throws IOException { + FileInputStream fi = new FileInputStream(file); + CheckedInputStream checksum = new CheckedInputStream(fi, new CRC32()); + while (checksum.read() != -1) { + } + long temp = checksum.getChecksum().getValue(); + fi.close(); + checksum.close(); + return temp; + } - public static String readFile(File manifest) { - String tmp; - StringBuilder str = new StringBuilder(); - try { - BufferedReader reader = new BufferedReader( new InputStreamReader(new FileInputStream(manifest), StandardCharsets.UTF_8)); - while ((tmp = reader.readLine()) != null) { - str.append(tmp); - } - reader.close(); - } catch (Exception e) { - // TODO Auto-generated catch block - e.printStackTrace(); - System.out.println(str); - } - return str.toString(); - } + public static void toAJar(String dx, String inName, String outName) { - public static void main(String[] args) throws Exception { - String url="http://192.168.137.1:8000/nas/music/favorite/add.do"; - String body="{\"md5s\":[\"4fec7b325eb3795ef8241dabcbc14a5f\",\"febbf27e0d558a2ab69ee814a6bdebfb\",\"86a2fa76cc0e6919f9869324c3b61ba3\"],\"fid\":-1,\"token\":\"PlVodzYhvxRQbOHKakpKs2dvnoc43Cnk\"}"; - JSONObject json=new JSONObject(); - json.put("fileName","C:\\\\Users\\\\admin\\\\Music\\\\英雄联盟 - 涅槃 (Phoenix).flac"); - String tmp; - StringBuilder str=new StringBuilder(); - HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); - connection.setRequestMethod("POST"); - connection.addRequestProperty("content-type","application/json"); - connection.addRequestProperty("charset","UTF-8"); - connection.setDoOutput(true); - connection.setDoInput(true); - connection.setConnectTimeout(5 * 1000); - connection.setReadTimeout(10 * 1000); - OutputStream outputStream = connection.getOutputStream(); + try { + File file = new File(outName); + if (file.exists()) { + file.delete(); + } + String exec = "java -jar " + dx + " --dex --output=" + outName + " " + inName + ""; + System.out.println("java to dex:" + exec); + Process process = Runtime.getRuntime().exec(exec); + BufferedReader reader = new BufferedReader(new InputStreamReader(process.getErrorStream())); + System.out.println("read"); + String tmp = reader.readLine(); + while (tmp != null) { + System.out.println(tmp); + tmp = reader.readLine(); + } + process.waitFor(); + System.out.println("打包完成"); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } - outputStream.write(json.toString().getBytes()); - outputStream.flush(); - outputStream.close(); - System.out.println(connection.getResponseCode()); - BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); - while ((tmp = reader.readLine()) != null) { - str.append(tmp); - } - System.out.println("[域名]" + url + " = [body]" + body.toString() + " -> [接收] " + str); - } + public static void outError(InputStream inputStream) { + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String tmp; + while ((tmp = reader.readLine()) != null) { + System.out.println(tmp); + } + reader.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } - public static void deleteFile(String s) { - System.out.println("删除文件:"+s); - new File(s).delete(); - } + public static boolean isWindowsRuntime() { + System.out.println(System.getProperties().getProperty("os.name")); + return System.getProperties().getProperty("os.name").toLowerCase().contains("windows"); + } + + public static String readFile(File manifest) { + String tmp; + StringBuilder str = new StringBuilder(); + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(manifest), StandardCharsets.UTF_8)); + while ((tmp = reader.readLine()) != null) { + str.append(tmp); + } + reader.close(); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + System.out.println(str); + } + return str.toString(); + } + + public static void deleteFile(String s) { + System.out.println("删除文件:" + s); + new File(s).delete(); + } + + public static boolean isContainChinese(String str) { + + Pattern p = Pattern.compile("[\u4e00-\u9fa5]"); + Matcher m = p.matcher(str); + if (m.find()) { + return true; + } + return false; + } + + public static String getPingYin(String data) { + HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); + format.setCaseType(HanyuPinyinCaseType.UPPERCASE); + format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + char[] datas = data.toCharArray(); + StringBuilder builder = new StringBuilder(); + for (char c : datas) { + try { + builder.append(PinyinHelper.toHanyuPinyinStringArray(c, format)[0].replace(":","")); + } catch (Exception badHanyuPinyinOutputFormatCombination) { + builder.append(c); + } + } + return builder.toString(); + } + + public static void exec(String exec, DialogInterface dialogInterface) { + try { + System.out.println("exec = " + exec); + Process process; + if (isRuntimeSystemOfWindow()) { + process = Runtime.getRuntime().exec(new String[]{ + "cmd", + "/c", + exec + } + ); + } else { + process = Runtime.getRuntime().exec(new String[]{ + "sh", + "-c", + exec + } + ); + } + if (dialogInterface != null) { + dialogInterface.onOut("input\n" + processOut(process.getInputStream())); + dialogInterface.onOut("output\n" + processOut(process.getErrorStream())); + } else { + processOut(process.getInputStream()); + processOut(process.getErrorStream()); + } + process.destroy(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void exec(String exec) { + exec(exec, null); + } + + public static boolean isRuntimeSystemOfWindow() { + return System.getProperty("os.name").contains("Windows"); + } + + public static String processOut(InputStream inputStream) { + + String tmp; + StringBuilder str = new StringBuilder("null"); + try { + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + while ((tmp = reader.readLine()) != null) { + str.append(tmp).append("\n"); + } + reader.close(); + inputStream.close(); + } catch (Exception e) { + e.printStackTrace(); + } + return str.toString(); + } + + public static void getPackageName(File apk,DialogInterface dialogInterface) { + exec("aapt dump badging " + apk.getAbsolutePath(), new DialogInterface() { + @Override + public void onOut(Object data) { + super.onOut(data); + String[] infos=data.toString().split("\n"); + for (String info : infos) { + if(info.contains("package")) { + dialogInterface.onOut(info.split("\'")[1]); + } + } + } + }); + } + + public static void main(String[] args) { + getPackageName(new File("D:\\ieda\\android_sdk_tools\\10051_kuku_202107132125.apk"), new DialogInterface() { + @Override + public void onOut(Object data) { + super.onOut(data); + System.out.println(data); + } + }); + } } diff --git a/src/com/qy/utils/XMLTools.java b/src/com/qy/utils/XMLTools.java index 2db344c..3895cdc 100644 --- a/src/com/qy/utils/XMLTools.java +++ b/src/com/qy/utils/XMLTools.java @@ -6,18 +6,19 @@ import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.io.StringWriter; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class XMLTools { + private static Map parameterMap; private XMLTools() { } + public static void setParameter(Map map){ + parameterMap=map; + } public static void mergeManifestXML(File src,File src2,File outFile){ try { SAXReader reader = new SAXReader(); @@ -44,7 +45,34 @@ public class XMLTools { manifestDocument.remove(manifestElement); manifestDocument.add((Element) manifestElement.clone()); writeFile4Pretty(outFile,manifestDocument); + if(parameterMap!=null){ + BufferedReader bufferedReader=new BufferedReader(new FileReader(outFile)); + StringBuilder builder=new StringBuilder(); + String tmp; + while ((tmp=bufferedReader.readLine())!=null){ + for (String key : parameterMap.keySet()) { + if(tmp.contains(key)){ + tmp=tmp.replace(key,parameterMap.get(key)); + } + + } + if(tmp.contains("package=")&¶meterMap.containsKey("#{packageName}")){ + String[] sp=tmp.split("package=\""); + String[] sp2=sp[1].split("\""); + String t2=""; + for (int i = 1; i < sp2.length; i++) { + t2+=sp2[i]+"\""; + } + System.out.println("t2 = " + t2); + tmp=sp[0]+"package=\""+parameterMap.get("#{packageName}")+"\""+t2.substring(0,t2.length()-1); + System.out.println("tmp = " + tmp); + } + builder.append(tmp).append("\n"); + } + Tools.saveConfig(outFile,builder.toString()); + } System.out.println("AndroidManifest处理完成"); + parameterMap=null; } catch (Exception e) { e.printStackTrace(); } @@ -65,6 +93,11 @@ public class XMLTools { */ public static void mergeResXML(File file1, File file2, File outFile) { try { + if(!file1.getName().endsWith(".xml")||!file2.getName().endsWith(".xml")){ + System.out.println("非xml 复制:"+file1.getAbsolutePath()+" -> "+outFile.getAbsolutePath()); + Tools.copyFile(file1.getAbsolutePath(),outFile.getAbsolutePath().replace(file1.getName(),""),true); + return; + } List list = new ArrayList<>(); List list1 = readXML(file1); List list2 = readXML(file2); @@ -195,10 +228,23 @@ public class XMLTools { e.printStackTrace(); } } - + public static void copyResDir(File src,File target){ + for (File file : src.listFiles()) { + if(file.isDirectory()){ + copyResDir(file,new File(target.getAbsolutePath()+File.separator+file.getName())); + }else{ + File targetFile=new File(target.getAbsolutePath()+File.separator+file.getName()); + if(targetFile.exists()){ + mergeResXML(file,targetFile,targetFile); + }else{ + Tools.copyFile(file.getAbsolutePath(),target.getAbsolutePath(),true); + } + } + } + } public static void main(String[] args) { boolean isPublic=true; - if(isPublic) { + /* if(isPublic) { mergePublicXML(new File("D:\\ieda\\android_sdk_tools\\EmptyDemo\\res\\values\\public.xml") , new File("D:\\ieda\\android_sdk_tools\\app-game_op2-release\\res\\values\\public.xml") , new File("D:\\ieda\\android_sdk_tools\\app-game_op2-release\\res\\values\\public.xml")); @@ -207,7 +253,9 @@ public class XMLTools { mergeResXML(new File("D:\\ieda\\android_sdk_tools\\qztx_agent_115847_baoliang_11027_1003.0.0_20210128_48301\\res\\values\\" + fileName), new File("D:\\ieda\\android_sdk_tools\\EmptyDemo\\res\\values\\" + fileName), new File("D:\\ieda\\android_sdk_tools\\qztx_agent_115847_baoliang_11027_1003.0.0_20210128_48301\\res\\values\\" + fileName)); - } + }*/ + copyResDir(new File("D:\\ieda\\android_sdk_tools\\sdk_plugin\\nalan\\res"), + new File("D:\\ieda\\android_sdk_tools\\漫斗纪元-那蓝\\res")); /*mergeManifestXML(new File("D:\\ieda\\android_sdk_tools\\三生诀\\AndroidManifest.xml"), new File("D:\\ieda\\android_sdk_tools\\sdk_plugin\\binghu\\AndroidManifest.xml"), new File("D:\\ieda\\android_sdk_tools\\三生诀\\Manifest.xml"));*/