From e3ca2179d81fc23eca83db6ac710677a6f8a3eeb Mon Sep 17 00:00:00 2001 From: Shawn Kuang Date: Sat, 1 Oct 2022 17:42:25 +0800 Subject: [PATCH 1/3] Fix `AndroidGradlePluginVersion` getter Later version of Unity (2022.2+ or 2023.1+) changed the way to specify Android Gradle plugin version. As a result, `AndroidGradlePluginVersion` getter would fail to find the version and Android Resolver would fail when `mainTemplate.gradle` is in use. This fix searches Android Gradle plugin version using two regex to ensure Android Resolver can find the version in any Unity version. --- .../src/PlayServicesResolver.cs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/source/AndroidResolver/src/PlayServicesResolver.cs b/source/AndroidResolver/src/PlayServicesResolver.cs index 5904778c..10215769 100644 --- a/source/AndroidResolver/src/PlayServicesResolver.cs +++ b/source/AndroidResolver/src/PlayServicesResolver.cs @@ -571,8 +571,17 @@ public static string GradleVersion { // Gradle plugin version. private static DateTime mainTemplateLastWriteTime = default(DateTime); // Extracts an Android Gradle Plugin version number from the contents of a *.gradle file. + // This should work for Unity 2022.1 and below. + // Ex. + // classpath 'com.android.tools.build:gradle:4.0.1' + private static Regex androidGradlePluginVersionExtract_legacy = new Regex( + @"['""]com\.android\.tools\.build:gradle:([^'""]+)['""]$"); + // Extracts an Android Gradle Plugin version number from the contents of a *.gradle file for + // Unity 2022.2+ or 2023.1+. + // Ex. + // id 'com.android.application' version '7.1.2' apply false private static Regex androidGradlePluginVersionExtract = new Regex( - @"['""]com\.android\.tools\.build:gradle:([^']+)['""]$"); + @"['""]com\.android\.application['""] version ['""]([^'""]+)['""]"); /// /// Get the Android Gradle Plugin version used by Unity. @@ -609,7 +618,12 @@ public static string AndroidGradlePluginVersion { SearchOption.TopDirectoryOnly)); foreach (var path in gradleTemplates) { foreach (var line in File.ReadAllLines(path)) { - var match = androidGradlePluginVersionExtract.Match(line); + var match = androidGradlePluginVersionExtract_legacy.Match(line); + if (match != null && match.Success) { + androidGradlePluginVersion = match.Result("$1"); + break; + } + match = androidGradlePluginVersionExtract.Match(line); if (match != null && match.Success) { androidGradlePluginVersion = match.Result("$1"); break; From ec022c0199d67e35fcb6bfbae8d0d2682d0e3135 Mon Sep 17 00:00:00 2001 From: Shawn Kuang Date: Mon, 3 Oct 2022 17:16:15 +0800 Subject: [PATCH 2/3] Add integration test --- .../test/src/AndroidResolverIntegrationTests.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/source/AndroidResolver/test/src/AndroidResolverIntegrationTests.cs b/source/AndroidResolver/test/src/AndroidResolverIntegrationTests.cs index 5bc48065..32d807ae 100644 --- a/source/AndroidResolver/test/src/AndroidResolverIntegrationTests.cs +++ b/source/AndroidResolver/test/src/AndroidResolverIntegrationTests.cs @@ -484,10 +484,24 @@ private static void ValidateAndroidTargetSelected( }); IntegrationTester.Runner.LogSummaryAndExit(); } + + // Verify if PlayServicesResolver properties are working properly. + var testCaseResult = new IntegrationTester.TestCaseResult(testCase); + + if (String.IsNullOrEmpty(PlayServicesResolver.AndroidGradlePluginVersion)) { + testCaseResult.ErrorMessages.Add(String.Format( + "PlayServicesResolver.AndroidGradlePluginVersion is empty or null")); + } + + if (String.IsNullOrEmpty(PlayServicesResolver.GradleVersion)) { + testCaseResult.ErrorMessages.Add(String.Format( + "PlayServicesResolver.GradleVersion is empty or null")); + } + // Also, set the internal Gradle version to a deterministic version number. This controls // how gradle template snippets are generated by GradleTemplateResolver. PlayServicesResolver.GradleVersion = "2.14"; - testCaseComplete(new IntegrationTester.TestCaseResult(testCase)); + testCaseComplete(testCaseResult); } /// From 6001cb422fba4e0aefba4c71327121e654e2e55f Mon Sep 17 00:00:00 2001 From: Shawn Kuang Date: Mon, 3 Oct 2022 17:17:24 +0800 Subject: [PATCH 3/3] Fix reflection exception because Unity added a new version of SetApplicationIdentifier() --- source/AndroidResolver/src/UnityCompat.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/source/AndroidResolver/src/UnityCompat.cs b/source/AndroidResolver/src/UnityCompat.cs index e9dbcd22..265e19fb 100644 --- a/source/AndroidResolver/src/UnityCompat.cs +++ b/source/AndroidResolver/src/UnityCompat.cs @@ -64,8 +64,8 @@ private static int VersionFromAndroidSDKVersionsEnum(object enumValue, string fa //Fall back on auto if the enum value is not parsable return -1; } - - // If the enumName is empty then enumValue was not represented in the enum, + + // If the enumName is empty then enumValue was not represented in the enum, // most likely because Unity has not yet added the new version, // fall back on the raw enumValue if (String.IsNullOrEmpty(enumName)) return (int)enumValue; @@ -462,7 +462,9 @@ private static string GetUnity56AndAboveApplicationIdentifier(BuildTarget buildT private static bool SetUnity56AndAboveApplicationIdentifier(BuildTarget buildTarget, string applicationIdentifier) { var setApplicationIdentifierMethod = - typeof(UnityEditor.PlayerSettings).GetMethod("SetApplicationIdentifier"); + typeof(UnityEditor.PlayerSettings).GetMethod( + "SetApplicationIdentifier", + new[]{typeof(BuildTargetGroup), typeof(string)}); if (setApplicationIdentifierMethod == null) return false; var buildTargetGroup = ConvertBuildTargetToBuildTargetGroup(buildTarget); if (buildTargetGroup == BuildTargetGroup.Unknown) return false;