mirror of
https://github.com/revanced/smali.git
synced 2025-05-08 10:24:31 +02:00
Adding initial sources for baksmali
git-svn-id: https://smali.googlecode.com/svn/trunk@143 55b6fa8a-2a1e-11de-a435-ffa8d773f76a
This commit is contained in:
parent
d82bf813d7
commit
36836121d7
25
baksmali/src/main/java/org/jf/baksmali/UsageException.java
Normal file
25
baksmali/src/main/java/org/jf/baksmali/UsageException.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2008 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* 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 org.jf.baksmali;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple exception class used to communicate that the command-line tool
|
||||||
|
* should print the usage message.
|
||||||
|
*/
|
||||||
|
public class UsageException extends RuntimeException {
|
||||||
|
// This space intentionally left blank.
|
||||||
|
}
|
56
baksmali/src/main/java/org/jf/baksmali/baksmali.java
Normal file
56
baksmali/src/main/java/org/jf/baksmali/baksmali.java
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
/*
|
||||||
|
* [The "BSD licence"]
|
||||||
|
* Copyright (c) 2009 Ben Gruver
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jf.baksmali;
|
||||||
|
|
||||||
|
import org.antlr.stringtemplate.StringTemplate;
|
||||||
|
import org.antlr.stringtemplate.StringTemplateGroup;
|
||||||
|
import org.jf.dexlib.DexFile;
|
||||||
|
import org.jf.baksmali.wrappers.ClassDefinition;
|
||||||
|
|
||||||
|
import java.io.FileReader;
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class baksmali {
|
||||||
|
public static void main(String[] args) throws Exception
|
||||||
|
{
|
||||||
|
String dexFileName = args[0];
|
||||||
|
String outputDir = args[1];
|
||||||
|
|
||||||
|
DexFile dexFile = new DexFile(new File(dexFileName));
|
||||||
|
|
||||||
|
StringTemplateGroup templates = new StringTemplateGroup(
|
||||||
|
new FileReader("src/main/resources/templates/baksmali.stg"));
|
||||||
|
|
||||||
|
StringTemplate smaliFileST = templates.getInstanceOf("smaliFile");
|
||||||
|
|
||||||
|
smaliFileST.setAttribute("classDef", new ClassDefinition(dexFile.ClassDefsSection.getByIndex(0)));
|
||||||
|
|
||||||
|
System.out.println(smaliFileST.toString());
|
||||||
|
}
|
||||||
|
}
|
131
baksmali/src/main/java/org/jf/baksmali/main.java
Normal file
131
baksmali/src/main/java/org/jf/baksmali/main.java
Normal file
@ -0,0 +1,131 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2007 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* 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 org.jf.baksmali;
|
||||||
|
|
||||||
|
import org.jf.baksmali.UsageException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main class for baksmali. It recognizes enough options to be able to dispatch
|
||||||
|
* to the right "actual" main.
|
||||||
|
*/
|
||||||
|
public class main {
|
||||||
|
|
||||||
|
public static final String VERSION = "0.9";
|
||||||
|
|
||||||
|
|
||||||
|
private static String USAGE_MESSAGE =
|
||||||
|
"usage:\n" +
|
||||||
|
" java -jar baksmali.jar --disassemble <.dex file> <output folder>\n" +
|
||||||
|
" disassembles the given dex file into a set of .smali files\n" +
|
||||||
|
" in the given folder\n" +
|
||||||
|
" java -jar baksmali.jar --version\n" +
|
||||||
|
" Print the version of this tool (" + VERSION +
|
||||||
|
").\n" +
|
||||||
|
" java -jar baksmali.jar --help\n" +
|
||||||
|
" Print this message.";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class is uninstantiable.
|
||||||
|
*/
|
||||||
|
private main() {
|
||||||
|
// This space intentionally left blank.
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run!
|
||||||
|
*/
|
||||||
|
public static void main(String[] args) {
|
||||||
|
boolean gotCmd = false;
|
||||||
|
boolean showUsage = false;
|
||||||
|
|
||||||
|
try {
|
||||||
|
for (int i = 0; i < args.length; i++) {
|
||||||
|
String arg = args[i];
|
||||||
|
if (arg.equals("--") || !arg.startsWith("--")) {
|
||||||
|
gotCmd = false;
|
||||||
|
showUsage = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
gotCmd = true;
|
||||||
|
if (arg.equals("--disassemble")) {
|
||||||
|
baksmali.main(without(args, i));
|
||||||
|
break;
|
||||||
|
} else if (arg.equals("--version")) {
|
||||||
|
version();
|
||||||
|
break;
|
||||||
|
} else if (arg.equals("--help")) {
|
||||||
|
showUsage = true;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
gotCmd = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (UsageException ex) {
|
||||||
|
showUsage = true;
|
||||||
|
} catch (RuntimeException ex) {
|
||||||
|
System.err.println("\nUNEXPECTED TOP-LEVEL EXCEPTION:");
|
||||||
|
ex.printStackTrace();
|
||||||
|
System.exit(2);
|
||||||
|
} catch (Throwable ex) {
|
||||||
|
System.err.println("\nUNEXPECTED TOP-LEVEL ERROR:");
|
||||||
|
ex.printStackTrace();
|
||||||
|
System.exit(3);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gotCmd) {
|
||||||
|
System.err.println("error: no command specified");
|
||||||
|
showUsage = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (showUsage) {
|
||||||
|
usage();
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the version message.
|
||||||
|
*/
|
||||||
|
private static void version() {
|
||||||
|
System.err.println("baksmali version " + VERSION);
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prints the usage message.
|
||||||
|
*/
|
||||||
|
private static void usage() {
|
||||||
|
System.err.println(USAGE_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a copy of the given args array, but without the indicated
|
||||||
|
* element.
|
||||||
|
*
|
||||||
|
* @param orig non-null; original array
|
||||||
|
* @param n which element to omit
|
||||||
|
* @return non-null; new array
|
||||||
|
*/
|
||||||
|
private static String[] without(String[] orig, int n) {
|
||||||
|
int len = orig.length - 1;
|
||||||
|
String[] newa = new String[len];
|
||||||
|
System.arraycopy(orig, 0, newa, 0, n);
|
||||||
|
System.arraycopy(orig, n + 1, newa, n, len - n);
|
||||||
|
return newa;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,147 @@
|
|||||||
|
/*
|
||||||
|
* [The "BSD licence"]
|
||||||
|
* Copyright (c) 2009 Ben Gruver
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jf.baksmali.wrappers;
|
||||||
|
|
||||||
|
import org.jf.dexlib.ClassDefItem;
|
||||||
|
import org.jf.dexlib.TypeIdItem;
|
||||||
|
import org.jf.dexlib.ClassDataItem;
|
||||||
|
import org.jf.dexlib.util.AccessFlags;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class ClassDefinition {
|
||||||
|
private ClassDefItem classDefItem;
|
||||||
|
private ClassDataItem classDataItem;
|
||||||
|
|
||||||
|
public ClassDefinition(ClassDefItem classDefItem) {
|
||||||
|
this.classDefItem = classDefItem;
|
||||||
|
this.classDataItem = classDefItem.getClassData();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> accessFlags = null;
|
||||||
|
public List<String> getAccessFlags() {
|
||||||
|
if (accessFlags == null) {
|
||||||
|
accessFlags = new ArrayList<String>();
|
||||||
|
|
||||||
|
for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForClass(classDefItem.getAccessFlags())) {
|
||||||
|
accessFlags.add(accessFlag.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return accessFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String classType = null;
|
||||||
|
public String getClassType() {
|
||||||
|
if (classType == null) {
|
||||||
|
classType = classDefItem.getClassType().getTypeDescriptor();
|
||||||
|
}
|
||||||
|
return classType;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String superType = null;
|
||||||
|
public String getSuperType() {
|
||||||
|
if (superType == null) {
|
||||||
|
superType = classDefItem.getSuperclass().getTypeDescriptor();
|
||||||
|
}
|
||||||
|
return superType;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> interfaces = null;
|
||||||
|
public List<String> getInterfaces() {
|
||||||
|
if (interfaces == null) {
|
||||||
|
interfaces = new ArrayList<String>();
|
||||||
|
|
||||||
|
List<TypeIdItem> interfaceList = classDefItem.getInterfaces();
|
||||||
|
|
||||||
|
if (interfaceList != null) {
|
||||||
|
for (TypeIdItem typeIdItem: interfaceList) {
|
||||||
|
interfaces.add(typeIdItem.getTypeDescriptor());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return interfaces;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<FieldDefinition> staticFields = null;
|
||||||
|
public List<FieldDefinition> getStaticFields() {
|
||||||
|
if (staticFields == null) {
|
||||||
|
staticFields = new ArrayList<FieldDefinition>();
|
||||||
|
|
||||||
|
if (classDataItem != null) {
|
||||||
|
for (ClassDataItem.EncodedField field: classDataItem.getStaticFields()) {
|
||||||
|
staticFields.add(new FieldDefinition(field));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return staticFields;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<FieldDefinition> instanceFields = null;
|
||||||
|
public List<FieldDefinition> getInstanceFields() {
|
||||||
|
if (instanceFields == null) {
|
||||||
|
instanceFields = new ArrayList<FieldDefinition>();
|
||||||
|
|
||||||
|
if (classDataItem != null) {
|
||||||
|
for (ClassDataItem.EncodedField field: classDataItem.getInstanceFields()) {
|
||||||
|
instanceFields.add(new FieldDefinition(field));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return instanceFields;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<MethodDefinition> directMethods = null;
|
||||||
|
public List<MethodDefinition> getDirectMethods() {
|
||||||
|
if (directMethods == null) {
|
||||||
|
directMethods = new ArrayList<MethodDefinition>();
|
||||||
|
|
||||||
|
if (classDataItem != null) {
|
||||||
|
for (ClassDataItem.EncodedMethod method: classDataItem.getDirectMethods()) {
|
||||||
|
directMethods.add(new MethodDefinition(method));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return directMethods;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<MethodDefinition> virtualMethods = null;
|
||||||
|
public List<MethodDefinition> getVirtualMethods() {
|
||||||
|
if (virtualMethods == null) {
|
||||||
|
virtualMethods = new ArrayList<MethodDefinition>();
|
||||||
|
|
||||||
|
if (classDataItem != null) {
|
||||||
|
for (ClassDataItem.EncodedMethod method: classDataItem.getVirtualMethods()) {
|
||||||
|
virtualMethods.add(new MethodDefinition(method));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return virtualMethods;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,74 @@
|
|||||||
|
/*
|
||||||
|
* [The "BSD licence"]
|
||||||
|
* Copyright (c) 2009 Ben Gruver
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jf.baksmali.wrappers;
|
||||||
|
|
||||||
|
import org.jf.dexlib.ClassDataItem;
|
||||||
|
import org.jf.dexlib.FieldIdItem;
|
||||||
|
import org.jf.dexlib.util.AccessFlags;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class FieldDefinition {
|
||||||
|
private ClassDataItem.EncodedField encodedField;
|
||||||
|
private FieldIdItem fieldIdItem;
|
||||||
|
|
||||||
|
public FieldDefinition(ClassDataItem.EncodedField encodedField) {
|
||||||
|
this.encodedField = encodedField;
|
||||||
|
this.fieldIdItem = encodedField.getFieldReference();
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> accessFlags = null;
|
||||||
|
public List<String> getAccessFlags() {
|
||||||
|
if (accessFlags == null) {
|
||||||
|
accessFlags = new ArrayList<String>();
|
||||||
|
|
||||||
|
for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForField(encodedField.getAccessFlags())) {
|
||||||
|
accessFlags.add(accessFlag.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return accessFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String fieldName = null;
|
||||||
|
public String getFieldName() {
|
||||||
|
if (fieldName == null) {
|
||||||
|
fieldName = fieldIdItem.getFieldName().getStringValue();
|
||||||
|
}
|
||||||
|
return fieldName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String fieldType = null;
|
||||||
|
public String getFieldType() {
|
||||||
|
if (fieldType == null) {
|
||||||
|
fieldType = fieldIdItem.getFieldType().getTypeDescriptor();
|
||||||
|
}
|
||||||
|
return fieldType;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* [The "BSD licence"]
|
||||||
|
* Copyright (c) 2009 Ben Gruver
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* 3. The name of the author may not be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||||
|
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||||
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||||
|
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||||
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||||
|
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||||
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jf.baksmali.wrappers;
|
||||||
|
|
||||||
|
import org.jf.dexlib.ClassDataItem;
|
||||||
|
import org.jf.dexlib.CodeItem;
|
||||||
|
import org.jf.dexlib.MethodIdItem;
|
||||||
|
import org.jf.dexlib.code.Instruction;
|
||||||
|
import org.jf.dexlib.code.InstructionField;
|
||||||
|
import org.jf.dexlib.util.AccessFlags;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
|
public class MethodDefinition {
|
||||||
|
private ClassDataItem.EncodedMethod encodedMethod;
|
||||||
|
private MethodIdItem methodIdItem;
|
||||||
|
private CodeItem codeItem;
|
||||||
|
|
||||||
|
public MethodDefinition(ClassDataItem.EncodedMethod encodedMethod) {
|
||||||
|
this.encodedMethod = encodedMethod;
|
||||||
|
this.methodIdItem = encodedMethod.getMethod();
|
||||||
|
this.codeItem = encodedMethod.getCodeItem();
|
||||||
|
}
|
||||||
|
|
||||||
|
private String methodName = null;
|
||||||
|
public String getMethodName() {
|
||||||
|
if (methodName == null) {
|
||||||
|
methodName = methodIdItem.getMethodName();
|
||||||
|
}
|
||||||
|
return methodName;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> accessFlags = null;
|
||||||
|
public List<String> getAccessFlags() {
|
||||||
|
if (accessFlags == null) {
|
||||||
|
accessFlags = new ArrayList<String>();
|
||||||
|
|
||||||
|
for (AccessFlags accessFlag: AccessFlags.getAccessFlagsForMethod(encodedMethod.getAccessFlags())) {
|
||||||
|
accessFlags.add(accessFlag.toString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return accessFlags;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String prototype = null;
|
||||||
|
public String getPrototype() {
|
||||||
|
if (prototype == null) {
|
||||||
|
prototype = methodIdItem.getPrototype().getPrototypeString();
|
||||||
|
}
|
||||||
|
return prototype;
|
||||||
|
}
|
||||||
|
|
||||||
|
private Boolean hasCode = null;
|
||||||
|
public boolean getHasCode() {
|
||||||
|
if (hasCode == null) {
|
||||||
|
hasCode = (codeItem != null);
|
||||||
|
}
|
||||||
|
return hasCode;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String registerCount = null;
|
||||||
|
public String getRegisterCount() {
|
||||||
|
if (registerCount == null) {
|
||||||
|
if (codeItem == null) {
|
||||||
|
registerCount = "0";
|
||||||
|
} else {
|
||||||
|
registerCount = Integer.toString(codeItem.getRegisterCount());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return registerCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
//TODO: how best to abstract this? I don't like exposing dexlib's "Instruction" directly
|
||||||
|
private List<Instruction> instructions = null;
|
||||||
|
public List<Instruction> getInstructions() {
|
||||||
|
if (instructions == null) {
|
||||||
|
instructions = new ArrayList<Instruction>();
|
||||||
|
if (codeItem != null) {
|
||||||
|
for (InstructionField instruction: codeItem.getInstructions()) {
|
||||||
|
instructions.add(instruction.getInstruction());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return instructions;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user