private void UploadAPK(bool retryUpload) { if (this.OnProgress != null) { this.OnProgress(this, "Copying APK package to device " + this._device.Describe()); } string str = this._device.Install(this._installPath, null); if (!retryUpload && (str.Contains("[INSTALL_FAILED_UPDATE_INCOMPATIBLE]") || str.Contains("[INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]"))) { Debug.LogWarning("Application update incompatible (signed with different keys?); removing previous installation (PlayerPrefs will be lost)...\n"); if (this.OnProgress != null) { this.OnProgress(this, "Removing " + this._packageName + " from device " + this._device.Describe()); } this._device.Uninstall(this._packageName, null); this.UploadAPK(true); } else { if (((str.Contains("protocol failure") || str.Contains("No space left on device")) || (str.Contains("[INSTALL_FAILED_INSUFFICIENT_STORAGE]") || str.Contains("[INSTALL_FAILED_UPDATE_INCOMPATIBLE]"))) || ((str.Contains("[INSTALL_FAILED_MEDIA_UNAVAILABLE]") || str.Contains("[INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES]")) || str.Contains("Failure ["))) { Debug.LogError("Installation failed with the following output:\n" + str); CancelPostProcess.AbortBuildPointToConsole("Unable to install APK!", "Installation failed."); } bool flag = this._developmentPlayer || Unsupported.IsDeveloperBuild(); if (this.OnProgress != null) { this.OnProgress(this, "Setting device property CheckJNI to " + flag); } this._device.SetProperty("debug.checkjni", !flag ? "0" : "1", null); } }
private void Clean() { if (Directory.Exists(this._installPath)) { try { Directory.Delete(this._installPath); } catch (IOException) { CancelPostProcess.AbortBuild("Unable to create new apk!", $"Unable to write target apk because {this._installPath} is a non-empty directory", null); } } else { if (File.Exists(this._installPath)) { File.Delete(this._installPath); } if (File.Exists(this._installPath)) { CancelPostProcess.AbortBuild("Unable to delete old apk!", $"Target apk could not be overwritten: {this._installPath}", null); } } if (!Directory.Exists(this._installDirectory)) { Directory.CreateDirectory(this._installDirectory); } }
private void CheckUnityLibraryForArchitecture(PostProcessorContext context, string arch) { string[] components = new string[] { TasksCommon.GetVariationsDirectory(context), "Libs", arch, "libunity.so" }; string path = Paths.Combine(components); if (!File.Exists(path)) { CancelPostProcess.AbortBuild("Unable to package apk", "Unity library missing for the selected architecture '" + arch + " (" + path + ") !", null); } }
private void UploadOBB() { string str = $"{Path.GetFileNameWithoutExtension(this._installPath)}.main.obb"; string path = Path.Combine(Path.GetDirectoryName(this._installPath), str); if (File.Exists(path)) { if (this.OnProgress != null) { this.OnProgress(this, "Copying APK Expansion file to device " + this._device.Describe()); } int bundleVersionCode = PlayerSettings.Android.bundleVersionCode; string[] strArray = new string[] { "/mnt/shell/emulated", "/mnt/shell/emulated/0/Android", this._device.ExternalStorageRoot + "/Android" }; bool flag = false; Exception exception = null; string str3 = $"main.{bundleVersionCode.ToString()}.{this._packageName}.obb"; foreach (string str4 in strArray) { try { string str5 = $"{str4}/{"obb"}/{this._packageName}/{str3}"; this._device.Push(path, str5, null); flag = true; break; } catch (Exception exception2) { exception = exception2; } } string dst = $"{this._device.ExternalStorageRoot}/{str3}"; if (!flag) { try { this._device.Push(path, dst, null); string str7 = $"{this._device.ExternalStorageRoot}/{"Android"}/{"obb"}/{this._packageName}"; string destination = $"{str7}/{str3}"; this._device.MakePath(str7, null); this._device.Move(dst, destination, null); flag = true; } catch (Exception exception3) { exception = exception3; } } if (!flag) { this.TryCleanupTemporaryOBB(dst); Debug.LogException(exception); CancelPostProcess.AbortBuildPointToConsole("Unable to deploy OBB to device", "Failed pushing OBB file to the device."); } } }
public void Execute(PostProcessorContext context) { if (this.OnProgress != null) { this.OnProgress(this, "Starting Android build"); } this.EnsureUnityLibrariesAreAvailable(context); if (!context.Get <bool>("ExportAndroidProject") && !this.ArePasswordsProvided()) { CancelPostProcess.AbortBuild("Can not sign application", "Unable to sign application; please provide passwords!", null); } }
internal static void Launch(BuildTarget target, string installPath) { if (target != BuildTarget.Android) { CancelPostProcess.AbortBuild("Build failure", "Internal error: Target platform mismatch", null); } PostProcessRunner runner = new PostProcessRunner(); _context.Set <string>("InstallPath", installPath); runner.AddNextTask(new PublishPackage()); runner.RunAllTasks(_context); }
public void Execute(PostProcessorContext context) { string str = context.Get <string>("StagingArea"); if (this.OnProgress != null) { this.OnProgress(this, "Preparing and unpacking AAR plugins"); } string str2 = Path.Combine(str, "aar"); string path = Path.Combine(str, "android-libraries"); Directory.CreateDirectory(path); string[] strArray = AndroidFileLocator.Find(Path.Combine(str2, "*.aar")); foreach (string str4 in strArray) { string fileName = Path.GetFileName(str4); string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(str4); string str7 = Path.Combine(path, fileNameWithoutExtension); if (Directory.Exists(str7)) { CancelPostProcess.AbortBuild("Build failure", "Plugin conflict detected for file " + fileName, null); } Directory.CreateDirectory(str7); TasksCommon.Exec(AndroidJavaTools.jarPath, "xf \"" + str4 + "\"", str7, "Error unpacking file " + fileName, 0); string str8 = Path.Combine(str7, "libs"); Directory.CreateDirectory(str8); FileUtil.MoveFileOrDirectory(Path.Combine(str7, "classes.jar"), Path.Combine(str8, "classes.jar")); string str9 = Path.Combine(str7, "jni"); if (Directory.Exists(str9)) { string str10 = Path.Combine(str7, "libs"); foreach (string str11 in Directory.GetDirectories(str9, "*")) { string to = Path.Combine(str10, FileUtil.RemovePathPrefix(str11, str9)); FileUtil.MoveFileOrDirectory(str11, to); } } string str13 = Path.Combine(str7, "src"); if (!Directory.Exists(str13)) { Directory.CreateDirectory(str13); } if (!File.Exists(Path.Combine(str7, AndroidLibraries.ProjectPropertiesFileName))) { int num3 = context.Get <int>("TargetSDKVersion"); File.WriteAllText(Path.Combine(str7, AndroidLibraries.ProjectPropertiesFileName), $"android.library=true target=android-{num3}"); } } }
private void AlignPackage(PostProcessorContext context) { AndroidSDKTools tools = context.Get <AndroidSDKTools>("SDKTools"); string errorMsg = "Failed to align APK package."; string str2 = Path.Combine(Environment.CurrentDirectory, this._stagingArea); string args = string.Format("4 \"{0}/Package_unaligned.apk\" \"{0}/Package.apk\"", str2); string message = TasksCommon.Exec(tools.ZIPALIGN, args, this._stagingArea, errorMsg, 0); if ((message.Contains("zipalign") || message.Contains("Warning")) || !File.Exists(Path.Combine(str2, "Package.apk"))) { Debug.LogError(message); CancelPostProcess.AbortBuildPointToConsole("APK Aligning Failed!", errorMsg); } }
private void ThrowIfInvalid(string packageName) { if (!this.IsValidAndroidBundleIdentifier(packageName)) { string message = "Please set the Bundle Identifier in the Player Settings."; message = (message + " The value must follow the convention 'com.YourCompanyName.YourProductName'") + " and can contain alphanumeric characters and underscore." + "\nEach segment must not start with a numeric character or underscore."; Selection.activeObject = Unsupported.GetSerializedAssetInterfaceSingleton("PlayerSettings"); CancelPostProcess.AbortBuild("Bundle Identifier has not been set up correctly", message, null); } if (!this.IsValidJavaPackageName(packageName)) { Debug.LogWarning((("As of Unity 4.2 the restrictions on the Bundle Identifier has been updated " + " to include those for java package names. Specifically the" + " restrictions have been updated regarding reserved java keywords.") + "\n" + "\nhttp://docs.oracle.com/javase/tutorial/java/package/namingpkgs.html") + "\nhttp://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.9" + "\n"); } }
public void Execute(PostProcessorContext context) { if (this.OnProgress != null) { this.OnProgress(this, "Building"); } string str = context.Get <string>("StagingArea"); int system = context.Get <int>("ProjectType"); if (system != 1) { throw new UnityException("Illegal project type: " + system); } AndroidProjectExport.Create(system).Export(context, null); bool flag = PlayerSettings.Android.keyaliasName.Length != 0; bool flag2 = context.Get <bool>("DevelopmentPlayer"); string sourceFileName = ""; string task = ""; string[] components = new string[] { "Temp", "gradleOut" }; string workingdir = Paths.Combine(components); if (flag2 || Unsupported.IsDeveloperBuild()) { task = "assembleDebug"; string[] textArray2 = new string[] { workingdir, "build", "outputs", "apk", "gradleOut-debug.apk" }; sourceFileName = Paths.Combine(textArray2); } else { if (!flag) { CancelPostProcess.AbortBuild("Build Failure", "Release builds have to be signed when using Gradle", null); return; } task = "assembleRelease"; string[] textArray3 = new string[] { workingdir, "build", "outputs", "apk", "gradleOut-release.apk" }; sourceFileName = Paths.Combine(textArray3); } GradleWrapper.Run(workingdir, task, delegate(string task) { if (((this.OnProgress != null) && (task != "")) && (task[0] == ':')) { this.OnProgress(this, "Task " + task.Substring(1)); } }); string[] textArray4 = new string[] { str, "Package.apk" }; File.Move(sourceFileName, Paths.Combine(textArray4)); }
private void Move(PostProcessorContext context) { string str = context.Get <string>("StagingArea"); bool flag = context.Get <bool>("UseObb"); FileUtil.MoveFileOrDirectory(Path.Combine(str, "Package.apk"), this._installPath); if (!File.Exists(this._installPath)) { CancelPostProcess.AbortBuild("Unable to create new apk!", $"Unable to move file '{Path.Combine(str, "Package.apk")}' -> '{this._installPath}", null); } if (flag && File.Exists(Path.Combine(str, "main.obb"))) { string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(this._installPath); string path = Path.Combine(this._installDirectory, $"{fileNameWithoutExtension}.main.obb"); FileUtil.DeleteFileOrDirectory(path); FileUtil.MoveFileOrDirectory(Path.Combine(str, "main.obb"), path); } }
internal static string PrepareForBuild(BuildOptions options, BuildTarget target) { if (target != BuildTarget.Android) { CancelPostProcess.AbortBuild("Build failure", "Internal error: Target platform mismatch", null); } if ((options & BuildOptions.BuildAdditionalStreamedScenes) == BuildOptions.CompressTextures) { _context = new PostProcessorContext(); SetupContextForPreBuild(_context, options, target); PostProcessRunner runner = new PostProcessRunner(); runner.AddNextTask(new CheckPrerequisites()); runner.AddNextTask(new CheckAndroidSdk()); runner.AddNextTask(new CheckDevice()); runner.RunAllTasks(_context); } return(""); }
private void BuildApk(PostProcessorContext context) { bool flag = context.Get <bool>("DevelopmentPlayer"); AndroidLibraries libraries = context.Get <AndroidLibraries>("AndroidLibraries"); bool flag2 = PlayerSettings.Android.keyaliasName.Length != 0; string str = Path.Combine(Environment.CurrentDirectory, this._stagingArea); string[] first = new string[] { "apk", $"{str}/Package_unaligned.apk", "-z", $"{str}/assets.ap_", "-z", $"{str}/bin/resources.ap_", "-nf", $"{str}/libs", "-f", $"{str}/bin/classes.dex", "-v" }; foreach (string str2 in libraries.GetLibraryDirectories()) { string[] second = new string[] { "-nf", str2 }; first = first.Concat <string>(second).ToArray <string>(); } foreach (string str3 in libraries.GetAssetsDirectories()) { string[] textArray3 = new string[] { "-A", str3 }; first = first.Concat <string>(textArray3).ToArray <string>(); } if (flag2) { string str4 = !Path.IsPathRooted(PlayerSettings.Android.keystoreName) ? Path.Combine(Directory.GetCurrentDirectory(), PlayerSettings.Android.keystoreName) : PlayerSettings.Android.keystoreName; string[] textArray4 = new string[] { "-k", str4, "-kp", PlayerSettings.Android.keystorePass, "-kk", PlayerSettings.Android.keyaliasName, "-kkp", PlayerSettings.Android.keyaliasPass }; first = first.Concat <string>(textArray4).ToArray <string>(); } if (flag || Unsupported.IsDeveloperBuild()) { string[] textArray5 = new string[] { "-d" }; first = first.Concat <string>(textArray5).ToArray <string>(); } if (File.Exists(Path.Combine(this._stagingArea, "raw.ap_"))) { string[] textArray6 = new string[] { "-z", $"{str}/raw.ap_" }; first = first.Concat <string>(textArray6).ToArray <string>(); } string message = TasksCommon.SDKTool(context, first, this._stagingArea, "Failed to build apk."); string fileName = Path.Combine(this._stagingArea, "Package_unaligned.apk"); FileInfo info = new FileInfo(fileName); if (!File.Exists(fileName) || (info.Length == 0L)) { Debug.LogError(message); CancelPostProcess.AbortBuildPointToConsole("APK Builder Failed!", "Failed to build APK package."); } }
private void CompileResources(PostProcessorContext context) { AndroidLibraries libraries = context.Get <AndroidLibraries>("AndroidLibraries"); string str = context.Get <string>("AndroidJarPath"); AndroidSDKTools tools = context.Get <AndroidSDKTools>("SDKTools"); string str2 = "gen"; string fullName = Directory.CreateDirectory(Path.Combine(this._stagingArea, str2)).FullName; string args = $"package --auto-add-overlay -v -f -m -J " { str2 } " -M " { "AndroidManifest.xml" } " -S " { "res" } " -I " { str } " -F {" bin / resources.ap_ "}"; if (libraries.Count > 0) { args = args + $" --extra-packages {string.Join(":", libraries.GetPackageNames())}"; foreach (string str5 in libraries.GetResourceDirectories()) { args = args + $" -S " { str5 } ""; } } string errorMsg = "Failed to re-package resources."; string str7 = TasksCommon.Exec(tools.AAPT, args, this._stagingArea, errorMsg, 3); if (!str7.Contains("Done!") || !File.Exists(Path.Combine(this._stagingArea, "bin/resources.ap_"))) { Debug.LogError("Failed to re-package resources with the following parameters:\n" + args + "\n" + str7); CancelPostProcess.AbortBuildPointToConsole("Resource re-package failed!", errorMsg); } if (libraries.Count > 0) { List <string> list = new List <string>(); foreach (string str8 in Directory.GetFiles(fullName, "*.java", SearchOption.AllDirectories)) { list.Add(str8.Substring(fullName.Length + 1)); } string str9 = Directory.CreateDirectory(Path.Combine(this._stagingArea, "bin/classes")).FullName; string str10 = $"-bootclasspath " { str } " -d " { str9 } " -source 1.6 -target 1.6 -encoding UTF-8 " { string.Join("\" \"", list.ToArray()) } ""; string str11 = "Failed to recompile android resource files."; string str12 = TasksCommon.Exec(AndroidJavaTools.javacPath, str10, fullName, str11, 0); if (str12.Trim().Length > 0) { Debug.LogError("Failed to compile resources with the following parameters:\n" + str10 + "\n" + str12); CancelPostProcess.AbortBuildPointToConsole("Resource compilation failed!", str11); } } }
private void AAPTPack(PostProcessorContext context, string apkName, string directory, bool compress) { AndroidSDKTools tools = context.Get <AndroidSDKTools>("SDKTools"); string str = ""; if (!compress) { str = " -0 \"\""; } string str2 = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"; string args = $"package -v -f -F {apkName} -A {directory}{str} --ignore-assets " { str2 } ""; string str4 = TasksCommon.Exec(tools.AAPT, args, this._stagingArea, "Android Asset Packaging Tool failed.", 3); if (!str4.Contains("Found 0 custom asset files") && (!str4.Contains("Done!") || !File.Exists(Path.Combine(this._stagingArea, apkName)))) { Debug.LogError($"Android Asset Packaging Tool failed: {tools.AAPT} {args} {str4}"); CancelPostProcess.AbortBuildPointToConsole("AAPT Failed!", "Android Asset Packaging Tool failed."); } }
private void BuildObb(PostProcessorContext context) { bool flag = File.Exists(Path.Combine(this._stagingArea, "obb.ap_")); bool flag2 = File.Exists(Path.Combine(this._stagingArea, "rawobb.ap_")); if (flag || flag2) { string str = Path.Combine(Environment.CurrentDirectory, this._stagingArea); string[] first = new string[] { "apk", $"{str}/main.obb", "-u" }; if (flag) { string[] second = new string[] { "-z", $"{str}/obb.ap_" }; first = first.Concat <string>(second).ToArray <string>(); } if (flag2) { string[] textArray3 = new string[] { "-z", $"{str}/rawobb.ap_" }; first = first.Concat <string>(textArray3).ToArray <string>(); } string message = TasksCommon.SDKTool(context, first, this._stagingArea, "Failed to build OBB."); string fileName = Path.Combine(this._stagingArea, "main.obb"); FileInfo info = new FileInfo(fileName); if (!File.Exists(fileName) || (info.Length == 0L)) { Debug.LogError(message); CancelPostProcess.AbortBuildPointToConsole("OBB Builder Failed!", "Failed to build OBB package."); } if (info.Length >= 0x80000000L) { Debug.LogError(message); CancelPostProcess.AbortBuildPointToConsole("OBB Builder Failed!", "OBB file too big for Android Market (max 2GB)."); } AndroidXmlDocument document = context.Get <AndroidXmlDocument>("SettingsXml"); document.PatchStringRes("bool", TasksCommon.GetMD5HashOfEOCD(fileName), true.ToString()); document.Save(); } }
public void Execute(PostProcessorContext context) { if (this.OnProgress != null) { this.OnProgress(this, "Checking Android SDK and components"); } this._sdkTools = AndroidSDKTools.GetInstance(); if (this._sdkTools == null) { CancelPostProcess.AbortBuild("Build failure!", "Unable to locate Android SDK", null); } context.Set <AndroidSDKTools>("SDKTools", this._sdkTools); this.EnsureSDKComponentVersion(0x18, new SDKToolsDetector(this)); this.EnsureSDKComponentVersion(0x17, new SDKBuildToolsDetector(this)); this.EnsureSDKComponentVersion(0x17, new SDKPlatformToolsDetector(this)); int num = this.EnsureSDKPlatformAPI("Android 6.0", 0x17); context.Set <int>("PlatformApiLevel", num); int num2 = Math.Max((int)PlayerSettings.Android.minSdkVersion, num); context.Set <int>("TargetSDKVersion", num2); this._sdkTools.UpdateToolsDirectories(); this._sdkTools.DumpDiagnostics(); AndroidJavaTools.DumpDiagnostics(); string str = "android.jar"; string androidPlatformPath = this._sdkTools.GetAndroidPlatformPath(num); if (androidPlatformPath.Length == 0) { EditorPrefs.SetString("AndroidSdkRoot", ""); string message = "Android SDK does not include any platforms! Did you run Android SDK setup to install the platform(s)?\nMinimum platform required for build is Android 5.0 (API level 21)\n"; CancelPostProcess.AbortBuild("No platforms found", message, null); } str = Path.Combine(androidPlatformPath, str); context.Set <string>("AndroidJarPath", str); }
private void StartApplication(PostProcessorContext context) { string path = context.Get <string>("ManifestName"); if (this._developmentPlayer) { if (this.OnProgress != null) { this.OnProgress(this, "Setting up profiler tunnel"); } this._device.Forward($"tcp:{ProfilerDriver.directConnectionPort}", "localabstract:Unity-" + this._packageName, null); } string activityWithLaunchIntent = new AndroidManifest(path).GetActivityWithLaunchIntent(); if (activityWithLaunchIntent.Length == 0) { CancelPostProcess.AbortBuild("Unable to start activity!", "No activity in the manifest with action MAIN and category LAUNCHER. Try launching the application manually on the device.", null); } if (this.OnProgress != null) { this.OnProgress(this, "Attempting to start Unity Player on device " + this._device.Describe()); } this._device.Launch(this._packageName, activityWithLaunchIntent, null); }
private void CreatePackagesWithFastzip(PostProcessorContext context) { string str5; string str6; string str7; FileInfo info; string workingdir = context.Get <string>("StagingArea"); bool flag = context.Get <bool>("UseObb"); AndroidLibraries libraries = context.Get <AndroidLibraries>("AndroidLibraries"); AndroidXmlDocument document = context.Get <AndroidXmlDocument>("SettingsXml"); string command = context.Get <string>("FastzipExe"); string str3 = "Package.apk"; string errorMsg = "Fastzip failed."; string str8 = " -j --seq -5"; if (flag) { if (this.OnProgress != null) { this.OnProgress(this, "Using fastzip to build expansion package (OBB)"); } str6 = ("main.obb" + str8 + " obbassets=assets") + " rawobb=assets"; str5 = TasksCommon.Exec(command, str6, workingdir, errorMsg, 0); str7 = Path.Combine(workingdir, "main.obb"); info = new FileInfo(str7); if (!File.Exists(str7) || (info.Length == 0L)) { Debug.LogError(str5); CancelPostProcess.AbortBuildPointToConsole("OBB Builder Failed!", "Failed to build OBB package."); } if (info.Length >= 0x80000000L) { Debug.LogError(str5); CancelPostProcess.AbortBuildPointToConsole("OBB Builder Failed!", "OBB file too big for Android Market (max 2GB)."); } document.PatchStringRes("bool", TasksCommon.GetMD5HashOfEOCD(str7), true.ToString()); document.Save(); } if (this.OnProgress != null) { this.OnProgress(this, "Using fastzip to build target package (APK)"); } string str9 = " libs=lib"; foreach (string str10 in libraries.GetLibraryDirectories()) { str9 = str9 + $" {str10}=libs"; } string str11 = " --apk"; if (PlayerSettings.Android.keyaliasName.Length != 0) { string str12 = !Path.IsPathRooted(PlayerSettings.Android.keystoreName) ? Path.Combine(Directory.GetCurrentDirectory(), PlayerSettings.Android.keystoreName) : PlayerSettings.Android.keystoreName; str11 = $" -A --sign={str12},{PlayerSettings.Android.keyaliasPass},{PlayerSettings.Android.keyaliasName}"; } string[] textArray1 = new string[] { str3, str8, str11, str9, " bin/classes.dex assets -0 -Z bin/resources.ap_ raw=assets" }; str6 = string.Concat(textArray1); str5 = TasksCommon.Exec(command, str6, workingdir, errorMsg, 0); str7 = Path.Combine(workingdir, str3); info = new FileInfo(str7); if (!File.Exists(str7) || (info.Length == 0L)) { Debug.LogError(str5); CancelPostProcess.AbortBuildPointToConsole("Fastzip Failed!", "Failed to build APK package."); } }
internal static void PostProcess(BuildTarget target, string stagingAreaData, string stagingArea, string playerPackage, string installPath, string companyName, string productName, BuildOptions options, RuntimeClassRegistry usedClassRegistry) { if (target != BuildTarget.Android) { CancelPostProcess.AbortBuild("Build failure", "Internal error: Target platform mismatch", null); } _context.Set <BuildTarget>("BuildTarget", target); _context.Set <string>("StagingAreaData", stagingAreaData); _context.Set <string>("StagingArea", stagingArea); _context.Set <string>("InstallPath", installPath); _context.Set <RuntimeClassRegistry>("UsedClassRegistry", usedClassRegistry); bool flag = (options & BuildOptions.AutoRunPlayer) != BuildOptions.CompressTextures; _context.Set <bool>("AutoRunPlayer", flag); bool flag2 = (options & BuildOptions.AcceptExternalModificationsToPlayer) != BuildOptions.CompressTextures; _context.Set <bool>("ExportAndroidProject", flag2); _context.Set <string>("AndroidPluginsPath", "Assets/Plugins/Android"); switch (EditorUserBuildSettings.androidBuildSystem) { case AndroidBuildSystem.Internal: _context.Set <int>("ProjectType", 0); break; case AndroidBuildSystem.Gradle: _context.Set <int>("ProjectType", 1); break; case AndroidBuildSystem.ADT: _context.Set <int>("ProjectType", 2); break; default: _context.Set <int>("ProjectType", !flag2 ? 0 : 2); break; } bool flag3 = _context.Get <int>("ProjectType") == 1; PostProcessRunner runner = new PostProcessRunner(); runner.AddNextTask(new Initializer()); runner.AddNextTask(new PrepareUnityResources()); runner.AddNextTask(new SplitLargeFiles()); runner.AddNextTask(new NonstreamingObbAssets()); runner.AddNextTask(new PrepareUnityPackage()); runner.AddNextTask(new PrepareUserResources()); runner.AddNextTask(new PrepareAPKResources()); runner.AddNextTask(new NativePlugins()); if (!flag3) { runner.AddNextTask(new ProcessAAR()); } runner.AddNextTask(new AddAndroidLibraries()); runner.AddNextTask(new GenerateManifest()); runner.AddNextTask(new BuildResources()); if (!flag3 && !flag2) { runner.AddNextTask(new CheckLibrariesConflict()); runner.AddNextTask(new RunDex()); } runner.AddNextTask(new RunIl2Cpp()); runner.AddNextTask(new StreamingAssets()); runner.AddNextTask(new FastZip()); runner.AddNextTask(new AAPTPackage()); if (flag2) { runner.AddNextTask(new ExportProject()); } else { if (flag3) { runner.AddNextTask(new BuildGradleProject()); } else { runner.AddNextTask(new BuildAPK()); } runner.AddNextTask(new MoveFinalPackage()); } runner.RunAllTasks(_context); }
private AndroidDevice FindDevice(PostProcessorContext context) { BuildTarget platform = context.Get <BuildTarget>("BuildTarget"); AndroidTargetDevice targetDevice = PlayerSettings.Android.targetDevice; List <string> list = null; do { list = ADB.Devices(null); }while ((list.Count == 0) && EditorUtility.DisplayDialog("No Android device found!", " * Make sure USB debugging has been enabled\n * Check your device, in most cases there should be a small icon in the status bar telling you if the USB connection is up.\n * If you are sure that device is attached then it might be USB driver problem, for details please check Android SDK Setup section in Unity manual.", "Retry", "Cancel")); if (list.Count < 1) { string message = $"No Android devices found.{(Application.platform != RuntimePlatform.WindowsEditor) ? "" : " If you are sure that device is attached then it might be USB driver problem, for details please check Android SDK Setup section in Unity manual."} "; CancelPostProcess.AbortBuild("Couldn't find Android device", message, null); } AndroidDevice device2 = new AndroidDevice(list[0]); int num = Convert.ToInt32(device2.Properties["ro.build.version.sdk"]); if (num < 9) { string str2 = (("Device: " + device2.Describe() + "\n") + "The connected device is not running Android OS 2.3 or later.") + " Unity Android does not support earlier versions of the Android OS;" + " please upgrade your device to a later OS version."; Selection.activeObject = Unsupported.GetSerializedAssetInterfaceSingleton("PlayerSettings"); CancelPostProcess.AbortBuild("Device software is not supported", str2, null); } int num2 = 0; try { num2 = Convert.ToInt32(device2.Properties["ro.opengles.version"]); } catch (FormatException) { num2 = -1; } int num3 = 0xf0000; GraphicsDeviceType[] graphicsAPIs = PlayerSettings.GetGraphicsAPIs(platform); if (graphicsAPIs.Contains <GraphicsDeviceType>(GraphicsDeviceType.OpenGLES3)) { num3 = 0x30000; } if (graphicsAPIs.Contains <GraphicsDeviceType>(GraphicsDeviceType.OpenGLES2)) { num3 = 0x20000; } bool flag = device2.Features.Contains("android.hardware.opengles.aep"); if ((num3 == 0x30000) && (PlayerSettings.openGLRequireES31 || PlayerSettings.openGLRequireES31AEP)) { num3 = 0x30001; } bool flag2 = true; bool flag3 = (graphicsAPIs.Length == 1) && (graphicsAPIs[0] == GraphicsDeviceType.Vulkan); if ("Amazon" != device2.Properties["ro.product.brand"]) { string str3 = null; if (flag3 && !flag2) { str3 = "The connected device does not support Vulkan."; str3 = str3 + " Please select OpenGLES under Player Settings instead."; } if (((num2 >= 0) && (num2 < num3)) || (PlayerSettings.openGLRequireES31AEP && !flag)) { str3 = "The connected device is not compatible with the selected OpenGLES version."; str3 = str3 + " Please select a lower OpenGLES version under Player Settings instead."; } if (str3 != null) { Selection.activeObject = Unsupported.GetSerializedAssetInterfaceSingleton("PlayerSettings"); CancelPostProcess.AbortBuild("Device hardware is not supported", str3, null); } } if ((targetDevice == AndroidTargetDevice.x86) && device2.Properties["ro.product.cpu.abi"].Equals("armeabi-v7a")) { string str4 = "You are trying to install x86 APK to ARM device. "; str4 = str4 + "Please select FAT or ARM as device filter under Player Settings, or connect a x86 device."; Selection.activeObject = Unsupported.GetSerializedAssetInterfaceSingleton("PlayerSettings"); CancelPostProcess.AbortBuild("Device hardware is not supported", str4, null); } string str5 = device2.Properties["ro.product.manufacturer"]; string str6 = device2.Properties["ro.product.model"]; string action = device2.Properties["ro.product.cpu.abi"]; bool flag4 = device2.Properties["ro.secure"].Equals("1"); string str8 = $"{char.ToUpper(str5[0])}{str5.Substring(1)} {str6}"; string label = $"Android API-{num}"; UsabilityAnalytics.Event("Android Device", str8, label, !flag4 ? 0 : 1); string str10 = $"gles {num2 >> 0x10}.{num2 & 0xffff}{!flag ? "" : " AEP"}"; if (num2 < 0) { str10 = "gles 2.0"; } UsabilityAnalytics.Event("Android Architecture", action, str10, 1); string str11 = device2.Properties["ro.board.platform"]; ulong i = device2.MemInfo["MemTotal"]; i = UpperboundPowerOf2(i) / ((ulong)0x100000L); UsabilityAnalytics.Event("Android Chipset", str11, $"{i}MB", 1); return(device2); }