Skip to content

Commit 8241973

Browse files
jonathanpeppersdellis1972
authored andcommitted
[Xamarin.Android.Build.Tasks] App Bundle support for PackageForAndroid (#3883)
Fixes: #3804 Reviewing our App Bundle implementation, there were two things missing: * An unsigned app bundle in `$(OutputPath)`. This is useful when calling the `PackageForAndroid` target, and signing is done manually some point later. * No support for `$(MonoSymbolArchive)=True` to generate the `.mSYM` symbols. The only changes needed to make these work, was to refactor the `_CopyPackage` MSBuild target so it knows about App Bundles. I also created an `$(_MSYMDirectory)` property, to simplify usage of: `$(OutDir)$(_AndroidPackage).$(AndroidPackageFormat).mSYM` I updated some tests in `PackagingTest.cs`, to verify the `.mSYM` directory for both `.apk`'s and `.aab`'s.
1 parent 6b36be4 commit 8241973

File tree

2 files changed

+42
-22
lines changed

2 files changed

+42
-22
lines changed

src/Xamarin.Android.Build.Tasks/Tests/Xamarin.Android.Build.Tests/PackagingTest.cs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,36 +15,38 @@ public class PackagingTest : BaseTest
1515
{
1616
#pragma warning disable 414
1717
static object [] ManagedSymbolsArchiveSource = new object [] {
18-
// isRelease, monoSymbolArchive, archiveShouldExists,
19-
new object[] { false , false , false },
20-
new object[] { true , true , true },
21-
new object[] { true , false , false },
18+
// isRelease, monoSymbolArchive, packageFormat,
19+
new object[] { false , false , "apk" },
20+
new object[] { true , true , "apk" },
21+
new object[] { true , false , "apk" },
22+
new object[] { true , true , "aab" },
2223
};
2324
#pragma warning restore 414
2425

2526
[Test]
2627
[TestCaseSource (nameof(ManagedSymbolsArchiveSource))]
27-
public void CheckManagedSymbolsArchive (bool isRelease, bool monoSymbolArchive, bool archiveShouldExists)
28+
public void CheckManagedSymbolsArchive (bool isRelease, bool monoSymbolArchive, string packageFormat)
2829
{
2930
var proj = new XamarinAndroidApplicationProject () {
3031
IsRelease = isRelease,
3132
};
3233
proj.SetProperty (proj.ReleaseProperties, "MonoSymbolArchive", monoSymbolArchive);
3334
proj.SetProperty (proj.ReleaseProperties, KnownProperties.AndroidCreatePackagePerAbi, "true");
3435
proj.SetProperty (proj.ReleaseProperties, KnownProperties.AndroidSupportedAbis, "armeabi-v7a;x86");
35-
using (var b = CreateApkBuilder (Path.Combine ("temp", TestContext.CurrentContext.Test.Name))) {
36+
proj.SetProperty (proj.ReleaseProperties, "AndroidPackageFormat", packageFormat);
37+
using (var b = CreateApkBuilder ()) {
3638
b.Verbosity = Microsoft.Build.Framework.LoggerVerbosity.Diagnostic;
3739
b.ThrowOnBuildFailure = false;
3840
Assert.IsTrue (b.Build (proj), "first build failed");
3941
var outputPath = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath);
40-
var archivePath = Path.Combine (outputPath, proj.PackageName + ".apk.mSYM");
41-
Assert.AreEqual (archiveShouldExists, Directory.Exists (archivePath),
42-
string.Format ("The msym archive {0} exist.", archiveShouldExists ? "should" : "should not"));
42+
var archivePath = Path.Combine (outputPath, $"{proj.PackageName}.{packageFormat}.mSYM");
43+
Assert.AreEqual (monoSymbolArchive, Directory.Exists (archivePath),
44+
string.Format ("The msym archive {0} exist.", monoSymbolArchive ? "should" : "should not"));
4345
}
4446
}
4547

4648
[Test]
47-
public void CheckBuildIdIsUnique ()
49+
public void CheckBuildIdIsUnique ([Values ("apk", "aab")] string packageFormat)
4850
{
4951
const string supportedAbis = "armeabi-v7a;x86";
5052

@@ -57,12 +59,13 @@ public void CheckBuildIdIsUnique ()
5759
proj.SetProperty (proj.ReleaseProperties, "DebugType", "PdbOnly");
5860
proj.SetProperty (proj.ReleaseProperties, KnownProperties.AndroidCreatePackagePerAbi, "true");
5961
proj.SetProperty (proj.ReleaseProperties, KnownProperties.AndroidSupportedAbis, supportedAbis);
60-
using (var b = CreateApkBuilder (Path.Combine ("temp", TestContext.CurrentContext.Test.Name))) {
62+
proj.SetProperty (proj.ReleaseProperties, "AndroidPackageFormat", packageFormat);
63+
using (var b = CreateApkBuilder ()) {
6164
b.Verbosity = Microsoft.Build.Framework.LoggerVerbosity.Diagnostic;
6265
b.ThrowOnBuildFailure = false;
6366
Assert.IsTrue (b.Build (proj), "first build failed");
6467
var outputPath = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath);
65-
var archivePath = Path.Combine (outputPath, proj.PackageName + ".apk.mSYM");
68+
var archivePath = Path.Combine (outputPath, $"{proj.PackageName}.{packageFormat}.mSYM");
6669
var allFilesInArchive = Directory.GetFiles (archivePath, "*", SearchOption.AllDirectories);
6770
string extension = "dll";
6871
Assert.IsTrue (allFilesInArchive.Any (x => Path.GetFileName (x) == $"{proj.ProjectName}.{extension}"), $"{proj.ProjectName}.{extension} should exist in {archivePath}");
@@ -78,7 +81,7 @@ public void CheckBuildIdIsUnique ()
7881
Assert.IsTrue (envvars.TryGetValue ("XAMARIN_BUILD_ID", out buildID), "The environment should contain a XAMARIN_BUILD_ID");
7982
buildIds.Add ("all", buildID);
8083

81-
var msymDirectory = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, proj.PackageName + ".apk.mSYM");
84+
var msymDirectory = Path.Combine (Root, b.ProjectDirectory, proj.OutputPath, $"{proj.PackageName}.{packageFormat}.mSYM");
8285
Assert.IsTrue (File.Exists (Path.Combine (msymDirectory, "manifest.xml")), "manifest.xml should exist in", msymDirectory);
8386
var doc = XDocument.Load (Path.Combine (msymDirectory, "manifest.xml"));
8487

src/Xamarin.Android.Build.Tasks/Xamarin.Android.Common.targets

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -770,7 +770,9 @@ Copyright (C) 2011-2012 Xamarin. All rights reserved.
770770
<_ApkSetIntermediate>$(IntermediateOutputPath)android\bin\$(_AndroidPackage).apks</_ApkSetIntermediate>
771771
<ApkFile>$(OutDir)$(_AndroidPackage).apk</ApkFile>
772772
<ApkFileSigned>$(OutDir)$(_AndroidPackage)-Signed.apk</ApkFileSigned>
773+
<_AabFile>$(OutDir)$(_AndroidPackage).aab</_AabFile>
773774
<_AabFileSigned>$(OutDir)$(_AndroidPackage)-Signed.aab</_AabFileSigned>
775+
<_MSYMDirectory>$(OutDir)$(_AndroidPackage).$(AndroidPackageFormat).mSYM</_MSYMDirectory>
774776
</PropertyGroup>
775777
</Target>
776778

@@ -2967,6 +2969,16 @@ because xbuild doesn't support framework reference assemblies.
29672969
;$(_AndroidBuildPropertiesCache)
29682970
;@(ApkFiles)
29692971
</_CopyPackageInputs>
2972+
<_CopyPackageInputs Condition=" '$(AndroidPackageFormat)' == 'aab' ">
2973+
$(_CopyPackageInputs)
2974+
;$(_AppBundleIntermediate)
2975+
</_CopyPackageInputs>
2976+
<_CopyPackageOutputs Condition=" '$(AndroidPackageFormat)' != 'aab' ">
2977+
$(ApkFile)
2978+
</_CopyPackageOutputs>
2979+
<_CopyPackageOutputs Condition=" '$(AndroidPackageFormat)' == 'aab' ">
2980+
$(_AabFile)
2981+
</_CopyPackageOutputs>
29702982
</PropertyGroup>
29712983
</Target>
29722984

@@ -2991,15 +3003,17 @@ because xbuild doesn't support framework reference assemblies.
29913003
<Target Name="_CopyPackage"
29923004
DependsOnTargets="$(_CopyPackageDependsOn)"
29933005
Inputs="$(_CopyPackageInputs)"
2994-
Outputs="$(ApkFile)">
3006+
Outputs="$(_CopyPackageOutputs)">
29953007

29963008
<Delete Files="$(ApkFile)" Condition="Exists ('$(ApkFile)')" />
3009+
<Delete Files="$(_AabFile)" Condition="Exists ('$(_AabFile)')" />
29973010

2998-
<Copy SourceFiles="%(ApkFiles.FullPath)" DestinationFolder="$(OutDir)" />
3011+
<Copy Condition=" '$(AndroidPackageFormat)' != 'aab' " SourceFiles="%(ApkFiles.FullPath)" DestinationFolder="$(OutDir)" />
3012+
<Copy Condition=" '$(AndroidPackageFormat)' == 'aab' " SourceFiles="$(_AppBundleIntermediate)" DestinationFolder="$(OutDir)" />
29993013

3000-
<MakeDir Directories="$(OutDir)$(_AndroidPackage).apk.mSYM" Condition=" '$(MonoSymbolArchive)' == 'True' " />
3014+
<MakeDir Directories="$(_MSYMDirectory)" Condition=" '$(MonoSymbolArchive)' == 'True' " />
30013015
<Exec
3002-
Command="&quot;$(MonoAndroidBinDirectory)mono-symbolicate&quot; store-symbols &quot;$(OutDir)$(_AndroidPackage).apk.mSYM&quot; &quot;$(IntermediateOutputPath)android/assets&quot;"
3016+
Command="&quot;$(MonoAndroidBinDirectory)mono-symbolicate&quot; store-symbols &quot;$(_MSYMDirectory)&quot; &quot;$(IntermediateOutputPath)android/assets&quot;"
30033017
Condition=" '$(MonoSymbolArchive)' == 'True' "
30043018
/>
30053019

@@ -3009,7 +3023,7 @@ because xbuild doesn't support framework reference assemblies.
30093023

30103024
<Copy Condition=" '$(MonoSymbolArchive)' == 'True' And '%(_SymbolicateFiles.Filename)' != '' "
30113025
SourceFiles="%(_SymbolicateFiles.Identity)"
3012-
DestinationFolder="$(OutDir)$(_AndroidPackage).apk.mSYM\%(_SymbolicateFiles.RecursiveDir)"
3026+
DestinationFolder="$(_MSYMDirectory)\%(_SymbolicateFiles.RecursiveDir)"
30133027
SkipUnchangedFiles="true"
30143028
/>
30153029

@@ -3021,19 +3035,19 @@ because xbuild doesn't support framework reference assemblies.
30213035
Condition=" '$(_XamarinBuildId)' != '' And '$(MonoSymbolArchive)' == 'True' "
30223036
BuildId="$(_XamarinBuildId)"
30233037
PackageName="$(_AndroidPackage)"
3024-
OutputDirectory="$(OutDir)$(_AndroidPackage).apk.mSYM"
3038+
OutputDirectory="$(_MSYMDirectory)"
30253039
/>
30263040

30273041
<WriteLinesToFile
30283042
Condition=" '$(MonoSymbolArchive)' == 'True' "
30293043
File="$(IntermediateOutputPath)$(CleanFile)"
3030-
Lines="@(_SymbolicateFiles->'$(OutDir)$(_AndroidPackage).apk.mSYM\%(Filename)%(Extension)')"
3044+
Lines="@(_SymbolicateFiles->'$(_MSYMDirectory)\%(Filename)%(Extension)')"
30313045
Overwrite="false"/>
30323046

30333047
<WriteLinesToFile
30343048
Condition=" '$(MonoSymbolArchive)' == 'True' And '%(_SymbolicateFiles.Filename)' != '' "
30353049
File="$(IntermediateOutputPath)$(CleanFile)"
3036-
Lines="$(OutDir)$(_AndroidPackage).apk.mSYM\%(_SymbolicateFiles.RecursiveDir)%(_SymbolicateFiles.Filename)%(_SymbolicateFiles.Extension)"
3050+
Lines="$(_MSYMDirectory)\%(_SymbolicateFiles.RecursiveDir)%(_SymbolicateFiles.Filename)%(_SymbolicateFiles.Extension)"
30373051
Overwrite="false"/>
30383052

30393053
<Delete Files="$(_UploadFlagFile)" Condition="Exists ('$(_UploadFlagFile)')" />
@@ -3259,7 +3273,7 @@ because xbuild doesn't support framework reference assemblies.
32593273
<GetAndroidPackageName ManifestFile="$(ProjectDir)$(AndroidManifest)" AssemblyName="$(AssemblyName)">
32603274
<Output TaskParameter="PackageName" PropertyName="_AndroidPackage" />
32613275
</GetAndroidPackageName>
3262-
<RemoveDirFixed Directories="$(OutDir)$(_AndroidPackage).apk.mSYM" Condition=" '$(_AndroidPackage)' != '' And Exists ('$(OutDir)$(_AndroidPackage).apk.mSYM')" />
3276+
<RemoveDirFixed Directories="$(OutDir)$(_AndroidPackage).$(AndroidPackageFormat).mSYM" Condition=" '$(_AndroidPackage)' != '' " />
32633277
</Target>
32643278

32653279
<Target Name="_CleanDesignTimeIntermediateDir">
@@ -3328,6 +3342,9 @@ because xbuild doesn't support framework reference assemblies.
33283342
<CreateItem Include="$(ApkFileIntermediate)">
33293343
<Output TaskParameter="Include" ItemName="FileWrites"/>
33303344
</CreateItem>
3345+
<CreateItem Include="$(_AabFile)">
3346+
<Output TaskParameter="Include" ItemName="FileWrites"/>
3347+
</CreateItem>
33313348
<CreateItem Include="$(_AabFileSigned)">
33323349
<Output TaskParameter="Include" ItemName="FileWrites"/>
33333350
</CreateItem>

0 commit comments

Comments
 (0)