#if UNITY_2018_1_OR_NEWER || (UNITY_2017_4_OR_NEWER && !UNITY_2017_4_0 && !UNITY_2017_4_1 && !UNITY_2017_4_2 && !UNITY_2017_4_3 && !UNITY_2017_4_4 && !UNITY_2017_4_5 && !UNITY_2017_4_6 && !UNITY_2017_4_7 && !UNITY_2017_4_8 && !UNITY_2017_4_9 && !UNITY_2017_4_10 && !UNITY_2017_4_11 && !UNITY_2017_4_12 && !UNITY_2017_4_13 && !UNITY_2017_4_14 && !UNITY_2017_4_15 && !UNITY_2017_4_15)
// Unity added Android ARM64 support in 2018.1, and backported to 2017.4.16
#define AVPROMC_UNITY_ANDROID_ARM64_SUPPORT
#endif
#if !UNITY_2019_3_OR_NEWER || UNITY_2021_2_OR_NEWER || (UNITY_2020_3_OR_NEWER && !UNITY_2020_3_0 && !UNITY_2020_3_1 && !UNITY_2020_3_2 && !UNITY_2020_3_3 && !UNITY_2020_3_4 && !UNITY_2020_3_5 && !UNITY_2020_3_6 && !UNITY_2020_3_7 && !UNITY_2020_3_8 && !UNITY_2020_3_9 && !UNITY_2020_3_10 && !UNITY_2020_3_11 && !UNITY_2020_3_12 && !UNITY_2020_3_13 && !UNITY_2020_3_14 && !UNITY_2020_3_15 && !UNITY_2020_3_16) || (UNITY_2019_4_OR_NEWER && !UNITY_2019_4_0 && !UNITY_2019_4_1 && !UNITY_2019_4_2 && !UNITY_2019_4_3 && !UNITY_2019_4_4 && !UNITY_2019_4_5 && !UNITY_2019_4_6 && !UNITY_2019_4_7 && !UNITY_2019_4_8 && !UNITY_2019_4_9 && !UNITY_2019_4_10 && !UNITY_2019_4_11 && !UNITY_2019_4_12 && !UNITY_2019_4_13 && !UNITY_2019_4_14 && !UNITY_2019_4_15 && !UNITY_2019_4_16 && !UNITY_2019_4_17 && !UNITY_2019_4_18 && !UNITY_2019_4_19 && !UNITY_2019_4_20 && !UNITY_2019_4_21 && !UNITY_2019_4_22 && !UNITY_2019_4_23 && !UNITY_2019_4_24 && !UNITY_2019_4_25 && !UNITY_2019_4_26 && !UNITY_2019_4_27 && !UNITY_2019_4_28 && !UNITY_2019_4_29 && !UNITY_2019_4_30)
// Unity dropped Android x86 support in 2019, but then added it back in 2021.2.0 and backported to 2020.3.17 and 2019.4.31
#define AVPROMC_UNITY_ANDROID_X86_SUPPORT
#endif
#if UNITY_2021_2_OR_NEWER || (UNITY_2020_3_OR_NEWER && !UNITY_2020_3_0 && !UNITY_2020_3_1 && !UNITY_2020_3_2 && !UNITY_2020_3_3 && !UNITY_2020_3_4 && !UNITY_2020_3_5 && !UNITY_2020_3_6 && !UNITY_2020_3_7 && !UNITY_2020_3_8 && !UNITY_2020_3_9 && !UNITY_2020_3_10 && !UNITY_2020_3_11 && !UNITY_2020_3_12 && !UNITY_2020_3_13 && !UNITY_2020_3_14 && !UNITY_2020_3_15 && !UNITY_2020_3_16) || (UNITY_2019_4_OR_NEWER && !UNITY_2019_4_0 && !UNITY_2019_4_1 && !UNITY_2019_4_2 && !UNITY_2019_4_3 && !UNITY_2019_4_4 && !UNITY_2019_4_5 && !UNITY_2019_4_6 && !UNITY_2019_4_7 && !UNITY_2019_4_8 && !UNITY_2019_4_9 && !UNITY_2019_4_10 && !UNITY_2019_4_11 && !UNITY_2019_4_12 && !UNITY_2019_4_13 && !UNITY_2019_4_14 && !UNITY_2019_4_15 && !UNITY_2019_4_16 && !UNITY_2019_4_17 && !UNITY_2019_4_18 && !UNITY_2019_4_19 && !UNITY_2019_4_20 && !UNITY_2019_4_21 && !UNITY_2019_4_22 && !UNITY_2019_4_23 && !UNITY_2019_4_24 && !UNITY_2019_4_25 && !UNITY_2019_4_26 && !UNITY_2019_4_27 && !UNITY_2019_4_28 && !UNITY_2019_4_29 && !UNITY_2019_4_30)
// Unity added Android x86_64 support in 2021.2.0 and backported to 2020.3.17 and 2019.4.31
#define AVPROMC_UNITY_ANDROID_X8664_SUPPORT
#endif
#if UNITY_2019_1_OR_NEWER
#define AVPROMC_UNITY_UWP_ARM64_SUPPORT
#endif
#if UNITY_2018_1_OR_NEWER
#define AVPROMC_UNITY_BUILDWITHREPORT_SUPPORT
#endif
using UnityEngine;
using UnityEditor;
using UnityEditor.Build;
#if AVPROMC_UNITY_BUILDWITHREPORT_SUPPORT
using UnityEditor.Build.Reporting;
#endif
using System.Collections.Generic;
//-----------------------------------------------------------------------------
// Copyright 2015-2021 RenderHeads Ltd. All rights reserved.
//-----------------------------------------------------------------------------
namespace RenderHeads.Media.AVProMovieCapture.Editor
{
///
/// Some versions of Unity do not support specific CPU architectures for plugin files
/// so this Build Preprocessor checks the plugin files for those and either disables
/// them if their arch is not supported, or assigns the correct arch and enables them
///
public class PluginProcessor :
#if AVPROMC_UNITY_BUILDWITHREPORT_SUPPORT
IPreprocessBuildWithReport
#else
IPreprocessBuild
#endif
{
internal class CpuArchitecture
{
internal CpuArchitecture(string code, bool isSupportedByThisUnityVersion)
{
_code = code;
_isSupportedByThisUnityVersion = isSupportedByThisUnityVersion;
}
private string _code;
private bool _isSupportedByThisUnityVersion;
internal string Code()
{
return _code;
}
internal bool IsSupportedByThisUnityVersion()
{
return _isSupportedByThisUnityVersion;
}
}
internal class PluginFile
{
internal PluginFile(BuildTarget buildTarget, string relativeFilePath, bool supportsEditor, CpuArchitecture cpuArchitecture)
{
_buildTarget = buildTarget;
_relativeFilePath = relativeFilePath;
_cpuArchitecture = cpuArchitecture;
_supportsEditor = supportsEditor;
}
internal bool IsBuildTarget(BuildTarget buildTarget)
{
return (_buildTarget == buildTarget);
}
internal BuildTarget BuildTarget()
{
return _buildTarget;
}
internal bool IsForFile(string path)
{
return path.Replace("\\", "/").Contains(_relativeFilePath);
}
internal bool IsSupportedByThisUnityVersion()
{
return _cpuArchitecture.IsSupportedByThisUnityVersion();
}
internal string CpuArchitectureCode()
{
return _cpuArchitecture.Code();
}
internal bool SupportsEditor()
{
return _supportsEditor;
}
private BuildTarget _buildTarget;
private string _relativeFilePath;
private CpuArchitecture _cpuArchitecture;
private bool _supportsEditor;
}
private static List _pluginFiles = new List(32);
internal static void AddPluginFiles(BuildTarget buildTarget, string[] filenames, string folderPrefix, bool supportsEditor, CpuArchitecture cpuArchitecture)
{
foreach (string filename in filenames)
{
_pluginFiles.Add(new PluginFile(buildTarget, folderPrefix + filename, supportsEditor, cpuArchitecture));
}
}
internal static void AddPlugins_Android()
{
#if AVPROMC_UNITY_ANDROID_ARM64_SUPPORT
const bool IsAndroidArm64Supported = true;
#else
const bool IsAndroidArm64Supported = false;
#endif
#if AVPROMC_UNITY_ANDROID_X86_SUPPORT
const bool IsAndroidX86Supported = true;
#else
const bool IsAndroidX86Supported = false;
#endif
#if AVPROMC_UNITY_ANDROID_X8664_SUPPORT
const bool IsAndroidX8664Supported = true;
#else
const bool IsAndroidX8664Supported = false;
#endif
string[] filenames = {
"libAVProMovieCaptureNative.so",
};
BuildTarget target = BuildTarget.Android;
AddPluginFiles(target, filenames, "Android/libs/armeabi-v7a/", false, new CpuArchitecture("ARMv7", true));
AddPluginFiles(target, filenames, "Android/libs/arm64-v8a/", false, new CpuArchitecture("ARM64", IsAndroidArm64Supported));
AddPluginFiles(target, filenames, "Android/libs/x86/", false, new CpuArchitecture("X86", IsAndroidX86Supported));
AddPluginFiles(target, filenames, "Android/libs/x86_64/", false, new CpuArchitecture("X86_64", IsAndroidX8664Supported));
}
private static void BuildPluginFileList()
{
_pluginFiles.Clear();
AddPlugins_Android();
}
public int callbackOrder { get { return 0; } }
#if AVPROMC_UNITY_BUILDWITHREPORT_SUPPORT
public void OnPreprocessBuild(BuildReport report)
{
BuildPluginFileList();
CheckNativePlugins(report.summary.platform);
}
#else
public void OnPreprocessBuild(BuildTarget target, string path)
{
BuildPluginFileList();
CheckNativePlugins(target);
}
#endif
internal static void CheckNativePlugins(BuildTarget target)
{
PluginImporter[] importers = PluginImporter.GetAllImporters();
foreach (PluginImporter pi in importers)
{
// Currently we're only interested in native plugins
if (!pi.isNativePlugin) continue;
// Skip plugins that aren't in the AVProMovieCapture path
// NOTE: This is commented out for now to allow the case where users have moved the plugin files to another folder.
// Eventually might need a more robust method, perhaps using GUIDS
//if (!pi.assetPath.Contains("AVProMovieCapture")) continue;
foreach (PluginFile pluginFile in _pluginFiles)
{
if (pluginFile.IsBuildTarget(target) &&
pluginFile.IsForFile(pi.assetPath))
{
pi.SetCompatibleWithAnyPlatform(false);
if (pluginFile.IsSupportedByThisUnityVersion())
{
Debug.Log("[AVProMovieCapture] Enabling " + pluginFile.CpuArchitectureCode() + " " + pi.assetPath);
pi.SetCompatibleWithEditor(pluginFile.SupportsEditor());
pi.SetCompatibleWithPlatform(pluginFile.BuildTarget(), true);
pi.SetPlatformData(pluginFile.BuildTarget(), "CPU", pluginFile.CpuArchitectureCode());
}
else
{
pi.SetCompatibleWithEditor(false);
pi.SetCompatibleWithPlatform(pluginFile.BuildTarget(), false);
pi.SetPlatformData(pluginFile.BuildTarget(), "CPU", "");
Debug.Log("[AVProMovieCapture] Disabling " + pluginFile.CpuArchitectureCode() + " " + pi.assetPath);
}
pi.SaveAndReimport();
break;
}
}
}
}
}
}