3 #if SILICONSTUDIO_PLATFORM_ANDROID
7 using System.Threading.Tasks;
8 using System.IO.Compression.Zip;
9 using Android.Content.PM;
10 using SiliconStudio.Core.Diagnostics;
11 using SiliconStudio.Core.Serialization;
13 namespace SiliconStudio.Core.IO
15 public static partial class VirtualFileSystem
17 private const string LastExtractedApkFileName =
"LastExtractedAPK";
19 public static async
Task UnpackAPK()
22 var packageManager = PlatformAndroid.Context.PackageManager;
23 var packageInfo = packageManager.GetPackageInfo(PlatformAndroid.Context.PackageName, PackageInfoFlags.Activities);
24 var lastUpdateTime = packageInfo.LastUpdateTime;
25 var sourceDir = PlatformAndroid.Context.ApplicationInfo.SourceDir;
28 var shouldExtractAssets =
true;
29 if (ApplicationTemporary.FileExists(LastExtractedApkFileName))
31 Int64 extractedLastUpdateTime = 0;
32 using (var file = ApplicationTemporary.OpenStream(LastExtractedApkFileName, VirtualFileMode.Open, VirtualFileAccess.Read))
34 var binaryReader =
new BinarySerializationReader(file);
35 binaryReader.Serialize(ref extractedLastUpdateTime, ArchiveMode.Deserialize);
38 shouldExtractAssets = extractedLastUpdateTime != lastUpdateTime;
42 if (shouldExtractAssets)
44 var assets = PlatformAndroid.Context.Assets;
47 var logger = GlobalLogger.GetLogger(
"VFS");
48 CopyFileOrDirectory(logger, sourceDir,
"assets/data/",
string.Empty);
51 using (var stream = ApplicationTemporary.OpenStream(LastExtractedApkFileName, VirtualFileMode.Create, VirtualFileAccess.Write, VirtualFileShare.None))
53 var binaryWriter =
new BinarySerializationWriter(stream);
54 binaryWriter.Write(lastUpdateTime);
59 private static void CopyFileOrDirectory(Logger logger,
string sourceDir,
string root,
string path)
63 throw new NotSupportedException();
67 var zipFile =
new ZipFile(sourceDir);
68 foreach (var zipEntry
in zipFile.GetAllEntries())
70 var zipFilename = zipEntry.FilenameInZip;
71 if (!zipFilename.StartsWith(root))
75 var assetFilename = zipFilename.Substring(root.Length);
77 var fullPath = path + assetFilename;
78 var directoryName = VirtualFileSystem.GetParentFolder(fullPath);
82 if (directoryName !=
string.Empty)
83 ApplicationData.CreateDirectory(directoryName);
89 using (var output = ApplicationData.OpenStream(fullPath, VirtualFileMode.Create, VirtualFileAccess.Write))
90 zipFile.ExtractFile(zipEntry, output);
93 catch (IOException ex)
95 logger.Info(
"I/O Exception", ex);