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); }
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!"); }