/// <summary>
        /// Perform resolution with no Android package dependency checks.
        /// </summary>
        private void DoResolutionNoAndroidPackageChecks(
            PlayServicesSupport svcSupport, string destinationDirectory,
            PlayServicesSupport.OverwriteConfirmation handleOverwriteConfirmation)
        {
            try
            {
                // Get the collection of dependencies that need to be copied.
                Dictionary <string, Dependency> deps =
                    svcSupport.ResolveDependencies(true);
                // Copy the list
                svcSupport.CopyDependencies(deps,
                                            destinationDirectory,
                                            handleOverwriteConfirmation);
            }
            catch (Google.JarResolver.ResolutionException e)
            {
                Debug.LogError(e.ToString());
                return;
            }

            // we want to look at all the .aars to decide to explode or not.
            // Some aars have variables in their AndroidManifest.xml file,
            // e.g. ${applicationId}.  Unity does not understand how to process
            // these, so we handle it here.
            ProcessAars(destinationDirectory);

            SaveAarExplodeCache();
        }
 public override void DoResolution(
     PlayServicesSupport svcSupport, string destinationDirectory,
     PlayServicesSupport.OverwriteConfirmation handleOverwriteConfirmation)
 {
     DoResolution(svcSupport, destinationDirectory, handleOverwriteConfirmation,
                  () => {});
 }
        /// <summary>
        /// Does the resolution of the play-services aars.
        /// </summary>
        /// <param name="svcSupport">Svc support.</param>
        /// <param name="destinationDirectory">Destination directory.</param>
        /// <param name="handleOverwriteConfirmation">Handle overwrite confirmation.</param>
        /// <param name="resolutionComplete">Delegate called when resolution is complete.</param>
        public override void DoResolution(PlayServicesSupport svcSupport, string destinationDirectory,
                                          PlayServicesSupport.OverwriteConfirmation handleOverwriteConfirmation,
                                          System.Action resolutionComplete)
        {
            var sdkPath = svcSupport.SDK;

            // Find / upgrade the Android SDK manager.
            AndroidSdkManager.Create(
                sdkPath,
                (IAndroidSdkManager sdkManager) => {
                if (sdkManager == null)
                {
                    PlayServicesSupport.Log(
                        String.Format("Unable to find the Android SDK manager tool."),
                        level: PlayServicesSupport.LogLevel.Error);
                    return;
                }

                // Get the set of available and installed packages.
                sdkManager.QueryPackages(
                    (AndroidSdkPackageCollection packages) => {
                    if (packages == null)
                    {
                        PlayServicesSupport.Log(
                            String.Format("No packages returned from the Android SDK Manager."),
                            level: PlayServicesSupport.LogLevel.Error);
                        return;
                    }

                    GradleResolve(packages, svcSupport, destinationDirectory,
                                  resolutionComplete);
                });
            }
                );
        }
 /// <summary>
 /// Does the resolution of the play-services aars.
 /// </summary>
 /// <param name="svcSupport">Svc support.</param>
 /// <param name="destinationDirectory">Destination directory.</param>
 /// <param name="handleOverwriteConfirmation">Handle overwrite confirmation.</param>
 /// <param name="resolutionComplete">Delegate called when resolution is complete.</param>
 public virtual void DoResolution(
     PlayServicesSupport svcSupport, string destinationDirectory,
     PlayServicesSupport.OverwriteConfirmation handleOverwriteConfirmation,
     System.Action resolutionComplete)
 {
     DoResolution(svcSupport, destinationDirectory, handleOverwriteConfirmation);
     resolutionComplete();
 }
예제 #5
0
        /// <summary>
        /// Perform the resolution and the exploding/cleanup as needed.
        /// </summary>
        public override void DoResolution(PlayServicesSupport svcSupport,
                                          string destinationDirectory,
                                          PlayServicesSupport.OverwriteConfirmation handleOverwriteConfirmation)
        {
            // Get the collection of dependencies that need to be copied.
            Dictionary <string, Dependency> deps =
                svcSupport.ResolveDependencies(true);

            // Copy the list
            svcSupport.CopyDependencies(deps,
                                        destinationDirectory,
                                        handleOverwriteConfirmation);

            // we want to look at all the .aars to decide to explode or not.
            // Some aars have variables in their AndroidManifest.xml file,
            // e.g. ${applicationId}.  Unity does not understand how to process
            // these, so we handle it here.
            ProcessAars(destinationDirectory);
        }
