diff --git a/Editor.meta b/Editor.meta new file mode 100644 index 0000000..f9fd2ec --- /dev/null +++ b/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1efd52f1fe8855c40bc54dcacf0e270b +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/BuildPipelines.meta b/Editor/BuildPipelines.meta new file mode 100644 index 0000000..4341208 --- /dev/null +++ b/Editor/BuildPipelines.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2bc86fcd0f6c0e140b707d02a259518c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/BuildPipelines/AndroidBuildPipeline.cs b/Editor/BuildPipelines/AndroidBuildPipeline.cs new file mode 100644 index 0000000..f54437f --- /dev/null +++ b/Editor/BuildPipelines/AndroidBuildPipeline.cs @@ -0,0 +1,116 @@ +#if UNITY_ANDROID +using UnityEngine; +using UnityEditor; +using UnityEditor.Build; +using UnityEditor.Build.Reporting; +using System.Reflection; +using System.IO; + +[InitializeOnLoad] +sealed class AndroidBuildPipeline : IPostprocessBuildWithReport +{ + public int callbackOrder => 100; + + public enum BuildType { Production, Development } + + static void AndroidBuild(BuildType buildType, bool includeARM64 = false) + { + PlayerSettings.Android.targetArchitectures |= AndroidArchitecture.ARMv7 | AndroidArchitecture.ARM64; + + switch (buildType) + { + case BuildType.Production: + EditorUserBuildSettings.buildAppBundle = true; + EditorUserBuildSettings.development = false; + break; + default: + EditorUserBuildSettings.buildAppBundle = false; + if (!includeARM64) + PlayerSettings.Android.targetArchitectures = AndroidArchitecture.ARMv7; + break; + } + + EditorUserBuildSettings.SetBuildLocation(EditorUserBuildSettings.activeBuildTarget, GetBuildPath(buildType)); + + BuildPlayerOptions options = GetBuildPlayerOptions(); + options.options |= BuildOptions.DetailedBuildReport; + + if (buildType == BuildType.Production) + { + options.options |= BuildOptions.CompressWithLz4HC; + } + else + { + options.options |= BuildOptions.Development; + options.options |= BuildOptions.CompressWithLz4; + } + + BuildReport report = BuildPipeline.BuildPlayer(options); + BuildSummary summary = report.summary; + + switch (summary.result) + { + case BuildResult.Cancelled: + break; + case BuildResult.Failed: + Debug.Log("Build failed."); + break; + case BuildResult.Succeeded: + Debug.Log("Build succeeded. " + summary.outputPath); + EditorUtility.RevealInFinder(summary.outputPath); + break; + case BuildResult.Unknown: + break; + default: + break; + } + } + + static string GetBuildPath(BuildType buildType) + { + string defaultFolder = Path.Combine(Directory.GetParent(Application.dataPath).FullName, "Builds"); + // Based on semantic versioning + string defaultName = $"{Application.productName} {PlayerSettings.bundleVersion}{(buildType == BuildType.Development ? "-dev" : "")}+{PlayerSettings.Android.bundleVersionCode}"; + string extension = (EditorUserBuildSettings.buildAppBundle ? ".aab" : ".apk"); + return Path.Combine(defaultFolder, defaultName + extension).Replace("\\", "/"); + } + + static BuildPlayerOptions GetBuildPlayerOptions(bool askForLocation = false, BuildPlayerOptions defaultOptions = new BuildPlayerOptions()) + { + // Get static internal "GetBuildPlayerOptionsInternal" method + MethodInfo method = typeof(BuildPlayerWindow.DefaultBuildMethods).GetMethod( + "GetBuildPlayerOptionsInternal", + BindingFlags.NonPublic | BindingFlags.Static); + + // invoke internal method + return (BuildPlayerOptions)method.Invoke( + null, + new object[] { askForLocation, defaultOptions }); + } + + public void OnPostprocessBuild(BuildReport report) + { + PlayerSettings.Android.targetArchitectures |= AndroidArchitecture.ARMv7 | AndroidArchitecture.ARM64; + } + + #region MENU + [MenuItem("Agraris/Build/Android - Development", false, 1)] + public static void DevelopmentAndroidBuild() + { + AndroidBuild(BuildType.Development); + } + + [MenuItem("Agraris/Build/Android - Development + ARM64 (Slow)", false, 2)] + public static void Development64AndroidBuild() + { + AndroidBuild(BuildType.Development, true); + } + + [MenuItem("Agraris/Build/Android - Production", false, 3)] + public static void ProductionAndroidBuild() + { + AndroidBuild(BuildType.Production); + } + #endregion +} +#endif diff --git a/Editor/BuildPipelines/AndroidBuildPipeline.cs.meta b/Editor/BuildPipelines/AndroidBuildPipeline.cs.meta new file mode 100644 index 0000000..a1241b2 --- /dev/null +++ b/Editor/BuildPipelines/AndroidBuildPipeline.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 742b0e23ba43a804d8e3fa9e12b94ae7 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json index 6200265..2fc705f 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,14 @@ "displayName": "Agraris Core", "description": "Agraris tools core components.", "unity": "2020.3", + "unityRelease": "11f1", "keywords": [ "utility", "tool", "unity", - "singleton" + "singleton", + "android", + "build-pipeline" ], "homepage": "https://agraris.github.io/", "bugs": {