public void SignAndroidPackage_DefaultProperties()
        {
            string versionCode = "1",
                   versionName = "1.0",
                   packageName = "com.test";
            var project        = MSBuild.NewProject(testDirectory);

            var projectFile = Path.Combine(tempDirectory, "test.csproj");

            project.Save(projectFile);
            MSBuild.Restore(projectFile);
            MSBuild.Build(projectFile, "SignAndroidPackage");

            var propsPath = Path.Combine(objDirectory, "Xamarin.Android.Lite.props");

            FileAssert.Exists(propsPath);
            var manifestPath = Path.Combine(objDirectory, "AndroidManifest.xml");

            FileAssert.Exists(manifestPath);
            var ns       = AndroidManifest.AndroidNamespace.Namespace;
            var manifest = AndroidManifest.Read(manifestPath);

            Assert.AreEqual(versionCode, manifest.Document.Attribute(ns + "versionCode")?.Value, "versionCode should match");
            Assert.AreEqual(versionName, manifest.Document.Attribute(ns + "versionName")?.Value, "versionName should match");
            Assert.AreEqual(packageName, manifest.Document.Attribute("package")?.Value, "package should match");

            var apkPath = Path.Combine(binDirectory, packageName + ".apk");

            FileAssert.Exists(apkPath);
        }