예제 #6
0
 /// <summary>
 /// Does the resolution of the play-services aars.
 /// </summary>
 /// <param name="svcSupport">Svc support.</param>
 /// <param name="destinationDirectory">Destination directory.</param>
 /// <param name="handleOverwriteConfirmation">Handle overwrite confirmation.</param>
 public abstract void DoResolution(PlayServicesSupport svcSupport,
                                   string destinationDirectory,
                                   PlayServicesSupport.OverwriteConfirmation handleOverwriteConfirmation);
        /// <summary>
        /// Perform the resolution and the exploding/cleanup as needed.
        /// </summary>
        public override void DoResolution(
            PlayServicesSupport svcSupport, string destinationDirectory,
            PlayServicesSupport.OverwriteConfirmation handleOverwriteConfirmation,
            System.Action resolutionComplete)
        {
            System.Action resolve = () => {
                DoResolutionNoAndroidPackageChecks(svcSupport, destinationDirectory,
                                                   handleOverwriteConfirmation);
                resolutionComplete();
            };

            // Set of packages that need to be installed.
            Dictionary <string, bool> installPackages = new Dictionary <string, bool>();
            // Retrieve the set of required packages and whether they're installed.
            Dictionary <string, Dictionary <string, bool> > requiredPackages =
                new Dictionary <string, Dictionary <string, bool> >();

            foreach (Dependency dependency in
                     svcSupport.LoadDependencies(true, keepMissing: true).Values)
            {
                if (dependency.PackageIds != null)
                {
                    foreach (string packageId in dependency.PackageIds)
                    {
                        Dictionary <string, bool> dependencySet;
                        if (!requiredPackages.TryGetValue(packageId, out dependencySet))
                        {
                            dependencySet = new Dictionary <string, bool>();
                        }
                        dependencySet[dependency.Key] = false;
                        requiredPackages[packageId]   = dependencySet;
                        // If the dependency is missing, add it to the set that needs to be
                        // installed.
                        if (System.String.IsNullOrEmpty(dependency.BestVersionPath))
                        {
                            installPackages[packageId] = false;
                        }
                    }
                }
            }

            // If no packages need to be installed or Android SDK package installation is disabled.
            if (installPackages.Count == 0 || !AndroidPackageInstallationEnabled())
            {
                // Report missing packages as warnings and try to resolve anyway.
                foreach (string pkg in requiredPackages.Keys)
                {
                    string depString = System.String.Join(
                        ", ", CollectionToArray(requiredPackages[pkg].Keys));
                    if (installPackages.ContainsKey(pkg) && depString.Length > 0)
                    {
                        Debug.LogWarning(pkg + " not installed or out of date!  This is " +
                                         "required by the following dependencies " + depString);
                    }
                }
                // Attempt resolution.
                resolve();
                return;
            }

            // Find the Android SDK manager.
            string sdkPath     = svcSupport.SDK;
            string androidTool = FindAndroidSdkTool(svcSupport, "android");

            if (androidTool == null || sdkPath == null || sdkPath == "")
            {
                Debug.LogError("Unable to find the Android SDK manager tool.  " +
                               "Required Android packages (" +
                               System.String.Join(", ", CollectionToArray(installPackages.Keys)) +
                               ") can not be installed.  " +
                               PlayServicesSupport.AndroidSdkConfigurationError);
                return;
            }

            // Get the set of available and installed packages.
            GetAvailablePackages(
                androidTool, svcSupport,
                (Dictionary <string, bool> packageInfo) => {
                if (packageInfo == null)
                {
                    return;
                }

                // Filter the set of packages to install by what is available.
                foreach (string pkg in requiredPackages.Keys)
                {
                    bool installed   = false;
                    string depString = System.String.Join(
                        ", ", CollectionToArray(requiredPackages[pkg].Keys));
                    if (packageInfo.TryGetValue(pkg, out installed))
                    {
                        if (!installed)
                        {
                            installPackages[pkg] = false;
                            Debug.LogWarning(pkg + " not installed or out of date!  " +
                                             "This is required by the following " +
                                             "dependencies " + depString);
                        }
                    }
                    else
                    {
                        Debug.LogWarning(pkg + " referenced by " + depString +
                                         " not available in the Android SDK.  This " +
                                         "package will not be installed.");
                        installPackages.Remove(pkg);
                    }
                }

                if (installPackages.Count == 0)
                {
                    resolve();
                    return;
                }

                // Start installation.
                string installPackagesString = System.String.Join(
                    ",", CollectionToArray(installPackages.Keys));
                string packagesCommand   = "update sdk -a -u -t " + installPackagesString;
                CommandLineDialog window = CommandLineDialog.CreateCommandLineDialog(
                    "Install Android SDK packages");
                window.summaryText   = "Retrieving licenses...";
                window.modal         = false;
                window.progressTitle = window.summaryText;
                window.RunAsync(
                    androidTool, packagesCommand,
                    (CommandLine.Result getLicensesResult) => {
                    // Get the start of the license text.
                    int licenseTextStart = getLicensesResult.stdout.IndexOf("--------");
                    if (getLicensesResult.exitCode != 0 || licenseTextStart < 0)
                    {
                        window.Close();
                        Debug.LogError("Unable to retrieve licenses for packages " +
                                       installPackagesString);
                        return;
                    }

                    // Remove the download output from the string.
                    string licenseText = getLicensesResult.stdout.Substring(
                        licenseTextStart);
                    window.summaryText = ("License agreement(s) required to install " +
                                          "Android SDK packages");
                    window.bodyText = licenseText;
                    window.yesText  = "agree";
                    window.noText   = "decline";
                    window.result   = false;
                    window.Repaint();
                    window.buttonClicked = (TextAreaDialog dialog) => {
                        if (!dialog.result)
                        {
                            window.Close();
                            return;
                        }

                        window.summaryText        = "Installing Android SDK packages...";
                        window.bodyText           = "";
                        window.yesText            = "";
                        window.noText             = "";
                        window.buttonClicked      = null;
                        window.progressTitle      = window.summaryText;
                        window.autoScrollToBottom = true;
                        window.Repaint();
                        // Kick off installation.
                        ((CommandLineDialog)window).RunAsync(
                            androidTool, packagesCommand,
                            (CommandLine.Result updateResult) => {
                            window.Close();
                            if (updateResult.exitCode == 0)
                            {
                                resolve();
                            }
                            else
                            {
                                Debug.LogError("Android SDK update failed.  " +
                                               updateResult.stderr + "(" +
                                               updateResult.exitCode.ToString() + ")");
                            }
                        },
                            ioHandler: (new LicenseResponder(true)).AggregateLine,
                            maxProgressLines: 500);
                    };
                },
                    ioHandler: (new LicenseResponder(false)).AggregateLine,
                    maxProgressLines: 250);
            });
        }
