Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

Commit ca334f8

Browse files
committed
Merge pull request #79 from google/proguard-integ
merge fixes + clean interfaces to SilverGhost
2 parents 69ba6de + de7ab60 commit ca334f8

27 files changed

+718
-95
lines changed

ClassySharkAndroid/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ buildscript {
55
jcenter()
66
}
77
dependencies {
8-
classpath 'com.android.tools.build:gradle:1.5.0'
8+
classpath 'com.android.tools.build:gradle:2.1.0-beta1'
99

1010
// NOTE: Do not place your application dependencies here; they belong
1111
// in the individual module build.gradle files

ClassySharkWS/src/com/google/classyshark/cli/CliMode.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
import com.google.classyshark.silverghost.translator.apk.ApkTranslator;
2929

3030
import java.io.File;
31-
import java.io.OutputStreamWriter;
3231
import java.io.PrintWriter;
3332
import java.util.List;
3433

@@ -37,6 +36,9 @@
3736
*/
3837
public class CliMode {
3938

39+
// TODO fix the message with packages dump
40+
// TODO introduce SilverGhost api
41+
4042
private static final String ERROR_MESSAGE = "Usage: java -jar ClassyShark.jar [-options] <archive> [args...]\n" +
4143
" (to execute a ClassyShark on binary archive jar/apk/dex/class)\n" +
4244
"where options include:\n" +
@@ -111,7 +113,7 @@ private static void exportClassFromApk(List<String> args) {
111113
}
112114

113115
try {
114-
Exporter.writeCurrentClass(translator);
116+
Exporter.writeCurrentClass(translator.getClassName(), translator.toString());
115117
} catch (Exception e) {
116118
System.err.println("Internal error - couldn't write file" + "\n\n\n" + ERROR_MESSAGE);
117119
}
@@ -152,4 +154,4 @@ private static void inspectPackages(List<String> args) {
152154
ClassNode rootNode = rootBuilder.fillClassesWithMethods(fileName);
153155
methodCountExporter.exportMethodCounts(rootNode);
154156
}
155-
}
157+
}

ClassySharkWS/src/com/google/classyshark/gui/panel/ClassySharkPanel.java

Lines changed: 102 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,28 @@
1919
import com.google.classyshark.gui.panel.chart.RingChartPanel;
2020
import com.google.classyshark.gui.panel.displayarea.DisplayArea;
2121
import com.google.classyshark.gui.panel.io.CurrentFolderConfig;
22-
import com.google.classyshark.silverghost.exporter.Exporter;
2322
import com.google.classyshark.gui.panel.io.FileChooserUtils;
2423
import com.google.classyshark.gui.panel.io.RecentArchivesConfig;
2524
import com.google.classyshark.gui.panel.methodscount.MethodsCountPanel;
26-
import com.google.classyshark.gui.panel.reducer.Reducer;
2725
import com.google.classyshark.gui.panel.toolbar.KeyUtils;
2826
import com.google.classyshark.gui.panel.toolbar.Toolbar;
2927
import com.google.classyshark.gui.panel.toolbar.ToolbarController;
3028
import com.google.classyshark.gui.panel.tree.FilesTree;
31-
import com.google.classyshark.silverghost.contentreader.ContentReader;
29+
import com.google.classyshark.silverghost.SilverGhost;
30+
import com.google.classyshark.silverghost.exporter.Exporter;
3231
import com.google.classyshark.silverghost.methodscounter.ClassNode;
32+
import com.google.classyshark.silverghost.tokensmapper.ProguardMapper;
3333
import com.google.classyshark.silverghost.translator.Translator;
34-
import com.google.classyshark.silverghost.translator.TranslatorFactory;
35-
34+
import java.awt.BorderLayout;
35+
import java.awt.Color;
36+
import java.awt.Dimension;
37+
import java.awt.Font;
38+
import java.awt.Insets;
39+
import java.awt.event.KeyEvent;
40+
import java.awt.event.KeyListener;
41+
import java.io.File;
42+
import java.util.ArrayList;
43+
import java.util.List;
3644
import javax.swing.JFileChooser;
3745
import javax.swing.JFrame;
3846
import javax.swing.JPanel;
@@ -44,16 +52,6 @@
4452
import javax.swing.event.ChangeEvent;
4553
import javax.swing.event.ChangeListener;
4654
import javax.swing.filechooser.FileFilter;
47-
import java.awt.BorderLayout;
48-
import java.awt.Color;
49-
import java.awt.Dimension;
50-
import java.awt.Font;
51-
import java.awt.Insets;
52-
import java.awt.event.KeyEvent;
53-
import java.awt.event.KeyListener;
54-
import java.io.File;
55-
import java.util.ArrayList;
56-
import java.util.List;
5755

