Merge pull request #1173 from iBotPeaches/major/remove-smalidebugging

Removes SmaliDebugging
This commit is contained in:
Connor Tumbleson 2016-02-27 21:03:15 -05:00
commit a2b3d6b6b7
26 changed files with 39 additions and 1261 deletions

3
.gitmodules vendored
View File

@ -1,3 +0,0 @@
[submodule "smali"]
path = smali
url = https://github.com/JesusFreke/smali.git

View File

@ -1,8 +1,6 @@
env: env:
- TERM=dumb - TERM=dumb
language: java language: java
git:
submodules: false
jdk: jdk:
- openjdk7 - openjdk7
- oraclejdk7 - oraclejdk7
@ -21,9 +19,7 @@ before_install:
- git config --global user.name "Travis CI Bot" - git config --global user.name "Travis CI Bot"
- sudo apt-get update -qq - sudo apt-get update -qq
- sudo apt-get install -qq libstdc++6:i386 lib32z1 expect - sudo apt-get install -qq libstdc++6:i386 lib32z1 expect
- sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules
- git submodule update --init --recursive - git submodule update --init --recursive
install: ./gradlew applyPatches
script: ./gradlew build fatJar proguard script: ./gradlew build fatJar proguard
branches: branches:
only: only:

View File

@ -205,6 +205,3 @@ released under the following license:
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
******************************************************************************* *******************************************************************************
The sub project (brut.apktool.smali) is a clone of the smali project. Its
license can be found at brut.apktool.smali/NOTICE-SMALI

View File

