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
b4d08bdc
Commit
b4d08bdc
authored
May 02, 2013
by
Skylot
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Split Main class
parent
c7ed9857
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
137 additions
and
127 deletions
+137
-127
Jadx.java
src/main/java/jadx/Jadx.java
+123
-0
JadxArgs.java
src/main/java/jadx/JadxArgs.java
+2
-3
Main.java
src/main/java/jadx/Main.java
+12
-124
No files found.
src/main/java/jadx/Jadx.java
0 → 100644
View file @
b4d08bdc
package
jadx
;
import
jadx.codegen.CodeGen
;
import
jadx.dex.info.ClassInfo
;
import
jadx.dex.nodes.ClassNode
;
import
jadx.dex.nodes.RootNode
;
import
jadx.dex.visitors.BlockMakerVisitor
;
import
jadx.dex.visitors.ClassModifier
;
import
jadx.dex.visitors.CodeShrinker
;
import
jadx.dex.visitors.ConstInlinerVisitor
;
import
jadx.dex.visitors.DotGraphVisitor
;
import
jadx.dex.visitors.EnumVisitor
;
import
jadx.dex.visitors.FallbackModeVisitor
;
import
jadx.dex.visitors.IDexTreeVisitor
;
import
jadx.dex.visitors.MethodInlinerVisitor
;
import
jadx.dex.visitors.ModVisitor
;
import
jadx.dex.visitors.regions.CheckRegions
;
import
jadx.dex.visitors.regions.CleanRegions
;
import
jadx.dex.visitors.regions.PostRegionVisitor
;
import
jadx.dex.visitors.regions.ProcessVariables
;
import
jadx.dex.visitors.regions.RegionMakerVisitor
;
import
jadx.dex.visitors.typeresolver.FinishTypeResolver
;
import
jadx.dex.visitors.typeresolver.TypeResolver
;
import
jadx.utils.ErrorsCounter
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.TimeUnit
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
public
class
Jadx
{
private
static
final
Logger
LOG
=
LoggerFactory
.
getLogger
(
Jadx
.
class
);
static
{
if
(
Consts
.
DEBUG
)
LOG
.
info
(
"debug enabled"
);
if
(
Jadx
.
class
.
desiredAssertionStatus
())
LOG
.
info
(
"assertions enabled"
);
}
public
static
int
run
(
JadxArgs
args
)
{
int
errorCount
;
try
{
RootNode
root
=
new
RootNode
(
args
);
LOG
.
info
(
"loading ..."
);
root
.
load
();
LOG
.
info
(
"processing ..."
);
root
.
init
();
int
threadsCount
=
args
.
getThreadsCount
();
LOG
.
debug
(
"processing threads count: {}"
,
threadsCount
);
List
<
IDexTreeVisitor
>
passes
=
getPassesList
(
args
);
if
(
threadsCount
==
1
)
{
for
(
ClassNode
cls
:
root
.
getClasses
())
{
ProcessClass
job
=
new
ProcessClass
(
cls
,
passes
);
job
.
run
();
}
}
else
{
ExecutorService
executor
=
Executors
.
newFixedThreadPool
(
threadsCount
);
for
(
ClassNode
cls
:
root
.
getClasses
())
{
ProcessClass
job
=
new
ProcessClass
(
cls
,
passes
);
executor
.
execute
(
job
);
}
executor
.
shutdown
();
executor
.
awaitTermination
(
100
,
TimeUnit
.
DAYS
);
}
}
catch
(
Throwable
e
)
{
LOG
.
error
(
"jadx error:"
,
e
);
}
finally
{
errorCount
=
ErrorsCounter
.
getErrorCount
();
if
(
errorCount
!=
0
)
ErrorsCounter
.
printReport
();
// clear resources if we use jadx as a library
ClassInfo
.
clearCache
();
ErrorsCounter
.
reset
();
}
LOG
.
info
(
"done"
);
return
errorCount
;
}
private
static
List
<
IDexTreeVisitor
>
getPassesList
(
JadxArgs
args
)
{
List
<
IDexTreeVisitor
>
passes
=
new
ArrayList
<
IDexTreeVisitor
>();
if
(
args
.
isFallbackMode
())
{
passes
.
add
(
new
FallbackModeVisitor
());
}
else
{
passes
.
add
(
new
BlockMakerVisitor
());
passes
.
add
(
new
TypeResolver
());
passes
.
add
(
new
ConstInlinerVisitor
());
passes
.
add
(
new
FinishTypeResolver
());
if
(
args
.
isRawCFGOutput
())
passes
.
add
(
new
DotGraphVisitor
(
args
.
getOutDir
(),
false
,
true
));
passes
.
add
(
new
ModVisitor
());
passes
.
add
(
new
EnumVisitor
());
if
(
args
.
isCFGOutput
())
passes
.
add
(
new
DotGraphVisitor
(
args
.
getOutDir
(),
false
));
passes
.
add
(
new
RegionMakerVisitor
());
passes
.
add
(
new
PostRegionVisitor
());
passes
.
add
(
new
CodeShrinker
());
passes
.
add
(
new
ProcessVariables
());
passes
.
add
(
new
CheckRegions
());
if
(
args
.
isCFGOutput
())
passes
.
add
(
new
DotGraphVisitor
(
args
.
getOutDir
(),
true
));
passes
.
add
(
new
MethodInlinerVisitor
());
passes
.
add
(
new
ClassModifier
());
passes
.
add
(
new
CleanRegions
());
}
passes
.
add
(
new
CodeGen
(
args
));
return
passes
;
}
}
src/main/java/jadx/JadxArgs.java
View file @
b4d08bdc
...
...
@@ -51,10 +51,9 @@ public class JadxArgs {
private
final
List
<
InputFile
>
input
=
new
ArrayList
<
InputFile
>();
private
File
outputDir
;
public
void
parse
(
String
[]
args
)
throws
JadxException
{
public
void
parse
(
String
[]
args
)
{
try
{
new
JCommander
(
this
,
args
);
processArgs
();
}
catch
(
ParameterException
e
)
{
System
.
out
.
println
(
"Arguments parse error: "
+
e
.
getMessage
());
System
.
out
.
println
();
...
...
@@ -62,7 +61,7 @@ public class JadxArgs {
}
}
p
rivate
void
processArgs
()
throws
JadxException
{
p
ublic
void
processArgs
()
throws
JadxException
{
if
(
printHelp
)
return
;
...
...
src/main/java/jadx/Main.java
View file @
b4d08bdc
package
jadx
;
import
jadx.codegen.CodeGen
;
import
jadx.dex.info.ClassInfo
;
import
jadx.dex.nodes.ClassNode
;
import
jadx.dex.nodes.RootNode
;
import
jadx.dex.visitors.BlockMakerVisitor
;
import
jadx.dex.visitors.ClassModifier
;
import
jadx.dex.visitors.CodeShrinker
;
import
jadx.dex.visitors.ConstInlinerVisitor
;
import
jadx.dex.visitors.DotGraphVisitor
;
import
jadx.dex.visitors.EnumVisitor
;
import
jadx.dex.visitors.FallbackModeVisitor
;
import
jadx.dex.visitors.IDexTreeVisitor
;
import
jadx.dex.visitors.MethodInlinerVisitor
;
import
jadx.dex.visitors.ModVisitor
;
import
jadx.dex.visitors.regions.CheckRegions
;
import
jadx.dex.visitors.regions.CleanRegions
;
import
jadx.dex.visitors.regions.PostRegionVisitor
;
import
jadx.dex.visitors.regions.ProcessVariables
;
import
jadx.dex.visitors.regions.RegionMakerVisitor
;
import
jadx.dex.visitors.typeresolver.FinishTypeResolver
;
import
jadx.dex.visitors.typeresolver.TypeResolver
;
import
jadx.utils.ErrorsCounter
;
import
jadx.utils.exceptions.JadxException
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.TimeUnit
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
public
class
Main
{
private
static
final
Logger
LOG
=
LoggerFactory
.
getLogger
(
Main
.
class
);
static
{
if
(
Consts
.
DEBUG
)
LOG
.
info
(
"debug enabled"
);
if
(
Main
.
class
.
desiredAssertionStatus
())
LOG
.
info
(
"assertions enabled"
);
}
public
static
int
run
(
JadxArgs
args
)
{
int
errorCount
;
try
{
RootNode
root
=
new
RootNode
(
args
);
LOG
.
info
(
"loading ..."
);
root
.
load
();
LOG
.
info
(
"processing ..."
);
root
.
init
();
int
threadsCount
=
args
.
getThreadsCount
();
LOG
.
debug
(
"processing threads count: {}"
,
threadsCount
);
List
<
IDexTreeVisitor
>
passes
=
getPassesList
(
args
);
if
(
threadsCount
==
1
)
{
for
(
ClassNode
cls
:
root
.
getClasses
())
{
ProcessClass
job
=
new
ProcessClass
(
cls
,
passes
);
job
.
run
();
}
}
else
{
ExecutorService
executor
=
Executors
.
newFixedThreadPool
(
threadsCount
);
for
(
ClassNode
cls
:
root
.
getClasses
())
{
ProcessClass
job
=
new
ProcessClass
(
cls
,
passes
);
executor
.
execute
(
job
);
}
executor
.
shutdown
();
executor
.
awaitTermination
(
100
,
TimeUnit
.
DAYS
);
}
}
catch
(
Throwable
e
)
{
LOG
.
error
(
"jadx error:"
,
e
);
}
finally
{
errorCount
=
ErrorsCounter
.
getErrorCount
();
if
(
errorCount
!=
0
)
ErrorsCounter
.
printReport
();
// clear resources if we use jadx as a library
ClassInfo
.
clearCache
();
ErrorsCounter
.
reset
();
}
LOG
.
info
(
"done"
);
return
errorCount
;
}
private
static
List
<
IDexTreeVisitor
>
getPassesList
(
JadxArgs
args
)
{
List
<
IDexTreeVisitor
>
passes
=
new
ArrayList
<
IDexTreeVisitor
>();
if
(
args
.
isFallbackMode
())
{
passes
.
add
(
new
FallbackModeVisitor
());
}
else
{
passes
.
add
(
new
BlockMakerVisitor
());
passes
.
add
(
new
TypeResolver
());
passes
.
add
(
new
ConstInlinerVisitor
());
passes
.
add
(
new
FinishTypeResolver
());
if
(
args
.
isRawCFGOutput
())
passes
.
add
(
new
DotGraphVisitor
(
args
.
getOutDir
(),
false
,
true
));
passes
.
add
(
new
ModVisitor
());
passes
.
add
(
new
EnumVisitor
());
if
(
args
.
isCFGOutput
())
passes
.
add
(
new
DotGraphVisitor
(
args
.
getOutDir
(),
false
));
passes
.
add
(
new
RegionMakerVisitor
());
passes
.
add
(
new
PostRegionVisitor
());
passes
.
add
(
new
CodeShrinker
());
passes
.
add
(
new
ProcessVariables
());
passes
.
add
(
new
CheckRegions
());
if
(
args
.
isCFGOutput
())
passes
.
add
(
new
DotGraphVisitor
(
args
.
getOutDir
(),
true
));
passes
.
add
(
new
MethodInlinerVisitor
());
passes
.
add
(
new
ClassModifier
());
passes
.
add
(
new
CleanRegions
());
}
passes
.
add
(
new
CodeGen
(
args
));
return
passes
;
}
public
static
void
main
(
String
[]
args
)
{
JadxArgs
jadxArgs
=
new
JadxArgs
();
try
{
jadxArgs
.
parse
(
args
);
if
(
jadxArgs
.
isPrintHelp
())
{
jadxArgs
.
printUsage
();
System
.
exit
(
0
);
}
}
catch
(
JadxException
e
)
{
LOG
.
error
(
"Error: "
+
e
.
getMessage
());
System
.
exit
(
1
);
jadxArgs
.
parse
(
args
);
if
(
jadxArgs
.
isPrintHelp
())
{
jadxArgs
.
printUsage
();
System
.
exit
(
0
);
}
if
(
jadxArgs
.
isVerbose
())
{
...
...
@@ -141,7 +22,14 @@ public class Main {
rootLogger
.
setLevel
(
ch
.
qos
.
logback
.
classic
.
Level
.
DEBUG
);
}
int
result
=
run
(
jadxArgs
);
try
{
jadxArgs
.
processArgs
();
}
catch
(
JadxException
e
)
{
LOG
.
error
(
"Error: "
+
e
.
getMessage
());
System
.
exit
(
1
);
}
int
result
=
Jadx
.
run
(
jadxArgs
);
System
.
exit
(
result
);
}
}
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