`
djun100
  • 浏览: 168603 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

批量解包打包签名apk文件

 
阅读更多
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class ReplaceStr {
	static String replaceStr;
	static String channel;//渠道号数字部分
	static String channelPre;//渠道号前缀
	static int channelMax;//渠道数量
	static String unpacked="unpacked";
	static String packed="packed";
	static String signed="signed";
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		channelPre= PropertyHelper.getKeyValue("channelPre");
		channelMax=Integer.parseInt(PropertyHelper.getKeyValue("channelMax"));
		step1();
		step2();
		step3();
		step4();
	}

	private static void step4() {
		// TODO Auto-generated method stub
		System.out.println("清空临时文件夹→→→→→");
			Utils.deleteFolder(unpacked);
		
		List<String> strings= readFiles(packed);
		for(String string:strings){
			System.out.println("当前文件名:"+string);
			if(string.contains(".apk")){
				new File("packed\\"+string).delete();		
			}

		}
		System.out.println("临时文件清理完成!");
	}

	private static void step1() {
		Utils.createFolder(unpacked);
		Utils.createFolder(signed);

		System.out.println("第一步:批量解包→→→→→");
		String dir="apk";
		List<String> strings= readFiles(dir);
		for(String string : strings){
			String temp="cmd /c apktool d \"apk\\"+string+"\" \"unpacked\\"+string.split("\\.")[0]+"\"";
			System.out.println("执行的cmd语句:"+temp);
			runbat(temp);			
		}
	}

	private static void step2() {
		System.out.println("第二步:批量替换并打包中→→→→→");
		for (int i = 1; i <= channelMax; i++) {
			if(i<10){
				channel="0"+i;
			}else{
				channel=String.valueOf(i);
			}
			System.out.println("正在操作渠道"+channelPre+channel+"→→→→→");
			System.out.println("批量替换Strings.xml的fuid中→→→→→");
//			PropertyHelper.writeProperties("anqu", "anqu01");
			String dirs = "unpacked";
			List<String> stringss = readAbFiles(dirs);
			for (String temp : stringss) {
				File file = new File(temp + "\\res\\values\\strings.xml");
					//正则替换
				regularExp("", "<string name=\"fuid\">"+channelPre+channel+"</string>", file);
			}
			System.out.println("批量打包中→→→→→");
			List<String> s_unpacks = readFiles("unpacked");
			for (String string : s_unpacks) {
				String temp = "cmd /c apktool b \"unpacked\\" + string + "\" \"packed\\" + string +channelPre+channel+ ".apk\"";
				System.out.println("执行的cmd语句:" + temp);
				runbat(temp);
			}
		}
	}

	private static void step3() {
		System.out.println("第四步:批量签名中→→→→→");
		List<String> s_packedApks= readFiles("packed");
		for(String string : s_packedApks){
			if(!string.contains(".apk")){
				continue;
			}
			String temp="cmd /c java -jar packed\\signapk.jar packed\\testkey.x509.pem packed\\testkey.pk8 \"packed\\"+string+"\" \"signed\\"+string+"\"";
			System.out.println("执行的cmd语句:"+temp);
			runbat(temp);			
		}
		System.out.println("签名完成,存放于signed文件夹中。");
	}

	private static void replace(File file,String searchStr,String replaceStr) {
		// TODO Auto-generated method stub
	        if(searchStr == null){
	            return;
	        }
	        try{
/*	            FileReader reader = new FileReader(file);
	            char[] dates = new char[1024];
	            int count = 0;
	            StringBuilder sb = new StringBuilder();
	            while((count = reader.read(dates)) > 0){
	                String str = String.valueOf(dates, 0, count);
	                sb.append(str);
	            }
	            reader.close();*/
	            
	            
	            InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");
                StringBuffer sbread = new StringBuffer();
                while (isr.ready()) {
                	sbread.append((char) isr.read());
                }
                isr.close();
	            // 从构造器中生成字符串,并替换搜索文本
	            String str = sbread.toString().replace(searchStr, replaceStr);
/*	            FileWriter writer = new FileWriter(file);
	            writer.write(str.toCharArray());
	            writer.close();*/
	            OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file),"UTF-8");
	            out.write(str.toCharArray());
	            out.flush();
	            out.close();
	        }catch(Exception e){
	            e.printStackTrace();
	        }
	        System.out.println("替换完成!");
	}
	/**
	 * 运行cmd命令
	 */
	public static boolean exec(String[] cmdAry) throws Exception {
		Runtime rt = Runtime.getRuntime();
		Process proc = null;
		try {
			proc = rt.exec(cmdAry); 
			/* 
			 * Runtime的exec()方法类似线程,不会在cmd命令执行完成后再继续运行下面的代码,
			 * 所以导致可能cmd命令还没执行完毕,程序就运行到了Process的destroy()方法,因
			 * 此需要一个方法去等待cmd命令执行完毕后,再运行exec()之后的方法
			 */
			return waitForProcess(proc) > 0;
		} finally {
			if (proc != null) {
				proc.destroy();
				proc = null;
			}
		}
	}
	
	/**
	 * 得到cmd命令返回的信息数据流,该流的运行周期与cmd命令的实行时间相同
	 */
	public static int waitForProcess(Process proc) throws Exception {
		// cmd命令有返回正确的信息流,和错误信息流,不过不能绝对表示cmd命令是否执行正确
		BufferedReader in = null;
		BufferedReader err = null;
		String msg = null;
		int exitValue = -1;
		try {
			in = new BufferedReader(new InputStreamReader(proc.getInputStream()));
			while ((msg = in.readLine()) != null) {
				System.out.println(msg);
				if (1 != exitValue) {
					exitValue = 1;
				}
			}
			err = new BufferedReader(new InputStreamReader(proc.getErrorStream()));
			while ((msg = err.readLine()) != null) {
				System.out.println(msg);
				if (0 != exitValue) {
					exitValue = 0;
				}
			}
			return exitValue;
			
		} finally {
			if (null != in) {
				in.close();
				in = null;
			}
			if (null != err) {
				err.close();
				err = null;
			}
		}
	}
	  public static void runbat(String bat) {

	        try {
	            Process process = Runtime.getRuntime().exec(bat);
	            process.waitFor( ); 
//	            System.out.println(ps.getInputStream());
	        } catch(IOException ioe) {
	            ioe.printStackTrace();
	        } catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    }  

	  public static List<String> readFiles(String filePath) {  
	        File f = null;  
	        f = new File(filePath);  
	        File[] files = f.listFiles(); // 得到f文件夹下面的所有文件。  
	        List<File> list = new ArrayList<File>();  
	        List<String> strings=new ArrayList<String>();
	        for (File file : files) {  
	            list.add(file);  
	        }  
	        for(File file : files) {  
	            System.out.println(file.getName());
	            strings.add(file.getName());
	            
	        }  
	        return strings;
	    }  
	  public static List<String> readAbFiles(String filePath) {  
		  File f = null;  
		  f = new File(filePath);  
		  File[] files = f.listFiles(); // 得到f文件夹下面的所有文件。  
		  List<File> list = new ArrayList<File>();  
		  List<String> strings=new ArrayList<String>();
		  for (File file : files) {  
			  list.add(file);  
		  }  
		  for(File file : files) {  
			  strings.add(file.getAbsolutePath());
			  
		  }  
		  return strings;
	  }  
	  
	/**
	 * @param regex 正则
	 * @param to 要替换成的内容
	 * @param file 被替换的文件
	 */
	public static void regularExp(String regex,String to,File file){
//			     regex = "^\"fuid\">(.*)</string>$";      
			     regex = "<string name=\"fuid\">(.*?)</string>";      
/*			     source = "<a href=\"http://***.***.***" onclick=\"co('**')\" class=\"lr\">***</a>";*/
				String source=Utils.read_UTF8_FileContent(file);
			    Matcher matcher = Pattern.compile(regex).matcher(source);
			    while (matcher.find()) {
			        System.out.println("匹配的group():"+matcher.group());
			        replace(file, matcher.group(),to);
			        
			    }
			/*output:
			href="http://***.***.*" onclick="co('**')" class="lr">***
			*/
	}
}

分享到:
评论

相关推荐

    新开0-1冷启动分行业指南.zip

    新开0-1冷启动分行业指南.zip

    FPGA课程实验代码-包含加法器.zip

    FPGA课程实验代码-包含加法器.zip

    胖东来运营管理-施工管理制度.pdf

    胖东来运营管理-施工管理制度.pdf

    中控考勤对接DEMO JAVA开发

    需要的可以自行下载

    Whats_Next_2023_全球流行趋势报告.zip

    Whats_Next_2023_全球流行趋势报告.zip

    Python教程-快速入门基础必看课程08-字典

    该视频主要讲述了Python中查找列表中的元素和如何使用字典的方法。首先,介绍了在列表中查找元素的方法,包括遍历列表和直接使用if语句判断元素是否在列表中。接着,通过一个例子展示了如何使用字典来存储和查找键值对,并介绍了字典的定义和使用方法。视频中还提到了字典的键值对一一对应的关系,以及如何添加新的键值对到字典中。最后,通过一个例子展示了如何使用字典来查找两个列表之间的对应关系。此外,该视频还讲述了字典在统计不同物品数量方面的应用。 分段内容介绍 00:01 Python中查找list元素和... 介绍了在Python中如何查找list中的元素,以及如何使用字典这种数据结构。 06:56 Python字典的基本操作 在视频中,讲解了Python字典的基本操作,包括定义、添加键值对、修改键值对、判断键是否存在以及统计键值对的数量等。 14:10 水果数量存储示例 通过字典结构来存储水果的数量,例如苹果有三个,橘子有两个。这个示例较为简单。 视频重点 02:09 使用字典查找元素 04:52 利用字典统计数据 09:56 动态的字典创建与操作

    133_基于Java的服装管理系统的设计与实现-源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    96_基于Android的美食推荐 APP-源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    Whats_Next_2023_全球社群电商趋势报告.zip

    Whats_Next_2023_全球社群电商趋势报告.zip

    基于uni-app的垃圾分类精灵的设计与实现源码.zip

    提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

    matlab商人过河代码

    matlab商人过河代码

    无迹卡尔曼滤波算法的python实现与解读.docx

    卡尔曼滤波算法 当然,理解无迹卡尔曼滤波(UKF)的核心原理并手动实现它是非常有益的。下面是一个不依赖于`filterpy`库,纯Python实现的无迹卡尔曼滤波器示例。我们将通过一个简单的例子来说明,比如跟踪一个一维运动物体的位置,假定其速度是恒定的,但我们的测量和模型都有噪声。 ### 无迹卡尔曼滤波基础概念 UKF通过一组被称为“sigma点”的样本点来近似状态分布,并通过这些点经过非线性转换后的结果来估算新的状态分布。核心步骤包括预测和更新两个阶段。 ### Python实现 ```python import numpy as np class UnscentedKalmanFilter: def __init__(self, alpha=0.001, beta=2, kappa=0): self.alpha = alpha self.beta = beta self.kappa = kappa self.n = 0 # 状态维度 self.lambda_ = self.alp

    BMS2.zip

    BMS2.zip

    从美国消费看中国优质制造复苏

    22 年以来美国面临消费者信心指数和实际购买力的下行,个人消费支出增速放缓。美国居民可支配收入虽然总体上保持增长,但随着财政补贴的退坡,储蓄存款总额大幅度下降。叠加通胀和俄乌战争宏观不确定性因素,居民消费者信心指数 22 年以来有所下降。当前,22 年 10 月美国 CPI 同比+7.7%,增速回落,通货膨胀的缓解有望显著改善居民实际购买力,带动消费增长

    《中日渔业协定》暂定措施水域捕捞日志.doc

    《中日渔业协定》暂定措施水域捕捞日志.doc

    2024 TikTok电商白皮书 Kalodata

    Kalodata是一个深耕TikTok电商领域的数据分析工具,在过去1年 的时间里面,Kalodata已经帮助很多东南亚本土、美国本土和跨境 的卖家在TikTok上赚到了第一桶金。尤其是美国,少数几个卖家的 销量就定义了TikTok美国的某些单个类目,这样的流量红利是史无 前例的。与此同时,我们也看到了非常多头部大卖已经开始去到美 国,建立本地公司,搭建本地的直播间等等。所以在将来一年里, 我们相信整体美国的GMV会从短视频带货为主转化为直播带货为主, 整体的电商生态会更加丰富与繁华。

    传统农具征集参考范围表.doc

    传统农具征集参考范围表.doc

    Python课设-学生信息管理系统

    Python课设-学生信息管理系统

    美区TikTok短视频运营爆品玩法.zip

    美区TikTok短视频运营爆品玩法.zip

    城市(县城)液化石油气基层表.XLS

    城市(县城)液化石油气基层表.XLS

Global site tag (gtag.js) - Google Analytics