Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
J
jadx
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open-source
jadx
Commits
35ee0a25
Commit
35ee0a25
authored
Jun 15, 2013
by
Skylot
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Replace StringBuilder append chain with strings concatenation
parent
60615d01
Show whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
71 additions
and
9 deletions
+71
-9
Consts.java
src/main/java/jadx/Consts.java
+2
-0
InsnGen.java
src/main/java/jadx/codegen/InsnGen.java
+16
-4
MethodInfo.java
src/main/java/jadx/dex/info/MethodInfo.java
+4
-0
InsnType.java
src/main/java/jadx/dex/instructions/InsnType.java
+2
-0
MethodNode.java
src/main/java/jadx/dex/nodes/MethodNode.java
+5
-5
CodeShrinker.java
src/main/java/jadx/dex/visitors/CodeShrinker.java
+42
-0
No files found.
src/main/java/jadx/Consts.java
View file @
35ee0a25
...
@@ -13,5 +13,7 @@ public class Consts {
...
@@ -13,5 +13,7 @@ public class Consts {
public
static
final
String
CLASS_THROWABLE
=
"java.lang.Throwable"
;
public
static
final
String
CLASS_THROWABLE
=
"java.lang.Throwable"
;
public
static
final
String
CLASS_ENUM
=
"java.lang.Enum"
;
public
static
final
String
CLASS_ENUM
=
"java.lang.Enum"
;
public
static
final
String
CLASS_STRING_BUILDER
=
"java.lang.StringBuilder"
;
public
static
final
String
DALVIK_SIGNATURE
=
"dalvik.annotation.Signature"
;
public
static
final
String
DALVIK_SIGNATURE
=
"dalvik.annotation.Signature"
;
}
}
src/main/java/jadx/codegen/InsnGen.java
View file @
35ee0a25
...
@@ -32,6 +32,7 @@ import jadx.utils.exceptions.CodegenException;
...
@@ -32,6 +32,7 @@ import jadx.utils.exceptions.CodegenException;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.EnumSet
;
import
java.util.EnumSet
;
import
java.util.HashMap
;
import
java.util.HashMap
;
import
java.util.Iterator
;
import
java.util.List
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.Map
;
import
java.util.Map.Entry
;
import
java.util.Map.Entry
;
...
@@ -213,7 +214,7 @@ public class InsnGen {
...
@@ -213,7 +214,7 @@ public class InsnGen {
case
RETURN:
case
RETURN:
if
(
insn
.
getArgsCount
()
!=
0
)
if
(
insn
.
getArgsCount
()
!=
0
)
code
.
add
(
"return "
+
arg
(
insn
.
getArg
(
0
)));
code
.
add
(
"return "
).
add
(
arg
(
insn
.
getArg
(
0
)));
else
else
code
.
add
(
"return"
);
code
.
add
(
"return"
);
break
;
break
;
...
@@ -227,7 +228,7 @@ public class InsnGen {
...
@@ -227,7 +228,7 @@ public class InsnGen {
break
;
break
;
case
THROW:
case
THROW:
code
.
add
(
"throw "
+
arg
(
insn
.
getArg
(
0
)));
code
.
add
(
"throw "
).
add
(
arg
(
insn
.
getArg
(
0
)));
break
;
break
;
case
CMP_L:
case
CMP_L:
...
@@ -281,7 +282,7 @@ public class InsnGen {
...
@@ -281,7 +282,7 @@ public class InsnGen {
code
.
add
(
ifield
((
IndexInsnNode
)
insn
,
0
));
code
.
add
(
ifield
((
IndexInsnNode
)
insn
,
0
));
break
;
break
;
case
IPUT:
case
IPUT:
code
.
add
(
ifield
((
IndexInsnNode
)
insn
,
1
)
+
" = "
+
arg
(
insn
.
getArg
(
0
)));
code
.
add
(
ifield
((
IndexInsnNode
)
insn
,
1
)
).
add
(
" = "
).
add
(
arg
(
insn
.
getArg
(
0
)));
break
;
break
;
case
SGET:
case
SGET:
...
@@ -290,7 +291,18 @@ public class InsnGen {
...
@@ -290,7 +291,18 @@ public class InsnGen {
case
SPUT:
case
SPUT:
IndexInsnNode
node
=
(
IndexInsnNode
)
insn
;
IndexInsnNode
node
=
(
IndexInsnNode
)
insn
;
fieldPut
(
node
);
fieldPut
(
node
);
code
.
add
(
sfield
(
node
)
+
" = "
+
arg
(
node
.
getArg
(
0
)));
code
.
add
(
sfield
(
node
)).
add
(
" = "
).
add
(
arg
(
node
.
getArg
(
0
)));
break
;
case
STR_CONCAT:
// TODO: wrap in braces only if necessary
code
.
add
(
'('
);
for
(
Iterator
<
InsnArg
>
it
=
insn
.
getArguments
().
iterator
();
it
.
hasNext
();
)
{
code
.
add
(
arg
(
it
.
next
()));
if
(
it
.
hasNext
())
code
.
add
(
" + "
);
}
code
.
add
(
')'
);
break
;
break
;
case
MONITOR_ENTER:
case
MONITOR_ENTER:
...
...
src/main/java/jadx/dex/info/MethodInfo.java
View file @
35ee0a25
...
@@ -49,6 +49,10 @@ public final class MethodInfo {
...
@@ -49,6 +49,10 @@ public final class MethodInfo {
return
declClass
.
getFullName
()
+
"."
+
name
;
return
declClass
.
getFullName
()
+
"."
+
name
;
}
}
public
String
getFullId
()
{
return
declClass
.
getFullName
()
+
"."
+
shortId
;
}
/**
/**
* Method name and signature
* Method name and signature
*/
*/
...
...
src/main/java/jadx/dex/instructions/InsnType.java
View file @
35ee0a25
...
@@ -51,6 +51,8 @@ public enum InsnType {
...
@@ -51,6 +51,8 @@ public enum InsnType {
BREAK
,
BREAK
,
CONTINUE
,
CONTINUE
,
STR_CONCAT
,
// strings concatenation
TERNARY
,
TERNARY
,
ARGS
,
// just generate arguments
ARGS
,
// just generate arguments
...
...
src/main/java/jadx/dex/nodes/MethodNode.java
View file @
35ee0a25
...
@@ -65,12 +65,12 @@ public class MethodNode extends AttrNode implements ILoadable {
...
@@ -65,12 +65,12 @@ public class MethodNode extends AttrNode implements ILoadable {
private
IContainer
region
;
private
IContainer
region
;
private
List
<
ExceptionHandler
>
exceptionHandlers
;
private
List
<
ExceptionHandler
>
exceptionHandlers
;
public
MethodNode
(
ClassNode
classNode
,
Method
mth
)
{
public
MethodNode
(
ClassNode
classNode
,
Method
mth
Data
)
{
this
.
mthInfo
=
MethodInfo
.
fromDex
(
classNode
.
dex
(),
mth
.
getMethodIndex
());
this
.
mthInfo
=
MethodInfo
.
fromDex
(
classNode
.
dex
(),
mth
Data
.
getMethodIndex
());
this
.
parentClass
=
classNode
;
this
.
parentClass
=
classNode
;
this
.
accFlags
=
new
AccessInfo
(
mth
.
getAccessFlags
(),
AFType
.
METHOD
);
this
.
accFlags
=
new
AccessInfo
(
mth
Data
.
getAccessFlags
(),
AFType
.
METHOD
);
this
.
methodData
=
mth
;
this
.
noCode
=
(
mthData
.
getCodeOffset
()
==
0
)
;
this
.
noCode
=
(
methodData
.
getCodeOffset
()
==
0
);
this
.
methodData
=
(
noCode
?
null
:
mthData
);
}
}
@Override
@Override
...
...
src/main/java/jadx/dex/visitors/CodeShrinker.java
View file @
35ee0a25
package
jadx
.
dex
.
visitors
;
package
jadx
.
dex
.
visitors
;
import
jadx.Consts
;
import
jadx.dex.attributes.AttributeFlag
;
import
jadx.dex.attributes.AttributeFlag
;
import
jadx.dex.info.MethodInfo
;
import
jadx.dex.instructions.ArithNode
;
import
jadx.dex.instructions.ArithNode
;
import
jadx.dex.instructions.ArithOp
;
import
jadx.dex.instructions.ArithOp
;
import
jadx.dex.instructions.IfNode
;
import
jadx.dex.instructions.IfNode
;
import
jadx.dex.instructions.InsnType
;
import
jadx.dex.instructions.InsnType
;
import
jadx.dex.instructions.InvokeNode
;
import
jadx.dex.instructions.args.InsnArg
;
import
jadx.dex.instructions.args.InsnArg
;
import
jadx.dex.instructions.args.InsnWrapArg
;
import
jadx.dex.instructions.args.InsnWrapArg
;
import
jadx.dex.instructions.args.LiteralArg
;
import
jadx.dex.instructions.args.LiteralArg
;
import
jadx.dex.instructions.args.RegisterArg
;
import
jadx.dex.instructions.args.RegisterArg
;
import
jadx.dex.instructions.mods.ConstructorInsn
;
import
jadx.dex.nodes.BlockNode
;
import
jadx.dex.nodes.BlockNode
;
import
jadx.dex.nodes.InsnNode
;
import
jadx.dex.nodes.InsnNode
;
import
jadx.dex.nodes.MethodNode
;
import
jadx.dex.nodes.MethodNode
;
...
@@ -16,6 +20,7 @@ import jadx.utils.BlockUtils;
...
@@ -16,6 +20,7 @@ import jadx.utils.BlockUtils;
import
jadx.utils.exceptions.JadxRuntimeException
;
import
jadx.utils.exceptions.JadxRuntimeException
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
import
java.util.List
;
import
org.slf4j.Logger
;
import
org.slf4j.Logger
;
...
@@ -154,12 +159,49 @@ public class CodeShrinker extends AbstractVisitor {
...
@@ -154,12 +159,49 @@ public class CodeShrinker extends AbstractVisitor {
}
}
break
;
break
;
case
INVOKE:
MethodInfo
callMth
=
((
InvokeNode
)
insn
).
getCallMth
();
if
(
callMth
.
getDeclClass
().
getFullName
().
equals
(
Consts
.
CLASS_STRING_BUILDER
)
&&
callMth
.
getShortId
().
equals
(
"toString()"
)
&&
insn
.
getArg
(
0
).
isInsnWrap
())
{
List
<
InsnNode
>
chain
=
flattenInsnChain
(
insn
);
if
(
chain
.
size
()
>
1
&&
chain
.
get
(
0
).
getType
()
==
InsnType
.
CONSTRUCTOR
)
{
ConstructorInsn
constr
=
(
ConstructorInsn
)
chain
.
get
(
0
);
if
(
constr
.
getClassType
().
getFullName
().
equals
(
Consts
.
CLASS_STRING_BUILDER
)
&&
constr
.
getArgsCount
()
==
0
)
{
int
len
=
chain
.
size
();
InsnNode
concatInsn
=
new
InsnNode
(
InsnType
.
STR_CONCAT
,
len
-
1
);
for
(
int
i
=
1
;
i
<
len
;
i
++)
{
concatInsn
.
addArg
(
chain
.
get
(
i
).
getArg
(
1
));
}
concatInsn
.
setResult
(
insn
.
getResult
());
return
concatInsn
;
}
}
}
break
;
default
:
default
:
break
;
break
;
}
}
return
null
;
return
null
;
}
}
private
static
List
<
InsnNode
>
flattenInsnChain
(
InsnNode
insn
)
{
List
<
InsnNode
>
chain
=
new
ArrayList
<
InsnNode
>();
InsnArg
i
=
insn
.
getArg
(
0
);
while
(
i
.
isInsnWrap
())
{
InsnNode
wrapInsn
=
((
InsnWrapArg
)
i
).
getWrapInsn
();
chain
.
add
(
wrapInsn
);
if
(
wrapInsn
.
getArgsCount
()
==
0
)
break
;
i
=
wrapInsn
.
getArg
(
0
);
}
Collections
.
reverse
(
chain
);
return
chain
;
}
public
static
InsnArg
inlineArgument
(
MethodNode
mth
,
RegisterArg
arg
)
{
public
static
InsnArg
inlineArgument
(
MethodNode
mth
,
RegisterArg
arg
)
{
InsnNode
assignInsn
=
arg
.
getAssignInsn
();
InsnNode
assignInsn
=
arg
.
getAssignInsn
();
if
(
assignInsn
==
null
)
if
(
assignInsn
==
null
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment