@@ -62,6 +62,7 @@ public class SDKDownloader extends JDialog implements PropertyChangeListener {
62
62
private static final int USB_DRIVER = 6 ;
63
63
64
64
private static final String REPOSITORY_URL = "https://dl.google.com/android/repository/" ;
65
+ private static final String HAXM_URL = "https://dl.google.com/android/repository/extras/intel/" ;
65
66
private static final String REPOSITORY_LIST = "repository2-1.xml" ;
66
67
private static final String ADDON_LIST = "addon2-1.xml" ;
67
68
@@ -84,7 +85,8 @@ class SDKUrlHolder {
84
85
public String platformToolsUrl , buildToolsUrl , platformUrl , toolsUrl , emulatorUrl ;
85
86
public String platformToolsFilename , buildToolsFilename , platformFilename , toolsFilename , emulatorFilename ;
86
87
public String supportRepoUrl , googleRepoUrl , usbDriverUrl ;
87
- public String supportRepoFilename , googleRepoFilename , usbDriverFilename ;
88
+ public String supportRepoFilename , googleRepoFilename , usbDriverFilename ;
89
+ public String haxmFilename , haxmUrl ;
88
90
public int totalSize = 0 ;
89
91
}
90
92
@@ -122,9 +124,11 @@ protected Object doInBackground() throws Exception {
122
124
try {
123
125
SDKUrlHolder downloadUrls = new SDKUrlHolder ();
124
126
String repositoryUrl = REPOSITORY_URL + REPOSITORY_LIST ;
125
- String addonUrl = REPOSITORY_URL + ADDON_LIST ;
127
+ String addonUrl = REPOSITORY_URL + ADDON_LIST ;
128
+ String haxmUrl = HAXM_URL + ADDON_LIST ;
126
129
getMainDownloadUrls (downloadUrls , repositoryUrl , Platform .getName ());
127
130
getExtrasDownloadUrls (downloadUrls , addonUrl , Platform .getName ());
131
+ getHaxmDownloadUrl (downloadUrls , haxmUrl , Platform .getName ());
128
132
firePropertyChange (PROPERTY_CHANGE_EVENT_TOTAL , 0 , downloadUrls .totalSize );
129
133
130
134
// tools
@@ -161,6 +165,22 @@ protected Object doInBackground() throws Exception {
161
165
downloadAndUnpack (downloadUrls .usbDriverUrl , downloadedFolder , googleRepoFolder , false );
162
166
}
163
167
168
+ // HAXM
169
+ if (!Platform .isLinux ()) {
170
+ File downloadedFolder = new File (tempFolder , downloadUrls .haxmFilename );
171
+ File haxmFolder = new File (tempFolder , "HAXM" );
172
+ downloadAndUnpack (downloadUrls .haxmUrl , downloadedFolder , haxmFolder , true );
173
+
174
+ ProcessBuilder pb ;
175
+ if (Platform .isWindows ())
176
+ pb = new ProcessBuilder ("cmd.exe" , "/c" , "start" , "silent_install.bat" );
177
+ else
178
+ pb = new ProcessBuilder ("silent_install.sh" );
179
+
180
+ pb .directory (haxmFolder );
181
+ pb .start ().waitFor ();
182
+ }
183
+
164
184
if (Platform .isLinux () || Platform .isMacOS ()) {
165
185
Runtime .getRuntime ().exec ("chmod -R 755 " + sdkFolder .getAbsolutePath ());
166
186
}
@@ -429,6 +449,46 @@ private void getExtrasDownloadUrls(SDKUrlHolder urlHolder,
429
449
}
430
450
}
431
451
452
+ private void getHaxmDownloadUrl (SDKUrlHolder urlHolder ,
453
+ String repositoryUrl , String requiredHostOs )
454
+ throws ParserConfigurationException , IOException , SAXException , XPathException {
455
+ if (requiredHostOs .equals ("linux" ))
456
+ return ;
457
+
458
+ DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance ();
459
+ DocumentBuilder db = dbf .newDocumentBuilder ();
460
+ Document doc = db .parse (new URL (repositoryUrl ).openStream ());
461
+
462
+ XPathFactory xPathfactory = XPathFactory .newInstance ();
463
+ XPath xpath = xPathfactory .newXPath ();
464
+ XPathExpression expr ;
465
+ NodeList remotePackages ;
466
+
467
+ expr = xpath .compile ("//remotePackage[@path=\" extras;intel;Hardware_Accelerated_Execution_Manager\" ]" );
468
+ remotePackages = (NodeList ) expr .evaluate (doc , XPathConstants .NODESET );
469
+ if (remotePackages != null ) {
470
+ for (int i =0 ; i < remotePackages .getLength (); ++i ) {
471
+ NodeList childNodes = remotePackages .item (i ).getChildNodes ();
472
+ NodeList archives = ((Element ) childNodes ).getElementsByTagName ("archive" );
473
+
474
+ NodeList archive = archives .item (0 ).getChildNodes ();
475
+ NodeList os = ((Element ) archive ).getElementsByTagName ("host-os" );
476
+
477
+ if (!os .item (0 ).getTextContent ().equals (requiredHostOs ))
478
+ continue ;
479
+
480
+ NodeList complete = ((Element ) archive ).getElementsByTagName ("complete" );
481
+ NodeList url = ((Element ) complete .item (0 )).getElementsByTagName ("url" );
482
+ NodeList size = ((Element ) complete .item (0 )).getElementsByTagName ("size" );
483
+
484
+ urlHolder .haxmFilename = url .item (0 ).getTextContent ();
485
+ urlHolder .haxmUrl = HAXM_URL + urlHolder .haxmFilename ;
486
+ urlHolder .totalSize += Integer .parseInt (size .item (0 ).getTextContent ());
487
+ break ;
488
+ }
489
+ }
490
+ }
491
+
432
492
private void parseAndSet (SDKUrlHolder urlHolder , NodeList remotePackages , String requiredHostOs , int packageN ) {
433
493
NodeList childNodes = remotePackages .item (0 ).getChildNodes ();
434
494
NodeList archives = ((Element ) childNodes ).getElementsByTagName ("archive" );
0 commit comments