/// <summary>
        /// Inject / update dependencies in the gradle template file.
        /// </summary>
        /// <param name="dependencies">Dependencies to inject.</param>
        /// <returns>true if successful, false otherwise.</returns>
        public static bool InjectDependencies(ICollection <Dependency> dependencies)
        {
            var resolutionMeasurementParameters =
                PlayServicesResolver.GetResolutionMeasurementParameters(null);

            if (dependencies.Count > 0)
            {
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate", resolutionMeasurementParameters,
                    "Gradle Template Resolve");
            }

            var fileDescription = String.Format("gradle template {0}", GradleTemplatePath);

            PlayServicesResolver.Log(String.Format("Reading {0}", fileDescription),
                                     level: LogLevel.Verbose);
            IEnumerable <string> lines;

            try {
                lines = File.ReadAllLines(GradleTemplatePath);
            } catch (Exception ex) {
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate/failed/templateunreadable",
                    "Gradle Template Resolve: Failed Template Unreadable");
                PlayServicesResolver.Log(
                    String.Format("Unable to patch {0} ({1})", fileDescription, ex.ToString()),
                    level: LogLevel.Error);
                return(false);
            }

            PlayServicesResolver.Log(String.Format("Searching for {0} in {1}", DependenciesToken,
                                                   fileDescription),
                                     level: LogLevel.Verbose);
            // Determine whether dependencies should be injected.
            var  dependenciesToken = new Regex(DependenciesToken);
            bool containsDeps      = false;

            foreach (var line in lines)
            {
                if (dependenciesToken.IsMatch(line))
                {
                    containsDeps = true;
                    break;
                }
            }

            // If a dependencies token isn't present report a warning and abort.
            if (!containsDeps)
            {
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate/failed/noinjectionpoint",
                    "Gradle Template Resolve: Failed No Injection Point");
                PlayServicesResolver.Log(
                    String.Format("No {0} token found in {1}, Android Resolver libraries will " +
                                  "not be added to the file.", DependenciesToken, fileDescription),
                    level: LogLevel.Warning);
                return(true);
            }

            // Copy all srcaar files in the project to aar filenames so that they'll be included in
            // the Gradle build.
            if (!CopySrcAars(dependencies))
            {
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate/failed/srcaarcopy",
                    "Gradle Template Resolve: Failed srcaar I/O");
                return(false);
            }

            var repoLines = new List <string>();

            // Optionally enable the jetifier.
            if (SettingsDialog.UseJetifier && dependencies.Count > 0)
            {
                // For Unity versions lower than 2019.3 add jetifier and AndroidX
                // properties to custom main gradle template
                if (VersionHandler.GetUnityVersionMajorMinor() < 2019.3f)
                {
                    repoLines.AddRange(new [] {
                        "([rootProject] + (rootProject.subprojects as List)).each {",
                        "    ext {",
                        "        it.setProperty(\"android.useAndroidX\", true)",
                        "        it.setProperty(\"android.enableJetifier\", true)",
                        "    }",
                        "}"
                    });
                }
            }
            repoLines.AddRange(PlayServicesResolver.GradleMavenReposLines(dependencies));

            TextFileLineInjector[] injectors = new [] {
                new TextFileLineInjector(ReposInjectionLine, ReposStartLine, ReposEndLine,
                                         repoLines, "Repos", fileDescription),
                new TextFileLineInjector(DependenciesToken, DependenciesStartLine,
                                         DependenciesEndLine,
                                         PlayServicesResolver.GradleDependenciesLines(
                                             dependencies, includeDependenciesBlock: false),
                                         "Dependencies", fileDescription),
                new TextFileLineInjector(PackagingOptionsToken, PackagingOptionsStartLine,
                                         PackagingOptionsEndLine,
                                         PlayServicesResolver.PackagingOptionsLines(dependencies),
                                         "Packaging Options", fileDescription),
            };
            return(PatchFile(GradleTemplatePath, fileDescription,
                             "Gradle Template", "gradletemplate",
                             injectors, resolutionMeasurementParameters));
        }
        /// <summary>
        /// Inject / update dependencies in the gradle template file.
        /// </summary>
        /// <param name="dependencies">Dependencies to inject.</param>
        /// <returns>true if successful, false otherwise.</returns>
        public static bool InjectDependencies(ICollection <Dependency> dependencies)
        {
            var resolutionMeasurementParameters =
                PlayServicesResolver.GetResolutionMeasurementParameters(null);

            if (dependencies.Count > 0)
            {
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate", resolutionMeasurementParameters,
                    "Gradle Template Resolve");
            }

            var fileDescription = String.Format("gradle template {0}", GradleTemplatePath);

            PlayServicesResolver.Log(String.Format("Reading {0}", fileDescription),
                                     level: LogLevel.Verbose);
            IEnumerable <string> lines;

            try {
                lines = File.ReadAllLines(GradleTemplatePath);
            } catch (Exception ex) {
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate/failed/templateunreadable",
                    "Gradle Template Resolve: Failed Template Unreadable");
                PlayServicesResolver.Log(
                    String.Format("Unable to patch {0} ({1})", fileDescription, ex.ToString()),
                    level: LogLevel.Error);
                return(false);
            }

            PlayServicesResolver.Log(String.Format("Searching for {0} in {1}", DependenciesToken,
                                                   fileDescription),
                                     level: LogLevel.Verbose);
            // Determine whether dependencies should be injected.
            var  dependenciesToken = new Regex(DependenciesToken);
            bool containsDeps      = false;

            foreach (var line in lines)
            {
                if (dependenciesToken.IsMatch(line))
                {
                    containsDeps = true;
                    break;
                }
            }

            // If a dependencies token isn't present report a warning and abort.
            if (!containsDeps)
            {
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate/failed/noinjectionpoint",
                    "Gradle Template Resolve: Failed No Injection Point");
                PlayServicesResolver.Log(
                    String.Format("No {0} token found in {1}, Android Resolver libraries will " +
                                  "not be added to the file.", DependenciesToken, fileDescription),
                    level: LogLevel.Warning);
                return(true);
            }

            // Copy all srcaar files in the project to aar filenames so that they'll be included in
            // the Gradle build.
            if (!CopySrcAars(dependencies))
            {
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate/failed/srcaarcopy",
                    "Gradle Template Resolve: Failed srcaar I/O");
                return(false);
            }

            var repoLines = new List <string>();

            // Optionally enable the jetifier.
            if (SettingsDialog.UseJetifier && dependencies.Count > 0)
            {
                repoLines.AddRange(new [] {
                    "([rootProject] + (rootProject.subprojects as List)).each {",
                    "    ext {",
                    "        it.setProperty(\"android.useAndroidX\", true)",
                    "        it.setProperty(\"android.enableJetifier\", true)",
                    "    }",
                    "}"
                });
            }
            repoLines.AddRange(PlayServicesResolver.GradleMavenReposLines(dependencies));

            TextFileLineInjector[] injectors = new [] {
                new TextFileLineInjector(ReposInjectionLine, ReposStartLine, ReposEndLine,
                                         repoLines, "Repos", fileDescription),
                new TextFileLineInjector(DependenciesToken, DependenciesStartLine,
                                         DependenciesEndLine,
                                         PlayServicesResolver.GradleDependenciesLines(
                                             dependencies, includeDependenciesBlock: false),
                                         "Dependencies", fileDescription),
                new TextFileLineInjector(PackagingOptionsToken, PackagingOptionsStartLine,
                                         PackagingOptionsEndLine,
                                         PlayServicesResolver.PackagingOptionsLines(dependencies),
                                         "Packaging Options", fileDescription),
            };
            // Lines that will be written to the output file.
            var outputLines = new List <string>();

            foreach (var line in lines)
            {
                var currentOutputLines = new List <string>();
                foreach (var injector in injectors)
                {
                    bool injectionApplied = false;
                    currentOutputLines = injector.ProcessLine(line, out injectionApplied);
                    if (injectionApplied || currentOutputLines.Count == 0)
                    {
                        break;
                    }
                }
                outputLines.AddRange(currentOutputLines);
            }
            var inputText  = String.Join("\n", (new List <string>(lines)).ToArray()) + "\n";
            var outputText = String.Join("\n", outputLines.ToArray()) + "\n";

            if (inputText == outputText)
            {
                PlayServicesResolver.Log(String.Format("No changes to {0}", fileDescription),
                                         level: LogLevel.Verbose);
                return(true);
            }
            if (!FileUtils.CheckoutFile(GradleTemplatePath, PlayServicesResolver.logger))
            {
                PlayServicesResolver.Log(
                    String.Format("Failed to checkout '{0}', unable to patch the file.",
                                  GradleTemplatePath), level: LogLevel.Error);
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate/failed/checkout",
                    "Gradle Template Resolve: Failed to checkout");
                return(false);
            }
            PlayServicesResolver.Log(
                String.Format("Writing updated {0}", fileDescription),
                level: LogLevel.Verbose);
            try {
                File.WriteAllText(GradleTemplatePath, outputText);
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate/success", resolutionMeasurementParameters,
                    "Gradle Template Resolve Success");
            } catch (Exception ex) {
                PlayServicesResolver.analytics.Report(
                    "/resolve/gradletemplate/failed/write",
                    "Gradle Template Resolve: Failed to write");
                PlayServicesResolver.Log(
                    String.Format("Unable to patch {0} ({1})", fileDescription,
                                  ex.ToString()), level: LogLevel.Error);
                return(false);
            }
            return(true);
        }
