fix: redo aapt provider implementation

This commit is contained in:
Lucaskyy 2022-06-11 17:15:38 +02:00
parent 08822dcb98
commit 37470c018d
No known key found for this signature in database
GPG Key ID: 1530BFF96D1EEB89
5 changed files with 43 additions and 15 deletions

View File

@ -56,7 +56,7 @@ jobs:
cache: gradle
- name: Make gradlew executable
run: chmod +x gradlew
- name: Build with Gradle
- name: Publish with Gradle
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: ./gradlew publish

View File

@ -45,6 +45,18 @@ import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
final public class AndrolibResources {
// The aapt provider. Default is AaptManager for Mac, Linux & Windows.
// May be overridden.
private static AaptProvider AAPT_PROVIDER = new AaptManager();
public static AaptProvider getAaptProvider() {
return AAPT_PROVIDER;
}
public static void setAaptProvider(AaptProvider aaptProvider) {
AAPT_PROVIDER = aaptProvider;
}
public ResTable getResTable(ExtFile apkFile) throws AndrolibException {
return getResTable(apkFile, true);
}
@ -1014,9 +1026,9 @@ final public class AndrolibResources {
private File getAaptBinaryFile() throws AndrolibException {
try {
if (getAaptVersion() == 2) {
return AaptManager.getAapt2();
return getAaptProvider().getAapt2();
}
return AaptManager.getAapt1();
return getAaptProvider().getAapt1();
} catch (BrutException ex) {
throw new AndrolibException(ex);
}

View File

@ -17,25 +17,18 @@
package brut.util;
import brut.common.BrutException;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class AaptManager {
public static File getAapt2() throws BrutException {
return getAapt(2);
}
public static File getAapt1() throws BrutException {
return getAapt(1);
}
public class AaptManager implements AaptProvider {
private static File getAapt(Integer version) throws BrutException {
File aaptBinary;
String aaptVersion = getAaptBinaryName(version);
if (! OSDetection.is64Bit() && OSDetection.isMacOSX()) {
if (!OSDetection.is64Bit() && OSDetection.isMacOSX()) {
throw new BrutException("32 bit OS detected. No 32 bit binaries available.");
}
@ -64,7 +57,7 @@ public class AaptManager {
}
public static String getAaptExecutionCommand(String aaptPath, File aapt) throws BrutException {
if (! aaptPath.isEmpty()) {
if (!aaptPath.isEmpty()) {
File aaptFile = new File(aaptPath);
if (aaptFile.canRead() && aaptFile.exists()) {
aaptFile.setExecutable(true);
@ -115,4 +108,14 @@ public class AaptManager {
return getAppVersionFromString(version);
}
@Override
public File getAapt2() throws BrutException {
return getAapt(2);
}
@Override
public File getAapt1() throws BrutException {
return getAapt(1);
}
}

View File

@ -0,0 +1,12 @@
package brut.util;
import brut.common.BrutException;
import java.io.File;
public interface AaptProvider {
File getAapt2() throws BrutException;
default File getAapt1() throws BrutException {
throw new BrutException(new UnsupportedOperationException("Aapt1 is not supported on this device"));
};
}

View File

@ -20,6 +20,7 @@ import brut.common.BrutException;
import org.apache.commons.io.IOUtils;
import java.io.*;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ThreadLocalRandom;
@ -51,7 +52,7 @@ public abstract class Jar {
File fileOut = File.createTempFile(tmpPrefix, suffix + ".tmp");
fileOut.deleteOnExit();
OutputStream out = new FileOutputStream(fileOut);
OutputStream out = Files.newOutputStream(fileOut.toPath());
IOUtils.copy(in, out);
in.close();
out.close();