remove useless

This commit is contained in:
pengc 2021-06-18 17:29:50 +08:00
parent 2b0a830c55
commit 0ba86283ea
4 changed files with 3 additions and 331 deletions

View File

@ -16,7 +16,6 @@ import org.lsposed.lspatch.share.Constants;
import org.lsposed.patch.base.BaseCommand;
import org.lsposed.patch.task.BuildAndSignApkTask;
import org.lsposed.patch.util.ApkSignatureHelper;
import org.lsposed.patch.util.ZipUtils;
import org.lsposed.patch.util.ManifestParser;
import java.io.File;

View File

@ -6,8 +6,6 @@ import com.android.tools.build.apkzlib.zip.ZFile;
import org.apache.commons.io.IOUtils;
import org.lsposed.patch.LSPatch;
import org.lsposed.patch.util.ZipUtils;
import org.lsposed.patch.util.ShellCmdUtil;
import java.io.File;
import java.io.FileOutputStream;
@ -38,12 +36,7 @@ public class BuildAndSignApkTask implements Runnable {
File unzipApkPathFile = new File(unzipApkFilePath);
File keyStoreFile = new File(unzipApkPathFile, "keystore");
String keyStoreAssetPath;
if (isAndroid()) {
keyStoreAssetPath = "assets/android.keystore";
}
else {
keyStoreAssetPath = "assets/keystore";
}
keyStoreAssetPath = "assets/keystore";
try (InputStream inputStream = getClass().getClassLoader().getResourceAsStream(keyStoreAssetPath);
FileOutputStream out = new FileOutputStream(keyStoreFile)) {
@ -66,57 +59,9 @@ public class BuildAndSignApkTask implements Runnable {
}
private boolean signApk(String apkPath, String keyStorePath, String signedApkPath) {
if (signApkUsingAndroidApksigner(apkPath, keyStorePath, signedApkPath, "123456")) {
return true;
}
if (isAndroid()) {
System.out.println(" Sign apk failed, please sign it yourself.");
return false;
}
try {
long time = System.currentTimeMillis();
File keystoreFile = new File(keyStorePath);
if (keystoreFile.exists()) {
StringBuilder signCmd;
signCmd = new StringBuilder("jarsigner ");
signCmd.append(" -keystore ")
.append(keyStorePath)
.append(" -storepass ")
.append("123456")
.append(" -signedjar ")
.append(" " + signedApkPath + " ")
.append(" " + apkPath + " ")
.append(" -digestalg SHA1 -sigalg SHA1withRSA ")
.append(" key0 ");
System.out.println("\n" + signCmd + "\n");
String result = ShellCmdUtil.execCmd(signCmd.toString(), null);
System.out.println(" sign apk time is :" + ((System.currentTimeMillis() - time) / 1000) +
"s\n\n" + " result=" + result);
return true;
}
System.out.println(" keystore not exist :" + keystoreFile.getAbsolutePath() +
" please sign the apk by hand. \n");
return false;
}
catch (Throwable e) {
System.out.println("use default jarsigner to sign apk failed, fail msg is :" +
e.toString());
return false;
}
return signApkUsingAndroidApksigner(apkPath, keyStorePath, signedApkPath, "123456");
}
private boolean isAndroid() {
boolean isAndroid = true;
try {
Class.forName("android.content.Context");
}
catch (ClassNotFoundException e) {
isAndroid = false;
}
return isAndroid;
}
// 使用Android build-tools里自带的apksigner工具进行签名
private boolean signApkUsingAndroidApksigner(String apkPath, String keyStorePath, String signedApkPath, String keyStorePassword) {
ArrayList<String> commandList = new ArrayList<>();
@ -139,12 +84,8 @@ public class BuildAndSignApkTask implements Runnable {
commandList.add("false");
commandList.add(apkPath);
int size = commandList.size();
String[] commandArray = new String[size];
commandArray = commandList.toArray(commandArray);
try {
ApkSignerTool.main(commandArray);
ApkSignerTool.main(commandList.toArray(new String[0]));
}
catch (Exception e) {
e.printStackTrace();

View File

@ -1,120 +0,0 @@
package org.lsposed.patch.util;
import java.io.BufferedReader;
import java.io.Closeable;
import java.io.File;
import java.io.InputStreamReader;
/**
* Created by Wind
*/
public class ShellCmdUtil {
/**
* 执行系统命令, 返回执行结果
*
* @param cmd 需要执行的命令
* @param dir 执行命令的子进程的工作目录, null 表示和当前主进程工作目录相同
*/
public static String execCmd(String cmd, File dir) throws Exception {
StringBuilder result = new StringBuilder();
Process process = null;
BufferedReader bufrIn = null;
BufferedReader bufrError = null;
try {
// 执行命令, 返回一个子进程对象命令在子进程中执行
process = Runtime.getRuntime().exec(cmd, null, dir);
// 方法阻塞, 等待命令执行完成成功会返回0
process.waitFor();
// 获取命令执行结果, 有两个结果: 正常的输出 错误的输出PS: 子进程的输出就是主进程的输入
bufrIn = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
bufrError = new BufferedReader(new InputStreamReader(process.getErrorStream(), "UTF-8"));
// 读取输出
String line = null;
while ((line = bufrIn.readLine()) != null) {
result.append(line).append('\n');
}
while ((line = bufrError.readLine()) != null) {
result.append(line).append('\n');
}
} finally {
close(bufrIn);
close(bufrError);
// 销毁子进程
if (process != null) {
process.destroy();
}
}
// 返回执行结果
return result.toString();
}
public static void chmodNoException(String path, int mode) {
try {
chmod(path, mode);
} catch (Exception e) {
e.printStackTrace();
System.err.println("chmod exception path --> " + path + " exception -->" + e.getMessage());
}
}
public static void chmod(String path, int mode) throws Exception {
chmodOnAndroid(path, mode);
File file = new File(path);
String cmd = "chmod ";
if (file.isDirectory()) {
cmd += " -R ";
}
String cmode = String.format("%o", mode);
Runtime.getRuntime().exec(cmd + cmode + " " + path).waitFor();
}
private static void chmodOnAndroid(String path, int mode) {
Object sdk_int = ReflectUtils.getField("android.os.Build$VERSION", "SDK_INT");
if (!(sdk_int instanceof Integer)) {
return;
}
if ((int)sdk_int >= 21) {
System.out.println("chmod on android is called, path = " + path);
ReflectUtils.callMethod("android.system.Os", "chmod", path, mode);
}
}
private static void close(Closeable stream) {
if (stream != null) {
try {
stream.close();
} catch (Exception e) {
// nothing
}
}
}
public interface FileMode {
int MODE_ISUID = 04000;
int MODE_ISGID = 02000;
int MODE_ISVTX = 01000;
int MODE_IRUSR = 00400;
int MODE_IWUSR = 00200;
int MODE_IXUSR = 00100;
int MODE_IRGRP = 00040;
int MODE_IWGRP = 00020;
int MODE_IXGRP = 00010;
int MODE_IROTH = 00004;
int MODE_IWOTH = 00002;
int MODE_IXOTH = 00001;
int MODE_755 = MODE_IRUSR | MODE_IWUSR | MODE_IXUSR
| MODE_IRGRP | MODE_IXGRP
| MODE_IROTH | MODE_IXOTH;
}
}

View File

@ -1,148 +0,0 @@
package org.lsposed.patch.util;
import org.apache.commons.io.IOUtils;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
/**
* Created by Wind
*/
public class ZipUtils {
static final int BUFFER = 8192;
/**
* 解压文件
*
* @param zipPath 要解压的目标文件
* @param descDir 指定解压目录
* @return 解压结果成功失败
*/
@SuppressWarnings("rawtypes")
public static void decompressZip(String zipPath, String descDir) throws IOException {
File zipFile = new File(zipPath);
if (!descDir.endsWith(File.separator)) {
descDir = descDir + File.separator;
}
File pathFile = new File(descDir);
if (!pathFile.exists()) {
if (!pathFile.mkdirs()) {
throw new IllegalStateException("mkdir fail " + pathFile.getAbsolutePath());
}
}
try (ZipFile zip = new ZipFile(zipFile, Charset.forName("gbk"))) {
for (Enumeration entries = zip.entries(); entries.hasMoreElements(); ) {
ZipEntry entry = (ZipEntry) entries.nextElement();
String zipEntryName = entry.getName();
String outPath = (descDir + zipEntryName).replace("/", File.separator);
File file = new File(outPath);
if (entry.isDirectory()) {
if (!file.exists()) {
if (!file.mkdirs()) {
throw new IllegalStateException("mkdir fail " + file.getAbsolutePath());
}
}
continue;
}
try (InputStream in = zip.getInputStream(entry)) {
if (file.getParentFile() != null && !file.getParentFile().exists()) {
if (!file.getParentFile().mkdirs()) {
throw new IllegalStateException("mkdir fail " + file.getAbsolutePath());
}
if (System.getProperty("os.name", "").toLowerCase().contains("win")) {
Runtime.getRuntime().exec("fsutil file setCaseSensitiveInfo " + file.getParentFile().getAbsolutePath());
System.out.println("Enable setCaseSensitiveInfo for " + file.getParentFile().getAbsolutePath());
}
}
OutputStream out = new FileOutputStream(outPath);
IOUtils.copy(in, out);
out.close();
}
catch (Exception err) {
throw new IllegalStateException("wtf", err);
}
}
}
}
public static void compressToZip(String srcPath, String dstPath) {
File srcFile = new File(srcPath);
File dstFile = new File(dstPath);
if (!srcFile.exists()) {
throw new IllegalStateException("wtf", new Throwable("DUMPBT"));
}
try (FileOutputStream out = new FileOutputStream(dstFile);
CheckedOutputStream cos = new CheckedOutputStream(out, new CRC32());
ZipOutputStream zipOut = new ZipOutputStream(cos)
) {
String baseDir = "";
compress(srcFile, zipOut, baseDir, true);
}
catch (IOException e) {
throw new IllegalStateException("wtf", e);
}
}
private static void compress(File file, ZipOutputStream zipOut, String baseDir, boolean isRootDir) throws IOException {
if (file.isDirectory()) {
compressDirectory(file, zipOut, baseDir, isRootDir);
}
else {
compressFile(file, zipOut, baseDir);
}
}
/**
* 压缩一个目录
*/
private static void compressDirectory(File dir, ZipOutputStream zipOut, String baseDir, boolean isRootDir) throws IOException {
File[] files = dir.listFiles();
if (files == null) {
return;
}
for (int i = 0; i < files.length; i++) {
String compressBaseDir = "";
if (!isRootDir) {
compressBaseDir = baseDir + dir.getName() + "/";
}
compress(files[i], zipOut, compressBaseDir, false);
}
}
/**
* 压缩一个文件
*/
private static void compressFile(File file, ZipOutputStream zipOut, String baseDir) throws IOException {
if (!file.exists()) {
return;
}
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file))) {
ZipEntry entry = new ZipEntry(baseDir + file.getName());
zipOut.putNextEntry(entry);
int count;
byte[] data = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
zipOut.write(data, 0, count);
}
}
}
}