예제 #3
0
        /// <summary>
        /// Inject / update dependencies in the gradle template file.
        /// </summary>
        /// <param name="dependencies">Dependencies to inject.</param>
        /// <returns>true if successful, false otherwise.</returns>
        public static bool InjectDependencies(ICollection <Dependency> dependencies)
        {
            var fileDescription = String.Format("gradle template {0}", GradleTemplatePath);

            PlayServicesResolver.Log(String.Format("Reading {0}", fileDescription),
                                     level: LogLevel.Verbose);
            IEnumerable <string> lines;

            try {
                lines = File.ReadAllLines(GradleTemplatePath);
            } catch (Exception ex) {
                PlayServicesResolver.Log(
                    String.Format("Unable to patch {0} ({1})", fileDescription, ex.ToString()),
                    level: LogLevel.Error);
                return(false);
            }

            PlayServicesResolver.Log(String.Format("Searching for {0} in {1}", DependenciesToken,
                                                   fileDescription),
                                     level: LogLevel.Verbose);
            // Determine whether dependencies should be injected.
            bool containsDeps = false;

            foreach (var line in lines)
            {
                if (line.Contains(DependenciesToken))
                {
                    containsDeps = true;
                    break;
                }
            }

            // If a dependencies token isn't present report a warning and abort.
            if (!containsDeps)
            {
                PlayServicesResolver.Log(
                    String.Format("No {0} token found in {1}, Android Resolver libraries will " +
                                  "not be added to the file.", DependenciesToken, fileDescription),
                    level: LogLevel.Warning);
                return(true);
            }

            // Copy all srcaar files in the project to aar filenames so that they'll be included in
            // the Gradle build.
            if (!CopySrcAars(dependencies))
            {
                return(false);
            }

            TextFileLineInjector[] injectors = new [] {
                new TextFileLineInjector(ReposInjectionLine, ReposStartLine, ReposEndLine,
                                         PlayServicesResolver.GradleMavenReposLines(dependencies),
                                         "Repos", fileDescription),
                new TextFileLineInjector(DependenciesToken, DependenciesStartLine,
                                         DependenciesEndLine,
                                         PlayServicesResolver.GradleDependenciesLines(
                                             dependencies, includeDependenciesBlock: false),
                                         "Dependencies", fileDescription)
            };
            // Lines that will be written to the output file.
            var outputLines = new List <string>();

            foreach (var line in lines)
            {
                var currentOutputLines = new List <string>();
                foreach (var injector in injectors)
                {
                    bool injectionApplied = false;
                    currentOutputLines = injector.ProcessLine(line, out injectionApplied);
                    if (injectionApplied || currentOutputLines.Count == 0)
                    {
                        break;
                    }
                }
                outputLines.AddRange(currentOutputLines);
            }
            PlayServicesResolver.Log(
                String.Format("Writing updated {0}", fileDescription),
                level: LogLevel.Verbose);
            try {
                File.WriteAllText(GradleTemplatePath,
                                  String.Join("\n", outputLines.ToArray()) + "\n");
            } catch (Exception ex) {
                PlayServicesResolver.Log(
                    String.Format("Unable to patch {0} ({1})", fileDescription,
                                  ex.ToString()), level: LogLevel.Error);
                return(false);
            }
            return(true);
        }