Exemple #2
0
        public void Generate()
        {
            var task = new GenerateManifest {
                BuildEngine      = engine,
                DestinationFile  = temp,
                PackageName      = "com.test.app",
                ApplicationClass = "My.Namespace.App, MyAssembly",
                ActivityName     = "xamarin.android.lite.MainActivity",
                VersionCode      = "12",
                VersionName      = "2.0.0",
                AppTitle         = "MyApp",
                ActivityTitle    = "MyActivity",
            };

            Assert.IsTrue(task.Execute(), "Execute failed!");

            using (var stream = File.OpenRead(temp)) {
                var manifest = AndroidManifest.Read(stream);
                var xml      = @"<manifest xmlns:android=""http://schemas.android.com/apk/res/android"" android:versionCode=""12"" android:versionName=""2.0.0"" package=""com.test.app"" platformBuildVersionCode=""27"" platformBuildVersionName=""8.1.0"">
  <uses-sdk android:minSdkVersion=""19"" android:targetSdkVersion=""27"" />
  <uses-permission android:name=""android.permission.INTERNET"" />
  <uses-permission android:name=""android.permission.READ_EXTERNAL_STORAGE"" />
  <uses-permission android:name=""android.permission.WRITE_EXTERNAL_STORAGE"" />
  <uses-permission android:name=""android.permission.ACCESS_NETWORK_STATE"" />
  <uses-permission android:name=""android.permission.BATTERY_STATS"" />
  <uses-permission android:name=""android.permission.CAMERA"" />
  <uses-permission android:name=""android.permission.FLASHLIGHT"" />
  <uses-permission android:name=""android.permission.ACCESS_COARSE_LOCATION"" />
  <uses-permission android:name=""android.permission.ACCESS_FINE_LOCATION"" />
  <uses-permission android:name=""android.permission.VIBRATE"" />
  <uses-feature android:name=""android.hardware.location"" android:required=""false"" />
  <uses-feature android:name=""android.hardware.location.gps"" android:required=""false"" />
  <uses-feature android:name=""android.hardware.location.network"" android:required=""false"" />
  <application android:label=""MyApp"" android:icon=""2130903040"" android:name=""android.app.Application"" android:debuggable=""true"" android:allowBackup=""true"">
    <meta-data android:name=""Xamarin.Android.Lite.Application"" android:value=""My.Namespace.App, MyAssembly"" />
    <activity android:theme=""2131493263"" android:label=""MyActivity"" android:icon=""2130903040"" android:name=""xamarin.android.lite.MainActivity"" android:configChanges=""1152"">
      <intent-filter>
        <action android:name=""android.intent.action.MAIN"" />
        <category android:name=""android.intent.category.LAUNCHER"" />
      </intent-filter>
    </activity>
    <service android:name=""md5dcb6eccdc824e0677ffae8ccdde42930.KeepAliveService"" />
    <receiver android:label=""Essentials Battery Broadcast Receiver"" android:name=""md5d630c3d3bfb5f5558520331566132d97.BatteryBroadcastReceiver"" android:enabled=""true"" android:exported=""false"" />
    <receiver android:label=""Essentials Connectivity Broadcast Receiver"" android:name=""md5d630c3d3bfb5f5558520331566132d97.ConnectivityBroadcastReceiver"" android:enabled=""true"" android:exported=""false"" />
    <receiver android:label=""Essentials Power Broadcast Receiver"" android:name=""md5d630c3d3bfb5f5558520331566132d97.PowerBroadcastReceiver"" android:enabled=""true"" android:exported=""false"" />
    <receiver android:name=""md51558244f76c53b6aeda52c8a337f2c37.PowerSaveModeBroadcastReceiver"" android:enabled=""true"" android:exported=""false"" />
    <provider android:name=""mono.MonoRuntimeProvider"" android:exported=""false"" android:authorities=""com.test.app.mono.MonoRuntimeProvider.__mono_init_"" android:initOrder=""2147483647"" />
    <receiver android:name=""mono.android.Seppuku"">
      <intent-filter>
        <action android:name=""mono.android.intent.action.SEPPUKU"" />
        <category android:name=""mono.android.intent.category.SEPPUKU.com.test.app"" />
      </intent-filter>
    </receiver>
  </application>
</manifest>";
                Assert.AreEqual(xml, manifest.Document.ToString());
            }
        }
        void Read()
        {
            var doc           = AndroidManifest.Read(binaryManifest);
            var xmlFromBinary = doc.Document.ToString();
            var xmlFromText   = LoadText();

            Assert.IsTrue(doc.Strings?.Count > 0, "Strings should be non-empty!");
            Assert.IsTrue(doc.Resources?.Count > 0, "Resources should be non-empty!");
            Assert.IsFalse(string.IsNullOrEmpty(doc.PlatformBuildVersionName), "FileVersion should be non-empty!");
            Assert.AreEqual(xmlFromText, xmlFromBinary);
        }
        public void SignAndroidPackage_UpdateProperties()
        {
            string versionCode = "1234",
                   versionName = "1.2.3.4",
                   packageName = "com.mycompany.myapp";

            var versionCodeElement = MSBuild.NewElement("AndroidVersionCode").WithValue(versionCode);
            var versionNameElement = MSBuild.NewElement("AndroidVersionName").WithValue(versionName);
            var packageNameElement = MSBuild.NewElement("AndroidPackageName").WithValue(packageName);

            var project       = MSBuild.NewProject(testDirectory);
            var propertyGroup = MSBuild.NewElement("PropertyGroup");

            propertyGroup.Add(versionCodeElement);
            propertyGroup.Add(versionNameElement);
            propertyGroup.Add(packageNameElement);
            project.AddFirst(propertyGroup);

            var projectFile = Path.Combine(tempDirectory, "test.csproj");

            project.Save(projectFile);
            MSBuild.Restore(projectFile);
            MSBuild.Build(projectFile, "SignAndroidPackage");

            versionCodeElement.Value = versionCode = "99";
            versionNameElement.Value = versionName = "2.0";
            packageNameElement.Value = packageName = "com.mycompany.myapp2";
            project.Save(projectFile);
            MSBuild.Build(projectFile, "SignAndroidPackage");

            var manifestPath = Path.Combine(objDirectory, "AndroidManifest.xml");

            FileAssert.Exists(manifestPath);
            var ns       = AndroidManifest.AndroidNamespace.Namespace;
            var manifest = AndroidManifest.Read(manifestPath);

            Assert.AreEqual(versionCode, manifest.Document.Attribute(ns + "versionCode")?.Value, "versionCode should match");
            Assert.AreEqual(versionName, manifest.Document.Attribute(ns + "versionName")?.Value, "versionName should match");
            Assert.AreEqual(packageName, manifest.Document.Attribute("package")?.Value, "package should match");
        }
        void Write()
        {
            var expectedChunks      = new StringBuilder();
            var expectedDoc         = AndroidManifest.Read(binaryManifest, (t, c, p) => expectedChunks.AppendLine($"{t}, chunkSize: {c}, position: {p}"));
            var expectedStrings     = expectedDoc.Strings;
            var expectedResources   = expectedDoc.Resources;
            var expectedFileVersion = expectedDoc.PlatformBuildVersionName;

            var stream = new MemoryStream();

            expectedDoc.Write(stream);

            //Compare the string tables
            var actualStrings     = expectedDoc.Strings;
            var actualResources   = expectedDoc.Resources;
            var actualFileVersion = expectedDoc.PlatformBuildVersionName;

            ContainsAllStrings(expectedStrings, actualStrings);
            Assert.AreEqual(expectedResources, expectedResources, "Resources should match!");
            Assert.AreEqual(expectedFileVersion, actualFileVersion, "FileVersion should match!");

            stream.Seek(0, SeekOrigin.Begin);
            var actualChunks = new StringBuilder();
            var actualDoc    = AndroidManifest.Read(stream, (t, c, p) => actualChunks.AppendLine($"{t}, chunkSize: {c}, position: {p}"));

            Assert.AreEqual(expectedChunks.ToString(), actualChunks.ToString(), "Chunk sizes and ordering should match!");
            actualStrings     = actualDoc.Strings;
            actualResources   = actualDoc.Resources;
            actualFileVersion = actualDoc.PlatformBuildVersionName;
            ContainsAllStrings(expectedStrings, actualStrings);
            Assert.AreEqual(expectedResources, expectedResources, "Resources should match!");
            Assert.AreEqual(expectedFileVersion, actualFileVersion, "FileVersion should match!");

            Assert.AreEqual(expectedDoc.Document.ToString(), actualDoc.Document.ToString());

            Assert.AreEqual(binaryManifest.Length, stream.Length, "Stream lengths should match!");
        }