@ -114,10 +114,8 @@ public class Main {
decoder.setDecodeSources(ApkDecoder.DECODE_SOURCES_NONE); decoder.setDecodeSources(ApkDecoder.DECODE_SOURCES_NONE);
} }
if (cli.hasOption("d") || cli.hasOption("debug")) { if (cli.hasOption("d") || cli.hasOption("debug")) {
decoder.setDebugMode(true); System.err.println("SmaliDebugging has been removed in 2.1.0 onward. Please see: https://github.com/iBotPeaches/Apktool/issues/1061");
} System.exit(1);
if (cli.hasOption("debug-line-prefix")) {
decoder.setDebugLinePrefix(cli.getOptionValue("debug-line-prefix"));
} }
if (cli.hasOption("b") || cli.hasOption("no-debug-info")) { if (cli.hasOption("b") || cli.hasOption("no-debug-info")) {
decoder.setBaksmaliDebugMode(false); decoder.setBaksmaliDebugMode(false);
@ -201,7 +199,8 @@ public class Main {
apkOptions.forceBuildAll = true; apkOptions.forceBuildAll = true;
} }
if (cli.hasOption("d") || cli.hasOption("debug")) { if (cli.hasOption("d") || cli.hasOption("debug")) {
apkOptions.debugMode = true; System.err.println("SmaliDebugging has been removed in 2.1.0 onward. Please see: https://github.com/iBotPeaches/Apktool/issues/1061");
System.exit(1);
} }
if (cli.hasOption("v") || cli.hasOption("verbose")) { if (cli.hasOption("v") || cli.hasOption("verbose")) {
apkOptions.verbose = true; apkOptions.verbose = true;
@ -273,19 +272,13 @@ public class Main {
.create("r"); .create("r");
Option debugDecOption = OptionBuilder.withLongOpt("debug") Option debugDecOption = OptionBuilder.withLongOpt("debug")
.withDescription("Decode in debug mode. Check project page for more info.") .withDescription("REMOVED (DOES NOT WORK): Decode in debug mode.")
.create("d"); .create("d");
Option analysisOption = OptionBuilder.withLongOpt("match-original") Option analysisOption = OptionBuilder.withLongOpt("match-original")
.withDescription("Keeps files to closest to original as possible. Prevents rebuild.") .withDescription("Keeps files to closest to original as possible. Prevents rebuild.")
.create("m"); .create("m");
Option debugLinePrefix = OptionBuilder.withLongOpt("debug-line-prefix")
.withDescription("Smali line prefix when decoding in debug mode. Default is \"a=0;// \".")
.hasArg(true)
.withArgName("prefix")
.create();
Option apiLevelOption = OptionBuilder.withLongOpt("api") Option apiLevelOption = OptionBuilder.withLongOpt("api")
.withDescription("The numeric api-level of the file to generate, e.g. 14 for ICS.") .withDescription("The numeric api-level of the file to generate, e.g. 14 for ICS.")
.hasArg(true) .hasArg(true)
@ -369,7 +362,6 @@ public class Main {
// check for advance mode // check for advance mode
if (isAdvanceMode()) { if (isAdvanceMode()) {
DecodeOptions.addOption(debugLinePrefix);
DecodeOptions.addOption(debugDecOption); DecodeOptions.addOption(debugDecOption);
DecodeOptions.addOption(noDbgOption); DecodeOptions.addOption(noDbgOption);
DecodeOptions.addOption(keepResOption); DecodeOptions.addOption(keepResOption);
@ -416,7 +408,6 @@ public class Main {
allOptions.addOption((Option)op); allOptions.addOption((Option)op);
} }
allOptions.addOption(analysisOption); allOptions.addOption(analysisOption);
allOptions.addOption(debugLinePrefix);
allOptions.addOption(debugDecOption); allOptions.addOption(debugDecOption);
allOptions.addOption(noDbgOption); allOptions.addOption(noDbgOption);
allOptions.addOption(keepResOption); allOptions.addOption(keepResOption);

View File

@ -36,10 +36,8 @@ dependencies {
compile project(':brut.j.dir'), compile project(':brut.j.dir'),
project(':brut.j.util'), project(':brut.j.util'),
project(':brut.j.common'), project(':brut.j.common'),
project(':brut.apktool.smali:util'), depends.baksmali,
project(':brut.apktool.smali:dexlib2'), depends.smali,
project(':brut.apktool.smali:baksmali'),
project(':brut.apktool.smali:smali'),
depends.snakeyaml, depends.snakeyaml,
depends.xmlpull, depends.xmlpull,
depends.guava, depends.guava,

View File

@ -16,7 +16,6 @@
package brut.androlib; package brut.androlib;
import brut.androlib.java.AndrolibJava;
import brut.androlib.meta.MetaInfo; import brut.androlib.meta.MetaInfo;
import brut.androlib.meta.UsesFramework; import brut.androlib.meta.UsesFramework;
import brut.androlib.res.AndrolibResources; import brut.androlib.res.AndrolibResources;
@ -80,8 +79,8 @@ public class Androlib {
} }
} }
public void decodeSourcesSmali(File apkFile, File outDir, String filename, boolean debug, String debugLinePrefix, public void decodeSourcesSmali(File apkFile, File outDir, String filename, boolean bakdeb, int api)
boolean bakdeb, int api) throws AndrolibException { throws AndrolibException {
try { try {
File smaliDir; File smaliDir;
if (filename.equalsIgnoreCase("classes.dex")) { if (filename.equalsIgnoreCase("classes.dex")) {
@ -92,18 +91,12 @@ public class Androlib {
OS.rmdir(smaliDir); OS.rmdir(smaliDir);
smaliDir.mkdirs(); smaliDir.mkdirs();
LOGGER.info("Baksmaling " + filename + "..."); LOGGER.info("Baksmaling " + filename + "...");
SmaliDecoder.decode(apkFile, smaliDir, filename, debug, debugLinePrefix, bakdeb, api); SmaliDecoder.decode(apkFile, smaliDir, filename, bakdeb, api);
} catch (BrutException ex) { } catch (BrutException ex) {
throw new AndrolibException(ex); throw new AndrolibException(ex);
} }
} }
public void decodeSourcesJava(ExtFile apkFile, File outDir, boolean debug)
throws AndrolibException {
LOGGER.info("Decoding Java sources...");
new AndrolibJava().decode(apkFile, outDir);
}
public void decodeManifestRaw(ExtFile apkFile, File outDir) public void decodeManifestRaw(ExtFile apkFile, File outDir)
throws AndrolibException { throws AndrolibException {
try { try {
@ -299,9 +292,7 @@ public class Androlib {
public void buildSources(File appDir) public void buildSources(File appDir)
throws AndrolibException { throws AndrolibException {
if (!buildSourcesRaw(appDir, "classes.dex") if (!buildSourcesRaw(appDir, "classes.dex") && !buildSourcesSmali(appDir, "smali", "classes.dex")) {
&& !buildSourcesSmali(appDir, "smali", "classes.dex")
&& !buildSourcesJava(appDir)) {
LOGGER.warning("Could not find sources"); LOGGER.warning("Could not find sources");
} }
} }
@ -316,9 +307,7 @@ public class Androlib {
if (name.startsWith("smali_")) { if (name.startsWith("smali_")) {
String filename = name.substring(name.indexOf("_") + 1) + ".dex"; String filename = name.substring(name.indexOf("_") + 1) + ".dex";
if (!buildSourcesRaw(appDir, filename) if (!buildSourcesRaw(appDir, filename) && !buildSourcesSmali(appDir, name, filename)) {
&& !buildSourcesSmali(appDir, name, filename)
&& !buildSourcesJava(appDir)) {
LOGGER.warning("Could not find sources"); LOGGER.warning("Could not find sources");
} }
} }
@ -372,25 +361,7 @@ public class Androlib {
if (apkOptions.forceBuildAll || isModified(smaliDir, dex)) { if (apkOptions.forceBuildAll || isModified(smaliDir, dex)) {
LOGGER.info("Smaling " + folder + " folder into " + filename +"..."); LOGGER.info("Smaling " + folder + " folder into " + filename +"...");
dex.delete(); dex.delete();
SmaliBuilder.build(smaliDir, dex, apkOptions.debugMode); SmaliBuilder.build(smaliDir, dex);
}
return true;
}
public boolean buildSourcesJava(File appDir)
throws AndrolibException {
File javaDir = new File(appDir, "src");
if (!javaDir.exists()) {
return false;
}
File dex = new File(appDir, APK_DIRNAME + "/classes.dex");
if (! apkOptions.forceBuildAll) {
LOGGER.info("Checking whether sources has changed...");
}
if (apkOptions.forceBuildAll || isModified(javaDir, dex)) {
LOGGER.info("Building java sources...");
dex.delete();
new AndrolibJava().build(javaDir, dex);
} }
return true; return true;
} }
@ -487,10 +458,6 @@ public class Androlib {
File apkDir = new File(appDir, APK_DIRNAME); File apkDir = new File(appDir, APK_DIRNAME);
if (apkOptions.debugMode) {
ResXmlPatcher.removeApplicationDebugTag(new File(apkDir,"AndroidManifest.xml"));
}
if (apkOptions.forceBuildAll || isModified(newFiles(APK_MANIFEST_FILENAMES, appDir), if (apkOptions.forceBuildAll || isModified(newFiles(APK_MANIFEST_FILENAMES, appDir),
newFiles(APK_MANIFEST_FILENAMES, apkDir))) { newFiles(APK_MANIFEST_FILENAMES, apkDir))) {
LOGGER.info("Building AndroidManifest.xml..."); LOGGER.info("Building AndroidManifest.xml...");

View File

@ -128,10 +128,7 @@ public class ApkDecoder {
mAndrolib.decodeSourcesRaw(mApkFile, outDir, "classes.dex"); mAndrolib.decodeSourcesRaw(mApkFile, outDir, "classes.dex");
break; break;
case DECODE_SOURCES_SMALI: case DECODE_SOURCES_SMALI:
mAndrolib.decodeSourcesSmali(mApkFile, outDir, "classes.dex", mDebug, mDebugLinePrefix, mBakDeb, mApi); mAndrolib.decodeSourcesSmali(mApkFile, outDir, "classes.dex", mBakDeb, mApi);
break;
case DECODE_SOURCES_JAVA:
mAndrolib.decodeSourcesJava(mApkFile, outDir, mDebug);
break; break;
} }
} }
@ -147,10 +144,7 @@ public class ApkDecoder {
mAndrolib.decodeSourcesRaw(mApkFile, outDir, file); mAndrolib.decodeSourcesRaw(mApkFile, outDir, file);
break; break;
case DECODE_SOURCES_SMALI: case DECODE_SOURCES_SMALI:
mAndrolib.decodeSourcesSmali(mApkFile, outDir, file, mDebug, mDebugLinePrefix, mBakDeb, mApi); mAndrolib.decodeSourcesSmali(mApkFile, outDir, file, mBakDeb, mApi);
break;
case DECODE_SOURCES_JAVA:
mAndrolib.decodeSourcesJava(mApkFile, outDir, mDebug);
break; break;
} }
} }
@ -167,7 +161,7 @@ public class ApkDecoder {
} }
public void setDecodeSources(short mode) throws AndrolibException { public void setDecodeSources(short mode) throws AndrolibException {
if (mode != DECODE_SOURCES_NONE && mode != DECODE_SOURCES_SMALI && mode != DECODE_SOURCES_JAVA) { if (mode != DECODE_SOURCES_NONE && mode != DECODE_SOURCES_SMALI) {
throw new AndrolibException("Invalid decode sources mode: " + mode); throw new AndrolibException("Invalid decode sources mode: " + mode);
} }
mDecodeSources = mode; mDecodeSources = mode;
@ -180,11 +174,6 @@ public class ApkDecoder {
mDecodeResources = mode; mDecodeResources = mode;
} }
public void setDebugMode(boolean debug) {
LOGGER.warning("SmaliDebugging has been deprecated. It will be removed in Apktool 2.1 - https://github.com/iBotPeaches/Apktool/issues/1061");
mDebug = debug;
}
public void setAnalysisMode(boolean mode, boolean pass) throws AndrolibException{ public void setAnalysisMode(boolean mode, boolean pass) throws AndrolibException{
mAnalysisMode = mode; mAnalysisMode = mode;
@ -208,10 +197,6 @@ public class ApkDecoder {
} }
} }
public void setDebugLinePrefix(String debugLinePrefix) {
mDebugLinePrefix = debugLinePrefix;
}
public void setBaksmaliDebugMode(boolean bakdeb) { public void setBaksmaliDebugMode(boolean bakdeb) {
mBakDeb = bakdeb; mBakDeb = bakdeb;
} }
@ -288,7 +273,6 @@ public class ApkDecoder {
public final static short DECODE_SOURCES_NONE = 0x0000; public final static short DECODE_SOURCES_NONE = 0x0000;
public final static short DECODE_SOURCES_SMALI = 0x0001; public final static short DECODE_SOURCES_SMALI = 0x0001;
public final static short DECODE_SOURCES_JAVA = 0x0002;
public final static short DECODE_RESOURCES_NONE = 0x0100; public final static short DECODE_RESOURCES_NONE = 0x0100;
public final static short DECODE_RESOURCES_FULL = 0x0101; public final static short DECODE_RESOURCES_FULL = 0x0101;
@ -396,8 +380,6 @@ public class ApkDecoder {
private ResTable mResTable; private ResTable mResTable;
private short mDecodeSources = DECODE_SOURCES_SMALI; private short mDecodeSources = DECODE_SOURCES_SMALI;
private short mDecodeResources = DECODE_RESOURCES_FULL; private short mDecodeResources = DECODE_RESOURCES_FULL;
private String mDebugLinePrefix = "a=0;// ";
private boolean mDebug = false;
private boolean mForceDelete = false; private boolean mForceDelete = false;
private boolean mKeepBrokenResources = false; private boolean mKeepBrokenResources = false;
private boolean mBakDeb = true; private boolean mBakDeb = true;

View File

@ -19,7 +19,6 @@ import java.util.Collection;
public class ApkOptions { public class ApkOptions {
public boolean forceBuildAll = false; public boolean forceBuildAll = false;
public boolean debugMode = false;
public boolean verbose = false; public boolean verbose = false;
public boolean copyOriginalFiles = false; public boolean copyOriginalFiles = false;
public boolean updateFiles = false; public boolean updateFiles = false;

View File

@ -1,34 +0,0 @@
/**
* Copyright 2014 Ryszard Wiśniewski <brut.alll@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package brut.androlib.java;
import brut.androlib.res.util.ExtFile;
import java.io.File;
/**
* @author Ryszard Wiśniewski <brut.alll@gmail.com>
*/
public class AndrolibJava {
public void decode(ExtFile apkFile, File outDir) {
throw new UnsupportedOperationException("Not yet implemented");
}
public void build(File javaDir, File dex) {
throw new UnsupportedOperationException("Not yet implemented");
}
}

View File

@ -1,29 +0,0 @@
/**
* Copyright 2014 Ryszard Wiśniewski <brut.alll@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package brut.androlib.mod;
import java.io.Writer;
/**
* @author Ryszard Wiśniewski <brut.alll@gmail.com>
*/
public class IndentingWriter extends org.jf.util.IndentingWriter {
public IndentingWriter(Writer writer) {
super(writer);
}
}

View File

@ -343,10 +343,6 @@ final public class AndrolibResources {
if (apkOptions.updateFiles) { if (apkOptions.updateFiles) {
cmd.add("-u"); cmd.add("-u");
} }
if (apkOptions.debugMode) { // inject debuggable="true" into manifest
cmd.add("--debug-mode");
}
// force package id so that some frameworks build with correct id // force package id so that some frameworks build with correct id
// disable if user adds own aapt (can't know if they have this feature) // disable if user adds own aapt (can't know if they have this feature)
if (mPackageId != null && ! customAapt && ! mSharedLibrary) { if (mPackageId != null && ! customAapt && ! mSharedLibrary) {

View File

@ -40,35 +40,6 @@ import java.io.IOException;
* @author Connor Tumbleson <connor.tumbleson@gmail.com> * @author Connor Tumbleson <connor.tumbleson@gmail.com>
*/ */
public final class ResXmlPatcher { public final class ResXmlPatcher {
/**
* Removes "debug" tag from file
*
* @param file AndroidManifest file
* @throws AndrolibException
*/
public static void removeApplicationDebugTag(File file) throws AndrolibException {
if (file.exists()) {
try {
Document doc = loadDocument(file);
Node application = doc.getElementById("application");
// load attr
NamedNodeMap attr = application.getAttributes();
Node debugAttr = attr.getNamedItem("debug");
// remove application:debug
if (debugAttr != null) {
attr.removeNamedItem("debug");
}
saveDocument(file, doc);
} catch (SAXException | ParserConfigurationException | IOException | TransformerException ignored) {
}
}
}
/** /**
* Any @string reference in a <provider> value in AndroidManifest.xml will break on * Any @string reference in a <provider> value in AndroidManifest.xml will break on
* build, thus preventing the application from installing. This is from a bug/error * build, thus preventing the application from installing. This is from a bug/error

View File

@ -1,244 +0,0 @@
/**
* Copyright 2014 Ryszard Wiśniewski <brut.alll@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package brut.androlib.src;
import brut.androlib.AndrolibException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @author Ryszard Wiśniewski <brut.alll@gmail.com>
*/
public class DebugInjector {
private boolean areParamsInjected;
private int currParam;
private int lastParam;
public static void inject(ListIterator<String> it, StringBuilder out)
throws AndrolibException {
new DebugInjector(it, out).inject();
}
private DebugInjector(ListIterator<String> it, StringBuilder out) {
mIt = it;
mOut = out;
}
private void inject() throws AndrolibException {
String definition = nextAndAppend();
if (definition.contains(" abstract ")
|| definition.contains(" native ")) {
nextAndAppend();
return;
}
parseParamsNumber(definition);
boolean end = false;
while (!end) {
end = step();
}
}
private void parseParamsNumber(String definition) throws AndrolibException {
int pos = definition.indexOf('(');
if (pos == -1) {
throw new AndrolibException();
}
int pos2 = definition.indexOf(')', pos);
if (pos2 == -1) {
throw new AndrolibException();
}
String params = definition.substring(pos + 1, pos2);
currParam = definition.contains(" static ") ? 0 : 1;
lastParam = TypeName.listFromInternalName(params).size() + currParam - 1;
}
private void injectRemainingParams() {
areParamsInjected = true;
while(currParam <= lastParam) {
//mOut.append(".param \"p").append(currParam).append("\"\n");
currParam++;
}
}
private boolean step() {
String line = next();
if (line.isEmpty()) {
return false;
}
switch (line.charAt(0)) {
case '#':
return processComment(line);
case ':':
append(line);
return false;
case '.':
return processDirective(line);
default:
if (! areParamsInjected) {
injectRemainingParams();
}
return processInstruction(line);
}
}
private boolean processComment(String line) {
if (mFirstInstruction) {
return false;
}
Matcher m = REGISTER_INFO_PATTERN.matcher(line);
while (m.find()) {
String localName = m.group(1);
String localType = null;
switch (m.group(2)) {
case "Reference":
case "UninitRef":
case "REFERENCE":
case "Null":
case "UninitThis":
localType = "Ljava/lang/Object;";
break;
case "Boolean":
localType = "Z";
break;
case "Integer":
case "One":
case "Unknown":
localType = "I";
break;
case "Uninit":
case "Conflicted":
if (mInitializedRegisters.remove(localName)) {
mOut.append(".end local ").append(localName).append('\n');
}
continue;
case "Short":
case "PosShort":
localType = "S";
break;
case "Byte":
case "PosByte":
localType = "B";
break;
case "Char":
localType = "C";
break;
case "Float":
localType = "F";
break;
case "LongHi":
case "LongLo":
localType = "J";
break;
case "DoubleHi":
case "DoubleLo":
localType = "D";
break;
default:
System.err.println(line);
System.err.println(m.group(2));
System.err.println(m.group(3));
assert false;
}
mInitializedRegisters.add(localName);
mOut.append(".local ").append(localName).append(", ").append('"')
.append(localName).append('"').append(':').append(localType)
.append('\n');
}
return false;
}
private boolean processDirective(String line) {
String line2 = line.substring(1);
if (line2.startsWith("line ") || line2.startsWith("local ") || line2.startsWith("end local ")) {
return false;
}
if (line2.equals("prologue")) {
if (! areParamsInjected) {
injectRemainingParams();
}
return false;
}
if (line2.equals("param")) {
mOut.append(".param \"p").append(currParam++).append("\"\n");
return false;
}
if (line2.startsWith("param")) {
mOut.append(line).append("\n");
currParam++;
return false;
}
append(line);
if (line2.equals("end method")) {
return true;
}
if (line2.startsWith("annotation ") || line2.equals("sparse-switch")
|| line2.startsWith("packed-switch ")
|| line2.startsWith("array-data ")) {
while (true) {
line2 = nextAndAppend();
if (line2.startsWith(".end ")) {
break;
}
}
}
return false;
}
private boolean processInstruction(String line) {
if (mFirstInstruction) {
mOut.append(".prologue\n");
mFirstInstruction = false;
}
mOut.append(".line ").append(mIt.nextIndex()).append('\n').append(line)
.append('\n');
return false;
}
private String next() {
return mIt.next().split("//", 2)[1].trim();
}
private String nextAndAppend() {
String line = next();
append(line);
return line;
}
private void append(String append) {
mOut.append(append).append('\n');
}
private final ListIterator<String> mIt;
private final StringBuilder mOut;
private boolean mFirstInstruction = true;
private final Set<String> mInitializedRegisters = new HashSet<String>();
private static final Pattern REGISTER_INFO_PATTERN = Pattern
.compile("((?:p|v)\\d+)=\\(([^,)]+)([^)]*)\\);");
}

View File

@ -21,9 +21,7 @@ import brut.androlib.mod.SmaliMod;
import brut.androlib.res.util.ExtFile; import brut.androlib.res.util.ExtFile;
import brut.directory.DirectoryException; import brut.directory.DirectoryException;
import java.io.*; import java.io.*;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.ListIterator;
import java.util.logging.Logger; import java.util.logging.Logger;
import org.antlr.runtime.RecognitionException; import org.antlr.runtime.RecognitionException;
@ -36,15 +34,13 @@ import org.jf.dexlib2.writer.io.FileDataStore;
*/ */
public class SmaliBuilder { public class SmaliBuilder {
public static void build(ExtFile smaliDir, File dexFile, boolean debug) public static void build(ExtFile smaliDir, File dexFile) throws AndrolibException {
throws AndrolibException { new SmaliBuilder(smaliDir, dexFile).build();
new SmaliBuilder(smaliDir, dexFile, debug).build();
} }
private SmaliBuilder(ExtFile smaliDir, File dexFile, boolean debug) { private SmaliBuilder(ExtFile smaliDir, File dexFile) {
mSmaliDir = smaliDir; mSmaliDir = smaliDir;
mDexFile = dexFile; mDexFile = dexFile;
mDebug = debug;
} }
private void build() throws AndrolibException { private void build() throws AndrolibException {
@ -84,30 +80,10 @@ public class SmaliBuilder {
List<String> lines = IOUtils.readLines(inStream); List<String> lines = IOUtils.readLines(inStream);
inStream.close(); inStream.close();
if (! mDebug) {
final String[] linesArray = lines.toArray(new String[0]); final String[] linesArray = lines.toArray(new String[0]);
for (int i = 1; i < linesArray.length - 1; i++) { for (int i = 1; i < linesArray.length - 1; i++) {
out.append(linesArray[i].split("//", 2)[1]).append('\n'); out.append(linesArray[i].split("//", 2)[1]).append('\n');
} }
} else {
lines.remove(lines.size() - 1);
ListIterator<String> it = lines.listIterator(1);
out.append(".source \"").append(inFile.getName()).append("\"\n");
while (it.hasNext()) {
String line = it.next().split("//", 2)[1].trim();
if (line.isEmpty() || line.charAt(0) == '#' || line.startsWith(".source")) {
continue;
}
if (line.startsWith(".method ")) {
it.previous();
DebugInjector.inject(it, out);
continue;
}
out.append(line).append('\n');
}
}
try { try {
if (!SmaliMod.assembleSmaliFile(out.toString(),dexBuilder, false, false, inFile)) { if (!SmaliMod.assembleSmaliFile(out.toString(),dexBuilder, false, false, inFile)) {
throw new AndrolibException("Could not smali file: " + fileName); throw new AndrolibException("Could not smali file: " + fileName);
@ -119,7 +95,6 @@ public class SmaliBuilder {
private final ExtFile mSmaliDir; private final ExtFile mSmaliDir;
private final File mDexFile; private final File mDexFile;
private final boolean mDebug;
private final static Logger LOGGER = Logger.getLogger(SmaliBuilder.class.getName()); private final static Logger LOGGER = Logger.getLogger(SmaliBuilder.class.getName());
} }

View File

@ -20,52 +20,38 @@ import brut.androlib.AndrolibException;
import org.jf.baksmali.baksmali; import org.jf.baksmali.baksmali;
import org.jf.baksmali.baksmaliOptions; import org.jf.baksmali.baksmaliOptions;
import org.jf.dexlib2.DexFileFactory; import org.jf.dexlib2.DexFileFactory;
import org.jf.dexlib2.analysis.ClassPath;
import org.jf.dexlib2.dexbacked.DexBackedDexFile; import org.jf.dexlib2.dexbacked.DexBackedDexFile;
import org.jf.dexlib2.dexbacked.DexBackedOdexFile; import org.jf.dexlib2.dexbacked.DexBackedOdexFile;
import org.jf.dexlib2.analysis.InlineMethodResolver; import org.jf.dexlib2.analysis.InlineMethodResolver;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
/** /**
* @author Ryszard Wiśniewski <brut.alll@gmail.com> * @author Ryszard Wiśniewski <brut.alll@gmail.com>
*/ */
public class SmaliDecoder { public class SmaliDecoder {
public static void decode(File apkFile, File outDir, String dexName, boolean debug, String debugLinePrefix, public static void decode(File apkFile, File outDir, String dexName, boolean bakdeb, int api)
boolean bakdeb, int api) throws AndrolibException { throws AndrolibException {
new SmaliDecoder(apkFile, outDir, dexName, debug, debugLinePrefix, bakdeb, api).decode(); new SmaliDecoder(apkFile, outDir, dexName, bakdeb, api).decode();
} }
private SmaliDecoder(File apkFile, File outDir, String dexName, boolean debug, String debugLinePrefix, private SmaliDecoder(File apkFile, File outDir, String dexName, boolean bakdeb, int api) {
boolean bakdeb, int api) {
mApkFile = apkFile; mApkFile = apkFile;
mOutDir = outDir.toPath(); mOutDir = outDir;
mDexFile = dexName; mDexFile = dexName;
mDebug = debug;
mDebugLinePrefix = debugLinePrefix;
mBakDeb = bakdeb; mBakDeb = bakdeb;
mApi = api; mApi = api;
} }
private void decode() throws AndrolibException { private void decode() throws AndrolibException {
try { try {
ClassPath.dontLoadClassPath = mDebug;
baksmaliOptions options = new baksmaliOptions(); baksmaliOptions options = new baksmaliOptions();
// options // options
options.deodex = false; options.deodex = false;
options.outputDirectory = mOutDir.toAbsolutePath().toString(); options.outputDirectory = mOutDir.toString();
options.noParameterRegisters = false; options.noParameterRegisters = false;
options.useLocalsDirective = true; options.useLocalsDirective = true;
options.useSequentialLabels = true; options.useSequentialLabels = true;
@ -73,22 +59,16 @@ public class SmaliDecoder {
options.addCodeOffsets = false; options.addCodeOffsets = false;
options.jobs = -1; options.jobs = -1;
options.noAccessorComments = false; options.noAccessorComments = false;
options.registerInfo = (mDebug ? baksmaliOptions.DIFFPRE : 0); options.registerInfo = 0;
options.ignoreErrors = false; options.ignoreErrors = false;
options.inlineResolver = null; options.inlineResolver = null;
options.checkPackagePrivateAccess = false; options.checkPackagePrivateAccess = false;
// set jobs automatically // set jobs automatically
if (options.jobs <= 0) {
if (mDebug) {
options.jobs = 1;
} else {
options.jobs = Runtime.getRuntime().availableProcessors(); options.jobs = Runtime.getRuntime().availableProcessors();
if (options.jobs > 6) { if (options.jobs > 6) {
options.jobs = 6; options.jobs = 6;
} }
}
}
// create the dex // create the dex
DexBackedDexFile dexFile = DexFileFactory.loadDexFile(mApkFile, mDexFile, mApi, false); DexBackedDexFile dexFile = DexFileFactory.loadDexFile(mApkFile, mDexFile, mApi, false);
@ -103,53 +83,14 @@ public class SmaliDecoder {
} }
baksmali.disassembleDexFile(dexFile, options); baksmali.disassembleDexFile(dexFile, options);
if (mDebug) {
Files.walkFileTree(mOutDir, new SmaliFileVisitor());
}
} catch (IOException ex) { } catch (IOException ex) {
throw new AndrolibException(ex); throw new AndrolibException(ex);
} }
} }
private final File mApkFile; private final File mApkFile;
private final Path mOutDir; private final File mOutDir;
private final boolean mDebug;
private final String mDebugLinePrefix;
private final String mDexFile; private final String mDexFile;
private final boolean mBakDeb; private final boolean mBakDeb;
private final int mApi; private final int mApi;
private class SmaliFileVisitor extends SimpleFileVisitor<Path> {
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
String fileName = file.getFileName().toString();
if (! fileName.endsWith(".smali")) {
return FileVisitResult.CONTINUE;
}
fileName = fileName.substring(0, fileName.length() - 6);
try (
BufferedReader in = Files.newBufferedReader(file, Charset.defaultCharset());
BufferedWriter out = Files.newBufferedWriter(
file.resolveSibling(fileName + ".java"), Charset.defaultCharset())
) {
TypeName type = TypeName.fromPath(mOutDir.relativize(file.resolveSibling(fileName)));
out.write("package " + type.package_ + "; class " + type.getName(true, true) + " { void a() { int a;");
out.newLine();
String line;
final String debugLinePrefix = mDebugLinePrefix;
while ((line = in.readLine()) != null) {
out.write(debugLinePrefix);
out.write(line);
out.newLine();
}
out.write("}}");
out.newLine();
}
Files.delete(file);
return FileVisitResult.CONTINUE;
}
}
} }

View File

@ -1,212 +0,0 @@
/**
* Copyright 2014 Ryszard Wiśniewski <brut.alll@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package brut.androlib.src;
import brut.androlib.AndrolibException;
import brut.util.Duo;
import com.google.common.base.Joiner;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* @author Ryszard Wiśniewski <brut.alll@gmail.com>
*/
public class TypeName {
public final String package_;
public final String type;
public final String innerType;
public final int array;
public TypeName(String type, int array) {
this(null, type, null, array);
}
public TypeName(String package_, String type, String innerType, int array) {
this.package_ = package_;
this.type = type;
this.innerType = innerType;
this.array = array;
}
public String getShortenedName() {
return getName("java.lang".equals(package_), isFileOwner());
}
public String getName() {
return getName(false, false);
}
public String getName(boolean excludePackage, boolean separateInner) {
String name = (package_ == null || excludePackage ? "" : package_ + '.')
+ type
+ (innerType != null ? (separateInner ? '$' : '.') + innerType
: "");
for (int i = 0; i < array; i++) {
name += "[]";
}
return name;
}
public String getJavaFilePath() {
return getFilePath(isFileOwner()) + ".java";
}
public String getSmaliFilePath() {
return getFilePath(true) + ".smali";
}
public String getFilePath(boolean separateInner) {
return package_.replace('.', File.separatorChar) + File.separatorChar
+ type + (separateInner && isInner() ? "$" + innerType : "");
}
public boolean isInner() {
return innerType != null;
}
public boolean isArray() {
return array != 0;
}
public boolean isFileOwner() {
if (mIsFileOwner == null) {
mIsFileOwner = true;
if (isInner()) {
char c = innerType.charAt(0);
if (c < '0' || c > '9') {
mIsFileOwner = false;
}
}
}
return mIsFileOwner;
}
@Override
public String toString() {
return getName();
}
public static TypeName fromInternalName(String internal)
throws AndrolibException {
Duo<TypeName, Integer> duo = fetchFromInternalName(internal);
if (duo.m2 != internal.length()) {
throw new AndrolibException("Invalid internal name: " + internal);
}
return duo.m1;
}
public static List<TypeName> listFromInternalName(String internal)
throws AndrolibException {
List<TypeName> types = new ArrayList<TypeName>();
while (!internal.isEmpty()) {
Duo<TypeName, Integer> duo = fetchFromInternalName(internal);
types.add(duo.m1);
internal = internal.substring(duo.m2);
}
return types;
}
public static TypeName fromPath(Path path) {
List<String> parts = new ArrayList<>(path.getNameCount());
for (Path p : path) {
parts.add(p.toString());
}
return fromNameParts(parts, 0);
}
public static TypeName fromNameParts(List<String> parts, int array) {
String type = parts.get(parts.size() - 1);
parts = parts.subList(0, parts.size() - 1);
String innerType = null;
int pos = type.indexOf('$');
if (pos != -1) {
innerType = type.substring(pos + 1);
type = type.substring(0, pos);
}
return new TypeName(Joiner.on('.').join(parts), type, innerType, array);
}
public static Duo<TypeName, Integer> fetchFromInternalName(String internal)
throws AndrolibException {
String origInternal = internal;
int array = 0;
boolean isArray = false;
do {
if (internal.isEmpty()) {
throw new AndrolibException("Invalid internal name: "
+ origInternal);
}
isArray = internal.charAt(0) == '[';
if (isArray) {
array++;
internal = internal.substring(1);
}
} while (isArray);
int length = array + 1;
String type;
switch (internal.charAt(0)) {
case 'B':
type = "byte";
break;
case 'C':
type = "char";
break;
case 'D':
type = "double";
break;
case 'F':
type = "float";
break;
case 'I':
type = "int";
break;
case 'J':
type = "long";
break;
case 'S':
type = "short";
break;
case 'Z':
type = "boolean";
break;
case 'V':
type = "void";
break;
case 'L':
int pos = internal.indexOf(';');
if (pos == -1) {
throw new AndrolibException("Invalid internal name: "
+ origInternal);
}
return new Duo<>(fromNameParts(Arrays.asList(internal.substring(1, pos).split("/")), array), length + pos);
default:
throw new AndrolibException("Invalid internal name: "
+ origInternal);
}
return new Duo<>(new TypeName(null, type, null, array), length);
}
private Boolean mIsFileOwner;
}

View File

@ -25,10 +25,6 @@ buildscript {
} }
} }
plugins {
id 'net.minecrell.gitpatcher' version '0.7.1'
}
apply plugin: 'maven' apply plugin: 'maven'
apply from: 'gradle/functions.gradle' apply from: 'gradle/functions.gradle'
@ -78,22 +74,10 @@ build.doFirst {
} }
} }
clean.doFirst {
delete "${rootDir}/brut.apktool.smali"
println "deleting ${rootDir}/brut.apktool.smali in favor of smali"
println "You will need to run applyPatches again, as they have been wiped."
}
// used for official releases only. Please don't use // used for official releases only. Please don't use
task release { task release {
} }
patches {
submodule = 'smali'
target = file('brut.apktool.smali')
patches = file('gradle/smali-patches')
}
subprojects { subprojects {
apply plugin: 'java' apply plugin: 'java'
apply plugin: 'maven' apply plugin: 'maven'
@ -103,6 +87,7 @@ subprojects {
depends = [ depends = [
antlr: 'org.antlr:antlr:3.5', antlr: 'org.antlr:antlr:3.5',
antlr_runtime: 'org.antlr:antlr-runtime:3.5', antlr_runtime: 'org.antlr:antlr-runtime:3.5',
baksmali: 'org.smali:baksmali:2.1.1',
commons_cli: 'commons-cli:commons-cli:1.2', commons_cli: 'commons-cli:commons-cli:1.2',
commons_io: 'commons-io:commons-io:2.4', commons_io: 'commons-io:commons-io:2.4',
commons_lang: 'org.apache.commons:commons-lang3:3.1', commons_lang: 'org.apache.commons:commons-lang3:3.1',
@ -112,6 +97,7 @@ subprojects {
junit: 'junit:junit:4.6', junit: 'junit:junit:4.6',
proguard_gradle: 'net.sf.proguard:proguard-gradle:5.2.1', proguard_gradle: 'net.sf.proguard:proguard-gradle:5.2.1',
snakeyaml: 'org.yaml:snakeyaml:1.12', snakeyaml: 'org.yaml:snakeyaml:1.12',
smali: 'org.smali:smali:2.1.1',
xmlpull: 'xpp3:xpp3:1.1.4c', xmlpull: 'xpp3:xpp3:1.1.4c',
xmlunit: 'xmlunit:xmlunit:1.3', xmlunit: 'xmlunit:xmlunit:1.3',
] ]

View File

@ -1,68 +0,0 @@
From 687b92094889a90a70afc4e153ac24659a7e2beb Mon Sep 17 00:00:00 2001
From: Connor Tumbleson <connor.tumbleson@gmail.com>
Date: Wed, 14 Oct 2015 06:08:13 -0500
Subject: baksmali: added DIFFPRE reg info
---
.../Adaptors/PreInstructionRegisterInfoMethodItem.java | 18 ++++++++++++++++++
.../src/main/java/org/jf/baksmali/baksmaliOptions.java | 2 ++
2 files changed, 20 insertions(+)
diff --git a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java
index f532938..5699cf0 100644
--- a/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java
+++ b/baksmali/src/main/java/org/jf/baksmali/Adaptors/PreInstructionRegisterInfoMethodItem.java
@@ -40,6 +40,8 @@ import java.io.IOException;
import java.util.BitSet;
public class PreInstructionRegisterInfoMethodItem extends MethodItem {
+ private static AnalyzedInstruction lastInstruction;
+
private final int registerInfo;
@Nonnull private final MethodAnalyzer methodAnalyzer;
@Nonnull private final RegisterFormatter registerFormatter;
@@ -77,6 +79,9 @@ public class PreInstructionRegisterInfoMethodItem extends MethodItem {
if ((registerInfo & baksmaliOptions.ARGS) != 0) {
addArgsRegs(registers);
}
+ if ((registerInfo & baksmaliOptions.DIFFPRE) != 0) {
+ addDiffRegs(registers);
+ }
if ((registerInfo & baksmaliOptions.MERGE) != 0) {
if (analyzedInstruction.isBeginningInstruction()) {
addParamRegs(registers, registerCount);
@@ -144,6 +149,19 @@ public class PreInstructionRegisterInfoMethodItem extends MethodItem {
}
}
+ private void addDiffRegs(BitSet registers) {
+ if (! analyzedInstruction.isBeginningInstruction()) {
+ for (int i = 0; i < analyzedInstruction.getRegisterCount(); i++) {
+ if (lastInstruction.getPreInstructionRegisterType(i).category !=
+ analyzedInstruction.getPreInstructionRegisterType(i).category) {
+ registers.set(i);
+ }
+ }
+ }
+
+ lastInstruction = analyzedInstruction;
+ }
+
private void addMergeRegs(BitSet registers, int registerCount) {
if (analyzedInstruction.getPredecessorCount() <= 1) {
//in the common case of an instruction that only has a single predecessor which is the previous
diff --git a/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java b/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java
index 5dd060f..fc2ffc5 100644
--- a/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java
+++ b/baksmali/src/main/java/org/jf/baksmali/baksmaliOptions.java
@@ -53,6 +53,8 @@ public class baksmaliOptions {
public static final int MERGE = 32;
public static final int FULLMERGE = 64;
+ public static final int DIFFPRE = 128;
+
public int apiLevel = 15;
public String outputDirectory = "out";
@Nullable public String dexEntry = null;
--
2.1.4

View File

@ -1,58 +0,0 @@
From eaa6a9f04b582644a40054532dac3a93c01a5fe7 Mon Sep 17 00:00:00 2001
From: Connor Tumbleson <connor.tumbleson@gmail.com>
Date: Wed, 14 Oct 2015 06:09:38 -0500
Subject: dexlib2: added "dontLoadClassPath"
---
dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java | 6 ++++++
dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java | 4 ++--
2 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java
index 9d0bb2d..513e73f 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/ClassPath.java
@@ -58,6 +58,8 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ClassPath {
+ public static boolean dontLoadClassPath = false;
+
@Nonnull private final TypeProto unknownClass;
@Nonnull private HashMap<String, ClassDef> availableClasses = Maps.newHashMap();
private final boolean checkPackagePrivateAccess;
@@ -171,6 +173,10 @@ public class ClassPath {
@Nonnull
public ClassDef getClassDef(String type) {
+ if (dontLoadClassPath) {
+ throw new UnresolvedClassException("Could not resolve class %s", type);
+ }
+
ClassDef ret = availableClasses.get(type);
if (ret == null) {
throw new UnresolvedClassException("Could not resolve class %s", type);
diff --git a/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java b/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java
index e634297..d853133 100644
--- a/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java
+++ b/dexlib2/src/main/java/org/jf/dexlib2/analysis/MethodAnalyzer.java
@@ -1230,7 +1230,7 @@ public class MethodAnalyzer {
ThreeRegisterInstruction instruction = (ThreeRegisterInstruction)analyzedInstruction.instruction;
RegisterType arrayRegisterType = analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterB());
- if (arrayRegisterType.category != RegisterType.NULL) {
+ if (! ClassPath.dontLoadClassPath && arrayRegisterType.category != RegisterType.NULL) {
if (arrayRegisterType.category != RegisterType.REFERENCE ||
!(arrayRegisterType.type instanceof ArrayProto)) {
throw new AnalysisException("aget-wide used with non-array register: %s", arrayRegisterType.toString());
@@ -1261,7 +1261,7 @@ public class MethodAnalyzer {
ThreeRegisterInstruction instruction = (ThreeRegisterInstruction)analyzedInstruction.instruction;
RegisterType arrayRegisterType = analyzedInstruction.getPreInstructionRegisterType(instruction.getRegisterB());
- if (arrayRegisterType.category != RegisterType.NULL) {
+ if (! ClassPath.dontLoadClassPath && arrayRegisterType.category != RegisterType.NULL) {
if (arrayRegisterType.category != RegisterType.REFERENCE ||
!(arrayRegisterType.type instanceof ArrayProto)) {
throw new AnalysisException("aget-object used with non-array register: %s",
--
2.1.4

View File

@ -1,69 +0,0 @@
From 3d810d1b2b0f8f08286bf5c4e8d27cbd43ae21ed Mon Sep 17 00:00:00 2001
From: Connor Tumbleson <connor.tumbleson@gmail.com>
Date: Wed, 14 Oct 2015 06:15:45 -0500
Subject: baksmali: add apktool build.gradle changes
---
baksmali/build.gradle | 29 ++++-------------------------
1 file changed, 4 insertions(+), 25 deletions(-)
diff --git a/baksmali/build.gradle b/baksmali/build.gradle
index 4780cd7..59eb352 100644
--- a/baksmali/build.gradle
+++ b/baksmali/build.gradle
@@ -39,23 +39,18 @@ buildscript {
}
dependencies {
- compile project(':util')
- compile project(':dexlib2')
+ compile project(':brut.apktool.smali:util')
+ compile project(':brut.apktool.smali:dexlib2')
compile depends.commons_cli
compile depends.guava
testCompile depends.junit
- testCompile project(':smali')
+ testCompile project(':brut.apktool.smali:smali')
}
processResources.inputs.property('version', version)
processResources.expand('version': version)
-// This is the jar that gets uploaded to maven
-jar {
- baseName = 'maven'
-}
-
// Build a separate jar that contains all dependencies
task fatJar(type: Jar) {
from sourceSets.main.output
@@ -64,25 +59,9 @@ task fatJar(type: Jar) {
manifest {
attributes('Main-Class': 'org.jf.baksmali.main')
}
-
- doLast {
- if (!System.getProperty('os.name').toLowerCase().contains('windows')) {
- ant.symlink(link: file("${destinationDir}/baksmali.jar"), resource: archivePath, overwrite: true)
- }
- }
}
-tasks.getByPath('build').dependsOn(fatJar)
-uploadArchives {
- repositories.mavenDeployer {
- pom.project {
- description 'baksmali is a disassembler for dalvik bytecode'
- scm {
- url 'https://github.com/JesusFreke/smali/tree/master/baksmali'
- }
- }
- }
-}
+tasks.getByPath('build').dependsOn(fatJar)
task proguard(type: proguard.gradle.ProGuardTask, dependsOn: fatJar) {
def outFile = fatJar.destinationDir.getPath() + '/' + fatJar.baseName + '-' + fatJar.version + '-small' + '.' + fatJar.extension
--
2.1.4

View File

@ -1,142 +0,0 @@
From 915202a77b6a3d5af044b2ad487f4ce02c2edd7c Mon Sep 17 00:00:00 2001
From: Connor Tumbleson <connor.tumbleson@gmail.com>
Date: Wed, 14 Oct 2015 06:16:41 -0500
Subject: base: add apktool build.gradle changes
---
build.gradle | 97 +-----------------------------------------------------------
1 file changed, 1 insertion(+), 96 deletions(-)
diff --git a/build.gradle b/build.gradle
index 237d30e..36af3a7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -38,7 +38,7 @@ def jarVersion = version
if (!('release' in gradle.startParameter.taskNames)) {
def versionSuffix
try {
- def git = org.eclipse.jgit.api.Git.open(file('.'))
+ def git = org.eclipse.jgit.api.Git.open(file('../.'))
def head = git.getRepository().getRef('HEAD')
versionSuffix = head.getObjectId().abbreviate(8).name()
@@ -57,21 +57,8 @@ if (!('release' in gradle.startParameter.taskNames)) {
// use something like module-1.2.3-dev.jar for the jar name, rather than the full
// module-1.2.3-001afe02-dirty.jar
jarVersion = baseVersion + '-dev'
-} else {
- if (System.env.JDK6_HOME == null && !JavaVersion.current().isJava6()) {
- throw new InvalidUserDataException("bzzzzzzzt. Release builds must be performed with java 6. " +
- "Either run gradle with java 6, or define the JDK6_HOME environment variable.")
- }
-}
-
-// Note: please don't use this. This is strictly for the official releases
-// that are posted on, e.g. the bitbucket download page.
-task release() {
}
-// The projects that get pushed to maven
-def maven_release_projects = ['smali', 'baksmali', 'dexlib2', 'util']
-
subprojects {
apply plugin: 'java'
apply plugin: 'idea'
@@ -84,19 +71,6 @@ subprojects {
}
}
- if (System.env.JDK6_HOME != null) {
- sourceCompatibility = 1.6
- targetCompatibility = 1.6
-
- tasks.withType(JavaCompile) {
- doFirst {
- options.fork = true
- options.bootClasspath = "$System.env.JDK6_HOME/jre/lib/rt.jar"
- options.bootClasspath += "$File.pathSeparator$System.env.JDK6_HOME/jre/lib/jsse.jar"
- }
- }
- }
-
version = parent.version
ext {
@@ -121,75 +95,6 @@ subprojects {
repositories {
mavenCentral()
}
-
- if (project.name in maven_release_projects) {
- apply plugin: 'maven'
- apply plugin: 'signing'
-
- group = 'org.smali'
-
- task javadocJar(type: Jar, dependsOn: javadoc) {
- classifier = 'javadoc'
- from 'build/docs/javadoc'
- }
-
- task sourcesJar(type: Jar) {
- classifier = 'sources'
- from sourceSets.main.allJava
- }
-
- artifacts {
- archives javadocJar
- archives sourcesJar
- }
-
- signing {
- required { gradle.taskGraph.hasTask('uploadArchives') }
- sign configurations.archives
- }
-
- uploadArchives {
- repositories.mavenDeployer {
- configuration = configurations.archives
-
- beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
-
- if (rootProject.hasProperty('sonatypeUsername') && rootProject.hasProperty('sonatypePassword')) {
- repository(url: 'https://oss.sonatype.org/service/local/staging/deploy/maven2/') {
- authentication(userName: sonatypeUsername, password: sonatypePassword)
- }
- }
-
- pom.artifactId = project.name
-
- pom.project {
- name project.name
- url 'http://smali.org'
- packaging 'jar'
- licenses {
- license {
- name 'The BSD 3-Clause License'
- url 'http://opensource.org/licenses/BSD-3-Clause'
- distribution 'repo'
- }
- }
- scm {
- connection 'scm:git:git://github.com/JesusFreke/smali.git'
- developerConnection 'scm:git:git@github.com:JesusFreke/smali.git'
- }
- developers {
- developer {
- id 'jesusfreke'
- name 'Ben Gruver'
- email 'jesusfreke@jesusfreke.com'
- }
- }
- }
- }
- }
-
- tasks.getByPath(':release').dependsOn(uploadArchives)
- }
}
buildscript {
--
2.1.4

View File

@ -1,55 +0,0 @@
From 88ad24a648ca190e0e39e69fcb9fc9687edb58ec Mon Sep 17 00:00:00 2001
From: Connor Tumbleson <connor.tumbleson@gmail.com>
Date: Wed, 14 Oct 2015 06:17:13 -0500
Subject: dexlib2: add apktool build.gradle changes
---
dexlib2/accessorTestGenerator/build.gradle | 2 +-
dexlib2/build.gradle | 13 +------------
2 files changed, 2 insertions(+), 13 deletions(-)
diff --git a/dexlib2/accessorTestGenerator/build.gradle b/dexlib2/accessorTestGenerator/build.gradle
index e50bdc0..e242ae0 100644
--- a/dexlib2/accessorTestGenerator/build.gradle
+++ b/dexlib2/accessorTestGenerator/build.gradle
@@ -30,7 +30,7 @@
*/
dependencies {
- compile project(':util')
+ compile project(':brut.apktool.smali:util')
compile 'com.google.code.findbugs:jsr305:1.3.9'
compile 'com.google.guava:guava:13.0.1'
compile 'org.antlr:ST4:4.0.7'
diff --git a/dexlib2/build.gradle b/dexlib2/build.gradle
index 8fbe5ff..82b71b5 100644
--- a/dexlib2/build.gradle
+++ b/dexlib2/build.gradle
@@ -46,7 +46,7 @@ configurations {
}
dependencies {
- compile project(':util')
+ compile project(':brut.apktool.smali:util')
compile depends.findbugs
compile depends.guava
@@ -91,15 +91,4 @@ task generateAccessorTestDex(type: JavaExec, dependsOn: compileAccessorTestJava)
args '--no-strict'
args "--output=${outputDex}"
args sourceSets.accessorTest.output.classesDir
-}
-
-uploadArchives {
- repositories.mavenDeployer {
- pom.project {
- description 'dexlib2 is a library for reading/modifying/writing Android dex files'
- scm {
- url 'https://github.com/JesusFreke/smali/tree/master/dexlib2'
- }
- }
- }
}
\ No newline at end of file
--
2.1.4

View File

@ -1,69 +0,0 @@
From b23132a5a7b5bc7f6d267e621194565a607cab85 Mon Sep 17 00:00:00 2001
From: Connor Tumbleson <connor.tumbleson@gmail.com>
Date: Wed, 14 Oct 2015 06:17:39 -0500
Subject: smali: add apktool build.gradle changes
---
smali/build.gradle | 26 ++------------------------
1 file changed, 2 insertions(+), 24 deletions(-)
diff --git a/smali/build.gradle b/smali/build.gradle
index 0e5cbf2..d387c7f 100644
--- a/smali/build.gradle
+++ b/smali/build.gradle
@@ -68,8 +68,8 @@ idea {
}
dependencies {
- compile project(':util')
- compile project(':dexlib2')
+ compile project(':brut.apktool.smali:util')
+ compile project(':brut.apktool.smali:dexlib2')
compile depends.antlr_runtime
compile depends.stringtemplate
compile depends.commons_cli
@@ -83,11 +83,6 @@ dependencies {
processResources.inputs.property('version', version)
processResources.expand('version': version)
-// This is the jar that gets uploaded to maven
-jar {
- baseName = 'maven'
-}
-
// Build a separate jar that contains all dependencies
task fatJar(type: Jar, dependsOn: jar) {
from sourceSets.main.output
@@ -96,12 +91,6 @@ task fatJar(type: Jar, dependsOn: jar) {
manifest {
attributes('Main-Class': 'org.jf.smali.main')
}
-
- doLast {
- if (!System.getProperty('os.name').toLowerCase().contains('windows')) {
- ant.symlink(link: file("${destinationDir}/smali.jar"), resource: archivePath, overwrite: true)
- }
- }
}
tasks.getByPath('build').dependsOn(fatJar)
@@ -117,17 +106,6 @@ generateJFlexSource {
outputDirectory = new File(outputDirectory, 'org/jf/smali')
}
-uploadArchives {
- repositories.mavenDeployer {
- pom.project {
- description 'smali is an assembler for dalvik bytecode'
- scm {
- url 'https://github.com/JesusFreke/smali/tree/master/smali'
- }
- }
- }
-}
-
task proguard(type: proguard.gradle.ProGuardTask, dependsOn: fatJar) {
def outFile = fatJar.destinationDir.getPath() + '/' + fatJar.baseName + '-' +
fatJar.version + '-small' + '.' + fatJar.extension
--
2.1.4

View File

@ -1,32 +0,0 @@
From cee3b393b9477db6047e489bc0e4ba89c687f723 Mon Sep 17 00:00:00 2001
From: Connor Tumbleson <connor.tumbleson@gmail.com>
Date: Wed, 14 Oct 2015 06:18:02 -0500
Subject: util: add apktool build.gradle changes
---
util/build.gradle | 11 -----------
1 file changed, 11 deletions(-)
diff --git a/util/build.gradle b/util/build.gradle
index 407ef71..6dbd7a0 100644
--- a/util/build.gradle
+++ b/util/build.gradle
@@ -34,15 +34,4 @@ dependencies {
compile depends.findbugs
compile depends.guava
testCompile depends.junit
-}
-
-uploadArchives {
- repositories.mavenDeployer {
- pom.project {
- description 'This library contains random utilities used by smali/baksmali/dexlib2'
- scm {
- url 'https://github.com/JesusFreke/smali/tree/master/util'
- }
- }
- }
}
\ No newline at end of file
--
2.1.4

View File

@ -1,10 +1,5 @@
include 'brut.j.common', include 'brut.j.common',
'brut.j.util', 'brut.j.util',
'brut.j.dir', 'brut.j.dir',
'brut.apktool.smali:util',
'brut.apktool.smali:dexlib2',
'brut.apktool.smali:baksmali',
'brut.apktool.smali:smali',
'brut.apktool.smali:dexlib2:accessorTestGenerator',
'brut.apktool:apktool-lib', 'brut.apktool:apktool-lib',
'brut.apktool:apktool-cli' 'brut.apktool:apktool-cli'

1
smali

@ -1 +0,0 @@
Subproject commit 398630dde5a2370ead0f3ca43c59d896e6fdab60