예제 #8
0
        /// <summary>
        /// Does the resolution of the play-services aars.
        /// </summary>
        /// <param name="svcSupport">Svc support.</param>
        /// <param name="destinationDirectory">Destination directory.</param>
        /// <param name="handleOverwriteConfirmation">Handle overwrite confirmation.</param>
        /// <param name="resolutionComplete">Delegate called when resolution is complete.</param>
        public override void DoResolution(PlayServicesSupport svcSupport, string destinationDirectory,
                                          PlayServicesSupport.OverwriteConfirmation handleOverwriteConfirmation,
                                          System.Action resolutionComplete)
        {
            string targetSdkVersion  = UnityCompat.GetAndroidPlatform().ToString();
            string minSdkVersion     = UnityCompat.GetAndroidMinSDKVersion().ToString();
            string buildToolsVersion = UnityCompat.GetAndroidBuildToolsVersion();

            var config = new Dictionary <string, string>()
            {
                { "app_id", UnityCompat.ApplicationId },
                { "sdk_version", targetSdkVersion },
                { "min_sdk_version", minSdkVersion },
                { "build_tools_version", buildToolsVersion },
                { "android_sdk_dir", svcSupport.SDK }
            };

            // This creates an enumerable of strings with the json lines for each dep like this:
            // "[\"namespace\", \"package\", \"version\"]"
            var dependencies = svcSupport.LoadDependencies(true, true, false);
            var depLines     = from d in dependencies
                               select "[" + ToJSONList(DepsVersionAsArray(d.Value)) + "]";
            // Get a flattened list of dependencies, excluding any with the "$SDK" path variable,
            // since those will automatically be included in the gradle build.
            var repoLines = new HashSet <string>(
                dependencies.SelectMany(d => d.Value.Repositories)
                .Where(s => !s.Contains(PlayServicesSupport.SdkVariable)));

            var proguard_config_paths = new List <string>()
            {
                Path.Combine(GRADLE_SCRIPT_LOCATION, PROGUARD_UNITY_CONFIG),
                Path.Combine(GRADLE_SCRIPT_LOCATION, PROGUARD_MSG_FIX_CONFIG)
            };

            // Build the full json config as a string.
            string json_config = @"{{
""config"": {{
{0}
}},
""project_deps"": [
{1}
],
""extra_m2repositories"": [
{2}
],
""extra_proguard_configs"": [
{3}
]
}}";

            json_config = String.Format(json_config, ToJSONDictionary(config),
                                        ToJSONList(depLines, ",\n", 4, true),
                                        ToJSONList(repoLines, ",\n", 4),
                                        ToJSONList(proguard_config_paths, ",\n", 4));

            System.IO.File.WriteAllText(GENERATE_CONFIG_PATH, json_config);

            RunGenGradleScript(
                " -c \"" + GENERATE_CONFIG_PATH + "\"" +
                " -b \"" + GENERATE_GRADLE_BUILD_PATH + "\"" +
                " -o \"" + Path.Combine(destinationDirectory, GENERATE_GRADLE_OUTPUT_DIR) + "\"");
        }