5856
/**
5957
* App controller, general app structure MVM ==> Model - View - Mediator (this class)
@@ -71,22 +69,21 @@ public class ClassySharkPanel extends JPanel
7169
private int dividerLocation = 0;
7270
private DisplayArea displayArea;
7371
private FilesTree filesTree;
74-
75-
private Reducer reducer;
76-
private Translator translator;
77-
private boolean isDataLoaded = false;
78-
private File binaryArchive;
79-
private List<String> allClassNamesInArchive;
8072
private RingChartPanel ringChartPanel;
73+
private boolean isDataLoaded = false;
74+
75+
private SilverGhost silverGhost = new SilverGhost();
8176

8277
public ClassySharkPanel(JFrame frame, File archive, String fullClassName) {
8378
this(frame);
84-
updateUiAfterArchiveReadAndLoadClass(archive, fullClassName);
79+
silverGhost.setBinaryArchive(archive);
80+
updateUiAfterArchiveReadAndLoadClass(fullClassName);
8581
}
8682

8783
public ClassySharkPanel(JFrame frame, File archive) {
8884
this(frame);
89-
displayArchive(archive);
85+
silverGhost.setBinaryArchive(archive);
86+
displayArchive(silverGhost.getBinaryArchive());
9087
}
9188

9289
public ClassySharkPanel(JFrame frame) {
@@ -98,14 +95,14 @@ public ClassySharkPanel(JFrame frame) {
9895

9996
@Override
10097
public void onSelectedTypeClassFromMouseClick(String selectedClass) {
101-
for (String clazz : translator.getDependencies()) {
98+
for (String clazz : silverGhost.getImportsForCurrentClass()) {
10299
if (clazz.contains(selectedClass)) {
103100
onSelectedImportFromMouseClick(clazz);
104101
return;
105102
}
106103
}
107104

108-
for (String clazz : reducer.getAllClassNames()) {
105+
for (String clazz : silverGhost.getAllClassNames()) {
109106
if (clazz.contains(selectedClass)) {
110107
onSelectedImportFromMouseClick(clazz);
111108
return;
@@ -115,7 +112,7 @@ public void onSelectedTypeClassFromMouseClick(String selectedClass) {
115112

116113
@Override
117114
public void onSelectedImportFromMouseClick(String className) {
118-
if (reducer.getAllClassNames().contains(className)) {
115+
if (silverGhost.getAllClassNames().contains(className)) {
119116
onSelectedClassName(className);
120117
}
121118
}
@@ -155,9 +152,9 @@ public String getDescription() {
155152

156153
@Override
157154
public void onGoBackPressed() {
158-
displayArea.displayAllClassesNames(allClassNamesInArchive);
155+
displayArea.displayAllClassesNames(silverGhost.getAllClassNames());
159156
toolbar.setText("");
160-
reducer.reduce("");
157+
silverGhost.initClassNameFiltering();
161158
}
162159

163160
@Override
@@ -172,13 +169,40 @@ public void onChangedTextFromTypingArea(String selectedLine) {
172169
fillDisplayArea(selectedLine, !VIEW_TOP_CLASS, !IS_CLASSNAME_FROM_MOUSE_CLICK);
173170
}
174171

172+
@Override
173+
public void onMappingsButtonPressed() {
174+
final JFileChooser fc = new JFileChooser();
175+
fc.setFileFilter(new FileFilter() {
176+
@Override
177+
public boolean accept(File f) {
178+
return true;
179+
}
180+
181+
@Override
182+
public String getDescription() {
183+
return "";
184+
}
185+
});
186+
187+
fc.setCurrentDirectory(CurrentFolderConfig.INSTANCE.getCurrentDirectory());
188+
189+
int returnVal = fc.showOpenDialog(this);
190+
toolbar.setText("");
191+
if (returnVal == JFileChooser.APPROVE_OPTION) {
192+
File resultFile = fc.getSelectedFile();
193+
readMappingFile(resultFile);
194+
}
195+
}
196+
175197
@Override
176198
public void onExportButtonPressed() {
177199
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
178200
@Override
179201
protected Void doInBackground() throws Exception {
180-
Exporter.writeCurrentClass(translator);
181-
Exporter.writeArchive(binaryArchive, reducer.getAllClassNames());
202+
Exporter.writeCurrentClass(silverGhost.getCurrentClassName(),
203+
silverGhost.getCurrentClassContent());
204+
Exporter.writeArchive(silverGhost.getBinaryArchive(),
205+
silverGhost.getAllClassNames());
182206
return null;
183207
}
184208

@@ -202,15 +226,16 @@ public void onChangeLeftPaneVisibility(boolean visible) {
202226

203227
@Override
204228
public void displayArchive(File binaryArchive) {
229+
silverGhost.setBinaryArchive(binaryArchive);
230+
205231
if (parentFrame != null) {
206-
parentFrame.setTitle(binaryArchive.getName());
232+
parentFrame.setTitle(silverGhost.getBinaryArchive().getName());
207233
}
208234

209-
loadAndFillDisplayArea(binaryArchive, null);
210-
isDataLoaded = true;
235+
readArchiveAndFillDisplayArea(null);
211236
toolbar.activateNavigationButtons();
212237
filesTree.setVisibleRoot();
213-
methodsCountPanel.loadFile(binaryArchive);
238+
methodsCountPanel.loadFile(silverGhost.getBinaryArchive());
214239
}
215240

216241
@Override
@@ -289,7 +314,7 @@ private void buildUI() {
289314
@Override
290315
public void stateChanged(ChangeEvent e) {
291316
int dividerLocation1 = jSplitPane.getDividerLocation();
292-
JTabbedPane jTabbedPane1 = (JTabbedPane)e.getSource();
317+
JTabbedPane jTabbedPane1 = (JTabbedPane) e.getSource();
293318
if (jTabbedPane1.getSelectedIndex() == 0) {
294319
jSplitPane.setRightComponent(rightScrollPane);
295320
} else {
@@ -311,60 +336,45 @@ public void stateChanged(ChangeEvent e) {
311336
add(jSplitPane, BorderLayout.CENTER);
312337
}
313338

314-
private void updateUiAfterArchiveReadAndLoadClass(File binaryArchive, String className) {
339+
private void updateUiAfterArchiveReadAndLoadClass(String className) {
315340
if (parentFrame != null) {
316-
parentFrame.setTitle(binaryArchive.getName());
341+
parentFrame.setTitle(silverGhost.getBinaryArchive().getName());
317342
}
318343

319-
loadAndFillDisplayArea(binaryArchive, className);
320-
isDataLoaded = true;
344+
readArchiveAndFillDisplayArea(className);
321345
toolbar.activateNavigationButtons();
322346
filesTree.setVisibleRoot();
323-
methodsCountPanel.loadFile(binaryArchive);
347+
methodsCountPanel.loadFile(silverGhost.getBinaryArchive());
324348
}
325349

326-
private void loadAndFillDisplayArea(final File binaryArchive,
327-
final String className) {
328-
this.binaryArchive = binaryArchive;
329-
final ContentReader loader = new ContentReader(this.binaryArchive);
350+
private void readArchiveAndFillDisplayArea(final String className) {
330351

331352
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
332353
@Override
333354
protected Void doInBackground() throws Exception {
334-
long start = System.currentTimeMillis();
335-
loader.load();
336-
allClassNamesInArchive = loader.getAllClassNames();
337-
reducer = new Reducer(allClassNamesInArchive);
338-
System.out.println("Archive Reading "
339-
+ (System.currentTimeMillis() - start) + " ms ");
355+
silverGhost.readContents();
340356
return null;
341357
}
342358

343359
@Override
344360
protected void done() {
345-
if (isArchiveError()) {
346-
filesTree.fillArchive(new File("ERROR"), new ArrayList<String>(), loader.getAllComponents());
361+
if (silverGhost.isArchiveError()) {
362+
filesTree.fillArchive(new File("ERROR"), new ArrayList<String>(),
363+
silverGhost.getComponents());
347364
displayArea.displayError();
348365
return;
349366
}
350367

351-
filesTree.fillArchive(ClassySharkPanel.this.binaryArchive,
352-
allClassNamesInArchive,
353-
loader.getAllComponents());
368+
filesTree.fillArchive(silverGhost.getBinaryArchive(),
369+
silverGhost.getAllClassNames(),
370+
silverGhost.getComponents());
354371

355372
if (className != null) {
356373
onSelectedClassName(className);
357374
} else {
358375
displayArea.displaySharkey();
359376
}
360-
}
361-
362-
private boolean isArchiveError() {
363-
boolean noJavaClasses = allClassNamesInArchive.isEmpty();
364-
boolean noAndroidClasses = allClassNamesInArchive.size() == 1
365-
&& allClassNamesInArchive.contains("AndroidManifest.xml");
366-
367-
return noJavaClasses || noAndroidClasses;
377+
isDataLoaded = true;
368378
}
369379
};
370380

@@ -378,22 +388,24 @@ private void fillDisplayArea(final String textFromTypingArea,
378388

379389
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
380390
private List<Translator.ELEMENT> displayedClassTokens;
381-
private List<String> reducedClassNames;
391+
private List<String> filteredClassNames;
382392
private String className = "";
383393

384394
@Override
385395
protected Void doInBackground() throws Exception {
386396
if (viewMouseClickedClass) {
387397
className = textFromTypingArea;
388-
displayedClassTokens = translateClass(className);
398+
silverGhost.translateArchiveElement(className);
399+
displayedClassTokens = silverGhost.getArchiveElementTokens();
389400
} else if (viewTopClass) {
390-
className = reducer.getAutocompleteClassName();
391-
displayedClassTokens = translateClass(className);
401+
className = silverGhost.getAutoCompleteClassName();
402+
silverGhost.translateArchiveElement(className);
403+
displayedClassTokens = silverGhost.getArchiveElementTokens();
392404
} else {
393-
reducedClassNames = reducer.reduce(textFromTypingArea);
394-
if (reducedClassNames.size() == 1) {
395-
displayedClassTokens =
396-
translateClass(reducedClassNames.get(0));
405+
filteredClassNames = silverGhost.filter(textFromTypingArea);
406+
if (filteredClassNames.size() == 1) {
407+
silverGhost.translateArchiveElement(filteredClassNames.get(0));
408+
displayedClassTokens = silverGhost.getArchiveElementTokens();
397409
}
398410
}
399411
return null;
@@ -405,23 +417,33 @@ protected void done() {
405417
toolbar.setText(className);
406418
displayArea.displayClass(displayedClassTokens);
407419
} else {
408-
if (reducedClassNames.size() == 1) {
420+
if (filteredClassNames.size() == 1) {
409421
displayArea.displayClass(displayedClassTokens);
410-
} else if (reducedClassNames.size() == 0) {
422+
} else if (filteredClassNames.size() == 0) {
411423
displayArea.displayError();
412424
} else {
413-
displayArea.displayReducedClassNames(reducedClassNames,
425+
displayArea.displayReducedClassNames(filteredClassNames,
414426
textFromTypingArea);
415427
}
416428
}
417429
}
430+
};
431+
432+
worker.execute();
433+
}
434+
435+
private void readMappingFile(final File resultFile) {
436+
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
437+
private ProguardMapper reverseMappings;
438+
439+
@Override
440+
protected Void doInBackground() throws Exception {
441+
reverseMappings = SilverGhost.readMappingFile(resultFile);
442+
return null;
443+
}
418444

419-
private List<Translator.ELEMENT> translateClass(String name) {
420-
translator =
421-
TranslatorFactory.createTranslator(
422-
name, binaryArchive, reducer.getAllClassNames());
423-
translator.apply();
424-
return translator.getElementsList();
445+
protected void done() {
446+
silverGhost.addMappings(reverseMappings);
425447
}
426448
};
427449

ClassySharkWS/src/com/google/classyshark/gui/panel/IconSchemes.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
public class IconSchemes {
55

6-
private static final String ROOT_PATH = "resources/";
6+
private static final String ROOT_PATH = "/resources/";
77
private static final String EXTENSION = ".png";
88

99
public static final String TOGGLE_ICON_PATH = ROOT_PATH + "ic_menu" + EXTENSION;

0 commit comments

Comments
 (0)