diff --git a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems
index a1801b9c04b921..9c032afffeac0d 100644
--- a/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems
+++ b/src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems
@@ -2097,7 +2097,7 @@
-
+
@@ -2326,4 +2326,4 @@
-
\ No newline at end of file
+
diff --git a/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj b/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj
index 3e032e76483b2d..96911991c8d74c 100644
--- a/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj
+++ b/src/mono/System.Private.CoreLib/System.Private.CoreLib.csproj
@@ -272,6 +272,9 @@
Common\Interop\Unix\System.Native\Interop.GetEnviron.cs
+
+
+
diff --git a/src/mono/System.Private.CoreLib/src/System/Environment.Android.cs b/src/mono/System.Private.CoreLib/src/System/Environment.Android.cs
new file mode 100644
index 00000000000000..44c8988532f367
--- /dev/null
+++ b/src/mono/System.Private.CoreLib/src/System/Environment.Android.cs
@@ -0,0 +1,97 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+
+using System.IO;
+using System.Threading;
+using System.Collections.Generic;
+using System.Runtime.InteropServices;
+using System.Diagnostics;
+
+namespace System
+{
+ public static partial class Environment
+ {
+ private static Dictionary? s_specialFolders;
+
+ private static string GetFolderPathCore(SpecialFolder folder, SpecialFolderOption option)
+ {
+ if (s_specialFolders == null)
+ {
+ Interlocked.CompareExchange(ref s_specialFolders, new Dictionary(), null);
+ }
+
+ string? path;
+ lock (s_specialFolders)
+ {
+ if (!s_specialFolders.TryGetValue(folder, out path))
+ {
+ path = GetSpecialFolder(folder) ?? string.Empty;
+ s_specialFolders[folder] = path;
+ }
+ }
+ return path;
+ }
+
+ private static string? GetSpecialFolder(SpecialFolder folder)
+ {
+ string? home = null;
+ try
+ {
+ home = PersistedFiles.GetHomeDirectory();
+ }
+ catch (Exception exc)
+ {
+ Debug.Fail($"Unable to get home directory: {exc}");
+ }
+
+ // Fall back to '/' when we can't determine the home directory.
+ // This location isn't writable by non-root users which provides some safeguard
+ // that the application doesn't write data which is meant to be private.
+ if (string.IsNullOrEmpty(home))
+ {
+ home = "/";
+ }
+
+ switch (folder)
+ {
+ case SpecialFolder.Personal:
+ case SpecialFolder.LocalApplicationData:
+ return home;
+
+ case SpecialFolder.ApplicationData:
+ return Path.Combine(home, ".config");
+
+ case SpecialFolder.Desktop:
+ case SpecialFolder.DesktopDirectory:
+ return Path.Combine(home, "Desktop");
+
+ case SpecialFolder.MyMusic:
+ return Path.Combine(home, "Music");
+
+ case SpecialFolder.MyPictures:
+ return Path.Combine(home, "Pictures");
+
+ case SpecialFolder.Templates:
+ return Path.Combine(home, "Templates");
+
+ case SpecialFolder.MyVideos:
+ return Path.Combine(home, "Videos");
+
+ case SpecialFolder.CommonTemplates:
+ return "/usr/share/templates";
+
+ case SpecialFolder.Fonts:
+ return Path.Combine(home, ".fonts");
+
+ case SpecialFolder.UserProfile:
+ return GetEnvironmentVariable("HOME");
+
+ case SpecialFolder.CommonApplicationData:
+ return "/usr/share";
+
+ default:
+ return string.Empty;
+ }
+ }
+ }
+}