@@ -250,145 +250,6 @@ async def _extract_cmdline_tools(archive_path: Path, sdk_root: Path) -> bool:
250250
251251
252252
253- async def _set_env_vars (sdk_root : Path ) -> None :
254- print ("[installer][android-sdk] Setting environment variables..." )
255- await send_response ({
256- "action" : "status" ,
257- "data" : {
258- "category" : "Android" ,
259- "name" : "Android SDK" ,
260- "status" : "installing" ,
261- "comment" : "Setting ANDROID_HOME and PATH..." ,
262- }
263- })
264-
265-
266- env_paths = [
267- str (sdk_root / "platform-tools" ),
268- str (sdk_root / "emulator" ),
269- str (sdk_root / "cmdline-tools" / "latest" / "bin" ),
270- ]
271-
272-
273- if platform .system () == "Windows" :
274- try :
275- import winreg
276- # Set ANDROID_HOME in user environment variables (no admin needed)
277- with winreg .OpenKey (winreg .HKEY_CURRENT_USER ,
278- r"Environment" ,
279- 0 , winreg .KEY_ALL_ACCESS ) as key :
280- winreg .SetValueEx (key , "ANDROID_HOME" , 0 , winreg .REG_EXPAND_SZ , str (sdk_root ))
281- print ("[installer][android-sdk] ANDROID_HOME set in Windows user environment" )
282-
283- # Update PATH in user environment variables
284- with winreg .OpenKey (winreg .HKEY_CURRENT_USER ,
285- r"Environment" ,
286- 0 , winreg .KEY_ALL_ACCESS ) as key :
287- try :
288- current_path , _ = winreg .QueryValueEx (key , "Path" )
289- except FileNotFoundError :
290- current_path = ""
291-
292- parts = current_path .split (";" ) if current_path else []
293- updated = False
294- for p in env_paths :
295- if p not in parts :
296- parts .append (p )
297- updated = True
298- if updated :
299- winreg .SetValueEx (key , "Path" , 0 , winreg .REG_EXPAND_SZ , ";" .join (parts ))
300- print ("[installer][android-sdk] Android SDK paths added to Windows user environment" )
301- except Exception as e :
302- print (f"[installer][android-sdk] Windows env update failed (continuing for user session): { e } " )
303- elif platform .system () == "Linux" :
304- # Linux - update shell configuration files
305- user_home = Path .home ()
306- shell_configs = [
307- user_home / ".bashrc" ,
308- user_home / ".zshrc" ,
309- user_home / ".profile"
310- ]
311-
312- export_lines = [
313- f"export ANDROID_HOME={ sdk_root } " ,
314- f"export ANDROID_SDK_ROOT={ sdk_root } " ,
315- f"export PATH={ ':' .join (env_paths )} :$PATH"
316- ]
317-
318- updated = False
319- for config_file in shell_configs :
320- if config_file .exists ():
321- try :
322- with open (config_file , 'r' ) as f :
323- content = f .read ()
324- needs_update = any (export not in content for export in export_lines )
325-
326- if needs_update :
327- with open (config_file , 'a' ) as f :
328- f .write ("\n # Android SDK environment variables\n " + "\n " .join (export_lines ) + "\n " )
329- print (f"[installer][android-sdk] Updated { config_file } with Android SDK paths" )
330- updated = True
331- except Exception as e :
332- print (f"[installer][android-sdk] Failed to update { config_file } : { e } " )
333-
334- if updated :
335- print ("[!] Please restart your terminal or run 'source ~/.bashrc' (or your shell config)" )
336- elif platform .system () == "Darwin" : # iOS/macOS
337- # iOS/macOS - update shell configuration files
338- user_home = Path .home ()
339- shell_configs = [
340- user_home / ".bash_profile" ,
341- user_home / ".zshrc" ,
342- user_home / ".profile"
343- ]
344-
345- export_lines = [
346- f"export ANDROID_HOME={ sdk_root } " ,
347- f"export ANDROID_SDK_ROOT={ sdk_root } " ,
348- f"export PATH={ ':' .join (env_paths )} :$PATH"
349- ]
350-
351- updated = False
352- for config_file in shell_configs :
353- if config_file .exists ():
354- try :
355- with open (config_file , 'r' ) as f :
356- content = f .read ()
357- needs_update = any (export not in content for export in export_lines )
358-
359- if needs_update :
360- with open (config_file , 'a' ) as f :
361- f .write ("\n # Android SDK environment variables\n " + "\n " .join (export_lines ) + "\n " )
362- print (f"[installer][android-sdk] Updated { config_file } with Android SDK paths" )
363- updated = True
364- except Exception as e :
365- print (f"[installer][android-sdk] Failed to update { config_file } : { e } " )
366-
367- if updated :
368- print ("[!] Please restart your terminal or run 'source ~/.zshrc' (or your shell config)" )
369-
370-
371- # Always set for current session (works on all platforms)
372- os .environ ['ANDROID_HOME' ] = str (sdk_root )
373- os .environ ['ANDROID_SDK_ROOT' ] = str (sdk_root )
374- current_path = os .environ .get ('PATH' , '' )
375-
376- if platform .system () == "Windows" :
377- sep = ';'
378- elif platform .system () == "Linux" :
379- sep = ':'
380- elif platform .system () == "Darwin" : # iOS/macOS
381- sep = ':'
382-
383- # Prepend to PATH to ensure sdk tools are found first
384- for p in reversed (env_paths ):
385- if p not in current_path :
386- current_path = f"{ p } { sep } { current_path } " if current_path else p
387- os .environ ['PATH' ] = current_path
388-
389-
390-
391-
392253def _find_sdkmanager (sdk_root : Path ) -> Path | None :
393254 return _find_executable (sdk_root / "cmdline-tools" / "latest" / "bin" , "sdkmanager" )
394255
@@ -589,151 +450,9 @@ async def _accept_licenses(sdk_root: Path) -> bool:
589450
590451
591452
592- def _refresh_java_home () -> bool :
593- """
594- Dynamically refresh JAVA_HOME from Windows Registry to current process.
595- Returns True if JAVA_HOME is available, False otherwise.
596- """
597- system = platform .system ()
598-
599- if system == "Windows" :
600- try :
601- import winreg
602- # Try to read JAVA_HOME from user registry
603- try :
604- with winreg .OpenKey (winreg .HKEY_CURRENT_USER , r"Environment" , 0 , winreg .KEY_READ ) as key :
605- java_home , _ = winreg .QueryValueEx (key , "JAVA_HOME" )
606- if java_home and os .path .exists (java_home ):
607- os .environ ['JAVA_HOME' ] = java_home
608- print (f"[installer][android-sdk] Refreshed JAVA_HOME from registry: { java_home } " )
609-
610- # Add JAVA_HOME/bin to PATH (so java.exe and javac.exe are accessible)
611- java_bin = os .path .join (java_home , "bin" )
612- current_path = os .environ .get ('PATH' , '' )
613- if java_bin not in current_path :
614- os .environ ['PATH' ] = f"{ java_bin } ;{ current_path } "
615- print (f"[installer][android-sdk] Added Java bin to PATH: { java_bin } " )
616- return True
617- except FileNotFoundError :
618- pass
619-
620- # Fallback: Try system registry
621- try :
622- with winreg .OpenKey (winreg .HKEY_LOCAL_MACHINE ,
623- r"SYSTEM\CurrentControlSet\Control\Session Manager\Environment" ,
624- 0 , winreg .KEY_READ ) as key :
625- java_home , _ = winreg .QueryValueEx (key , "JAVA_HOME" )
626- if java_home and os .path .exists (java_home ):
627- os .environ ['JAVA_HOME' ] = java_home
628- print (f"[installer][android-sdk] Refreshed JAVA_HOME from system registry: { java_home } " )
629-
630- # Add JAVA_HOME/bin to PATH
631- java_bin = os .path .join (java_home , "bin" )
632- current_path = os .environ .get ('PATH' , '' )
633- if java_bin not in current_path :
634- os .environ ['PATH' ] = f"{ java_bin } ;{ current_path } "
635- return True
636- except FileNotFoundError :
637- pass
638-
639- print ("[installer][android-sdk] WARNING: JAVA_HOME not found in registry" )
640- return False
641- except Exception as e :
642- print (f"[installer][android-sdk] Failed to refresh JAVA_HOME: { e } " )
643- return False
644- elif system == "Linux" :
645- # On Linux, JAVA_HOME should already be in os.environ if set
646- java_home = os .environ .get ('JAVA_HOME' )
647- if java_home :
648- print (f"[installer][android-sdk] JAVA_HOME={ java_home } " )
649- return True
650- else :
651- print ("[installer][android-sdk] WARNING: JAVA_HOME not set" )
652- return False
653- elif system == "Darwin" :
654- # On macOS, JAVA_HOME should already be in os.environ if set
655- java_home = os .environ .get ('JAVA_HOME' )
656- if java_home :
657- print (f"[installer][android-sdk] JAVA_HOME={ java_home } " )
658- return True
659- else :
660- print ("[installer][android-sdk] WARNING: JAVA_HOME not set" )
661- return False
662-
663- return False
664-
665-
666453async def install () -> bool :
667454 print ("[installer][android-sdk] Installing..." )
668455
669- # Dynamically refresh JAVA_HOME before installation (critical for sdkmanager)
670- if not _refresh_java_home ():
671- print ("[installer][android-sdk] ERROR: Java/JDK is required to install Android SDK" )
672- await send_response ({
673- "action" : "status" ,
674- "data" : {
675- "category" : "Android" ,
676- "name" : "Android SDK" ,
677- "status" : "not installed" ,
678- "comment" : "Java/JDK is required. Please install Java or JDK first." ,
679- }
680- })
681- return False
682-
683- # Dynamically refresh ANDROID_HOME from registry on Windows
684- if platform .system () == "Windows" :
685- try :
686- import winreg
687- with winreg .OpenKey (winreg .HKEY_CURRENT_USER , r"Environment" , 0 , winreg .KEY_READ ) as key :
688- try :
689- android_home_reg , _ = winreg .QueryValueEx (key , "ANDROID_HOME" )
690- if android_home_reg :
691- # Expand environment variables before setting
692- android_home_expanded = os .path .expandvars (android_home_reg )
693- os .environ ['ANDROID_HOME' ] = android_home_expanded
694- except FileNotFoundError :
695- pass
696-
697- # Also check ANDROID_SDK_ROOT if ANDROID_HOME not found
698- if 'ANDROID_HOME' not in os .environ or not os .environ .get ('ANDROID_HOME' ):
699- try :
700- android_sdk_root_reg , _ = winreg .QueryValueEx (key , "ANDROID_SDK_ROOT" )
701- if android_sdk_root_reg :
702- # Expand environment variables before setting
703- android_sdk_root_expanded = os .path .expandvars (android_sdk_root_reg )
704- os .environ ['ANDROID_SDK_ROOT' ] = android_sdk_root_expanded
705- except FileNotFoundError :
706- pass
707- except Exception :
708- pass
709-
710- # Check if ANDROID_HOME is set
711- android_home = os .environ .get ('ANDROID_HOME' ) or os .environ .get ('ANDROID_SDK_ROOT' )
712-
713- # Expand environment variables in the path (e.g., %USERPROFILE% -> C:\Users\Username)
714- if android_home :
715- android_home = os .path .expandvars (android_home )
716-
717- if android_home :
718- # ANDROID_HOME is set - check if directory exists
719- if os .path .exists (android_home ):
720- print (f"[installer][android-sdk] SDK already installed at { android_home } " )
721- await send_response ({
722- "action" : "status" ,
723- "data" : {
724- "category" : "Android" ,
725- "name" : "Android SDK" ,
726- "status" : "installed" ,
727- "comment" : f"Android SDK available at { android_home } " ,
728- }
729- })
730- return True
731- else :
732- print (f"[installer][android-sdk] ANDROID_HOME is set but directory does not exist: { android_home } " )
733- print ("[installer][android-sdk] Proceeding with fresh installation..." )
734- else :
735- print ("[installer][android-sdk] ANDROID_HOME not set, proceeding with installation..." )
736-
737456 sdk_root = _get_sdk_root ()
738457
739458
@@ -752,9 +471,6 @@ async def install() -> bool:
752471 return False
753472
754473
755- await _set_env_vars (sdk_root )
756-
757-
758474 # Accept licenses
759475 await send_response ({
760476 "action" : "status" ,
0 commit comments