51
51
import java .util .zip .ZipEntry ;
52
52
import java .util .zip .ZipFile ;
53
53
54
+ // http://dl-ssl.google.com/android/repository/sys-img/android/sys-img.xml
55
+ // http://dl-ssl.google.com/android/repository/sys-img/android-wear/sys-img.xml
56
+ // http://dl-ssl.google.com/android/repository/sys-img/android-wear/android-wear-sys-img.xml
57
+
54
58
@ SuppressWarnings ("serial" )
55
59
public class SDKDownloader extends JDialog implements PropertyChangeListener {
56
60
private static final String PLATFORM_API_LEVEL = "23" ;
57
61
58
62
private static final String URL_REPOSITORY = "https://dl-ssl.google.com/android/repository/repository-11.xml" ;
59
63
private static final String URL_REPOSITORY_FOLDER = "http://dl-ssl.google.com/android/repository/" ;
60
64
private static final String URL_USB_DRIVER = "https://dl-ssl.google.com//android/repository/latest_usb_driver_windows.zip" ;
65
+ private static final String URL_SYS_IMAGES = "https://dl-ssl.google.com/android/repository/sys-img/android/sys-img.xml" ;
66
+ private static final String URL_SYS_IMAGES_FOLDER = "http://dl-ssl.google.com/android/repository/sys-img/android/" ;
67
+ private static final String SYSTEM_IMAGE = "Intel x86 Atom System Image" ;
68
+ // private static final String URL_SYS_IMAGES_WEAR = "https://dl-ssl.google.com/android/repository/sys-img/android-wear/sys-img.xml";
61
69
62
70
private static final String PROPERTY_CHANGE_EVENT_TOTAL = "total" ;
63
71
private static final String PROPERTY_CHANGE_EVENT_DOWNLOADED = "downloaded" ;
@@ -77,8 +85,8 @@ public class SDKDownloader extends JDialog implements PropertyChangeListener {
77
85
78
86
class SDKUrlHolder {
79
87
public String platformVersion ;
80
- public String platformToolsUrl , buildToolsUrl , platformUrl , toolsUrl ;
81
- public String platformToolsFilename , buildToolsFilename , platformFilename , toolsFilename ;
88
+ public String platformToolsUrl , buildToolsUrl , platformUrl , sysImgUrl , sysImgTag , toolsUrl ;
89
+ public String platformToolsFilename , buildToolsFilename , platformFilename , sysImgFilename , toolsFilename ;
82
90
public int totalSize = 0 ;
83
91
}
84
92
@@ -104,6 +112,8 @@ protected Object doInBackground() throws Exception {
104
112
if (!platformsFolder .exists ()) platformsFolder .mkdir ();
105
113
File buildToolsFolder = new File (sdkFolder , "build-tools" );
106
114
if (!buildToolsFolder .exists ()) buildToolsFolder .mkdir ();
115
+ File sysImgFolder = new File (sdkFolder , "system-images" );
116
+ if (!sysImgFolder .exists ()) sysImgFolder .mkdir ();
107
117
File extrasFolder = new File (sdkFolder , "extras" );
108
118
if (!extrasFolder .exists ()) extrasFolder .mkdir ();
109
119
@@ -112,7 +122,7 @@ protected Object doInBackground() throws Exception {
112
122
if (!tempFolder .exists ()) tempFolder .mkdir ();
113
123
114
124
try {
115
- SDKUrlHolder downloadUrls = getDownloadUrls (URL_REPOSITORY , Platform .getName ());
125
+ SDKUrlHolder downloadUrls = getDownloadUrls (URL_REPOSITORY , URL_SYS_IMAGES , Platform .getName ());
116
126
firePropertyChange (PROPERTY_CHANGE_EVENT_TOTAL , 0 , downloadUrls .totalSize );
117
127
totalSize = downloadUrls .totalSize ;
118
128
@@ -132,13 +142,21 @@ protected Object doInBackground() throws Exception {
132
142
File downloadedPlatform = new File (tempFolder , downloadUrls .platformFilename );
133
143
downloadAndUnpack (downloadUrls .platformUrl , downloadedPlatform , platformsFolder , false );
134
144
145
+ // system images
146
+ File downloadedSysImg = new File (tempFolder , downloadUrls .sysImgFilename );
147
+ File tmp = new File (sysImgFolder , "android-" + PLATFORM_API_LEVEL );
148
+ if (!tmp .exists ()) tmp .mkdir ();
149
+ File sysImgFinalFolder = new File (tmp , downloadUrls .sysImgTag );
150
+ if (!sysImgFinalFolder .exists ()) sysImgFinalFolder .mkdir ();
151
+ downloadAndUnpack (downloadUrls .sysImgUrl , downloadedSysImg , sysImgFinalFolder , false );
152
+
135
153
// usb driver
136
154
if (Platform .isWindows ()) {
137
155
File usbDriverFolder = new File (extrasFolder , "google" );
138
156
File downloadedFolder = new File (tempFolder , "latest_usb_driver_windows.zip" );
139
157
downloadAndUnpack (URL_USB_DRIVER , downloadedFolder , usbDriverFolder , false );
140
158
}
141
-
159
+
142
160
if (Platform .isLinux () || Platform .isMacOS ()) {
143
161
Runtime .getRuntime ().exec ("chmod -R 755 " + sdkFolder .getAbsolutePath ());
144
162
}
@@ -215,7 +233,9 @@ private void downloadAndUnpack(String urlString, File saveTo,
215
233
extractFolder (saveTo , unpackTo , setExec );
216
234
}
217
235
218
- private SDKUrlHolder getDownloadUrls (String repositoryUrl , String requiredHostOs ) throws ParserConfigurationException , IOException , SAXException {
236
+ private SDKUrlHolder getDownloadUrls (String repositoryUrl ,
237
+ String repositorySysImgUrlString , String requiredHostOs )
238
+ throws ParserConfigurationException , IOException , SAXException {
219
239
SDKUrlHolder urlHolder = new SDKUrlHolder ();
220
240
221
241
DocumentBuilderFactory dbf = DocumentBuilderFactory .newInstance ();
@@ -225,7 +245,7 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
225
245
// platform
226
246
String platformDescription = "Android SDK Platform " + PLATFORM_API_LEVEL ;
227
247
NodeList platformList = doc .getElementsByTagName ("sdk:platform" );
228
- for (int i = 0 ; i < platformList .getLength (); i ++) {
248
+ for (int i = 0 ; i < platformList .getLength (); i ++) {
229
249
Node platform = platformList .item (i );
230
250
NodeList version = ((Element ) platform ).getElementsByTagName ("sdk:version" );
231
251
NodeList level = ((Element ) platform ).getElementsByTagName ("sdk:api-level" );
@@ -248,7 +268,7 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
248
268
Node platformToolItem = doc .getElementsByTagName ("sdk:platform-tool" ).item (0 );
249
269
Node archiveListItem = ((Element ) platformToolItem ).getElementsByTagName ("sdk:archives" ).item (0 );
250
270
NodeList archiveList = ((Element ) archiveListItem ).getElementsByTagName ("sdk:archive" );
251
- for (int i = 0 ; i < archiveList .getLength (); i ++) {
271
+ for (int i = 0 ; i < archiveList .getLength (); i ++) {
252
272
Node archive = archiveList .item (i );
253
273
String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
254
274
if (hostOs .equals (requiredHostOs )) {
@@ -263,7 +283,7 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
263
283
Node buildToolsItem = doc .getElementsByTagName ("sdk:build-tool" ).item (doc .getElementsByTagName ("sdk:build-tool" ).getLength ()-1 );
264
284
archiveListItem = ((Element ) buildToolsItem ).getElementsByTagName ("sdk:archives" ).item (0 );
265
285
archiveList = ((Element ) archiveListItem ).getElementsByTagName ("sdk:archive" );
266
- for (int i = 0 ; i < archiveList .getLength (); i ++) {
286
+ for (int i = 0 ; i < archiveList .getLength (); i ++) {
267
287
Node archive = archiveList .item (i );
268
288
String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
269
289
if (hostOs .equals (requiredHostOs )) {
@@ -278,7 +298,7 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
278
298
Node toolsItem = doc .getElementsByTagName ("sdk:tool" ).item (0 );
279
299
archiveListItem = ((Element ) toolsItem ).getElementsByTagName ("sdk:archives" ).item (0 );
280
300
archiveList = ((Element ) archiveListItem ).getElementsByTagName ("sdk:archive" );
281
- for (int i = 0 ; i < archiveList .getLength (); i ++) {
301
+ for (int i = 0 ; i < archiveList .getLength (); i ++) {
282
302
Node archive = archiveList .item (i );
283
303
String hostOs = ((Element ) archive ).getElementsByTagName ("sdk:host-os" ).item (0 ).getTextContent ();
284
304
if (hostOs .equals (requiredHostOs )) {
@@ -288,6 +308,30 @@ private SDKUrlHolder getDownloadUrls(String repositoryUrl, String requiredHostOs
288
308
break ;
289
309
}
290
310
}
311
+
312
+ // system image
313
+ Document docSysImg = db .parse (new URL (repositorySysImgUrlString ).openStream ());
314
+ NodeList sysImgList = docSysImg .getElementsByTagName ("sdk:system-image" );
315
+ for (int i = 0 ; i < sysImgList .getLength (); i ++) {
316
+ Node img = sysImgList .item (i );
317
+ NodeList level = ((Element ) img ).getElementsByTagName ("sdk:api-level" );
318
+ NodeList desc = ((Element ) img ).getElementsByTagName ("sdk:description" );
319
+ NodeList codename = ((Element ) img ).getElementsByTagName ("sdk:codename" );
320
+ // Only considering nodes without a codename, which correspond to the platform
321
+ // pre-releases.
322
+ if (level .item (0 ).getTextContent ().equals (PLATFORM_API_LEVEL ) &&
323
+ desc .item (0 ).getTextContent ().equals (SYSTEM_IMAGE ) &&
324
+ codename .item (0 ) == null ) {
325
+ NodeList tag = ((Element ) img ).getElementsByTagName ("sdk:tag-id" );
326
+ urlHolder .sysImgTag = tag .item (0 ).getTextContent ();
327
+ archiveListItem = ((Element ) img ).getElementsByTagName ("sdk:archives" ).item (0 );
328
+ Node archiveItem = ((Element ) archiveListItem ).getElementsByTagName ("sdk:archive" ).item (0 );
329
+ urlHolder .sysImgFilename = ((Element ) archiveItem ).getElementsByTagName ("sdk:url" ).item (0 ).getTextContent ();
330
+ urlHolder .sysImgUrl = URL_SYS_IMAGES_FOLDER + urlHolder .sysImgFilename ;
331
+ urlHolder .totalSize += Integer .parseInt (((Element ) archiveItem ).getElementsByTagName ("sdk:size" ).item (0 ).getTextContent ());
332
+ break ;
333
+ }
334
+ }
291
335
292
336
return urlHolder ;
293
337
}
0 commit comments