Skip to content

Commit d053553

Browse files
[Xamarin.Android.Build.Tasks] error for Android.Support
Context: #8478 Some hardcoded paths/properties in Xamarin.AndroidX.Migration cause tests failures in #8478 such as: (_AndroidXCecilfy target) -> /Users/runner/.nuget/packages/xamarin.androidx.migration/1.0.8/buildTransitive/monoandroid90/Xamarin.AndroidX.Migration.targets(227,9): error : Source assembly does not exist: 'obj/Debug/android/assets/UnnamedProject.dll'. Where `$(MonoAndroidIntermediateAssetsDir)` does not account for a new architecture in the path: <ItemGroup> <_AndroidXFileToCecilfy Include="@(ResolvedUserAssemblies->'$(MonoAndroidIntermediateAssetsDir)%(Filename)%(Extension)')" Condition="('%(ResolvedUserAssemblies.TargetFrameworkIdentifier)' == 'MonoAndroid' or '%(ResolvedUserAssemblies.HasMonoAndroidReference)' == 'true') and ('%(ResolvedUserAssemblies.AndroidXSkipAndroidXMigration)' != 'true')" /> </ItemGroup> We don't really *support* the old Android.Support libraries or AndroidX.Migration, but we don't have any build warnings or errors in place for this. Introduce a `XA1039` error in .NET 9 if any packages are found matching: * `Xamarin.Android.Support.*` * `Xamarin.Android.Arch.*` The biggest impact here is going to be many of our old tests, which use the support libraries in various forms. Improvements & general cleanup: * Removed all old/unused packages in `KnownPackages.cs` * Updated `KnownPackages.cs` to latest versions, including Xamarin.Forms * Android Wear tests are now migrated from support to AndroidX: https://android-developers.googleblog.com/2016/04/build-beautifully-for-android-wear.html * `CheckEmbeddedSupportLibraryResources` -> moved to AndroidX * `BuildHasNoWarnings` was not appropriately applying `IsRelease`. * `Android.Support.v8.RenderScript` removed in favor of inline `.so` file. * A few tests that used support libraries to create a project large numbers of dependencies, moved to `XamarinFormsAndroidApplicationProject`. * `ResolveLibraryProjectImports` -> sorted comparisions * `XamarinFormsAndroidApplicationProject` has a workaround for Guava: dotnet/android-libraries#535 Removed tests: * `AndroidXMigration`, `AndroidXMigrationBug` * `ResolveLibraryImportsWithReadonlyFiles`, seemed duplicate of other Android Wear tests, and used support libraries. * `ExtraAaptManifest` as it depends on `Xamarin.Android.Fabric` and `Xamarin.Android.Crashlytics`. These are deprecated and depend on support libraries. * `BuildProguardEnabledProjectSource` now only tests `Release` mode. Since updating to AndroidX, `Debug` mode was triggering multi-dex. Making it difficult to assert contents of `*.dex` files. In a future PR, we will backport these changes, but downgrade the error to a warning: --<AndroidError Code="XA1039" ++<AndroidWarning Code="XA1039" ResourceName="XA1039" FormatArguments="9" Condition=" '@(_AndroidUnsupportedPackages->Count())' != '0' " />
1 parent a34988c commit d053553

22 files changed

+203
-789
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
---
2+
title: Xamarin.Android error XA1039
3+
description: XA1039 error code
4+
ms.date: 1/10/2024
5+
---
6+
# Xamarin.Android error XA1039
7+
8+
## Example messages
9+
10+
```
11+
error XA1039: The Android Support libraries are not longer supported in .NET 9, please migrate to AndroidX. See https://aka.ms/xamarin/androidx for more details.
12+
```
13+
14+
## Issue
15+
16+
Outdated "Android Support Library" packages are no longer supported in .NET 9:
17+
18+
* `Xamarin.Android.Arch.*`
19+
* `Xamarin.Android.Support.*`
20+
21+
The underlying Java libraries are no longer supported by Google since the final
22+
28.0.0 release. See the [Android Support Library Documentation][support] for
23+
details.
24+
25+
Some example prefixes of the newer, supported AndroidX packages are:
26+
27+
* `Xamarin.AndroidX.*`
28+
* `Xamarin.AndroidX.Arch.*`
29+
30+
For more information about the Android Support libraries or AndroidX, see:
31+
32+
* [Android Support Library Documentation][support]
33+
* [AndroidX Documentation](https://developer.android.com/jetpack/androidx)
34+
35+
[support]: https://developer.android.com/topic/libraries/support-library/packages
36+
37+
## Solution
38+
39+
Remove all NuGet package references to `Xamarin.Android.Support` or
40+
`Xamarin.Android.Arch` in favor of the new AndroidX equivalents.
41+
42+
This also can occur if you are using a NuGet package with a transitive
43+
dependency on the Android support packages. In this case, you will need to
44+
remove the package or contact the package author.
45+
46+
See the [AndroidX migration documentation](https://aka.ms/xamarin/androidx) for
47+
details.

src/Xamarin.Android.Build.Tasks/Properties/Resources.resx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,4 +1006,9 @@ To use a custom JDK path for a command line build, set the 'JavaSdkDirectory' MS
10061006
{0} - The deprecated MSBuild property name
10071007
{1} - The numeric version of .NET</comment>
10081008
</data>
1009+
<data name="XA1039" xml:space="preserve">
1010+
<value>The Android Support libraries are no longer supported in .NET {0}, please migrate to AndroidX. See https://aka.ms/xamarin/androidx for more details.</value>
1011+
<comment>The following are literal names and should not be translated: Android Support, AndroidX, .NET.
1012+
{0} - The numeric version of .NET</comment>
1013+
</data>
10091014
</root>

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

Lines changed: 8 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -138,23 +138,17 @@ public void DesignTimeBuild ([Values(false, true)] bool isRelease, [Values (fals
138138
}
139139

140140
[Test]
141-
public void CheckEmbeddedSupportLibraryResources ()
141+
public void CheckEmbeddedAndroidXResources ()
142142
{
143143
var proj = new XamarinAndroidApplicationProject () {
144144
IsRelease = true,
145145
PackageReferences = {
146-
KnownPackages.SupportMediaCompat_27_0_2_1,
147-
KnownPackages.SupportFragment_27_0_2_1,
148-
KnownPackages.SupportCoreUtils_27_0_2_1,
149-
KnownPackages.SupportCoreUI_27_0_2_1,
150-
KnownPackages.SupportCompat_27_0_2_1,
151-
KnownPackages.AndroidSupportV4_27_0_2_1,
152-
KnownPackages.SupportV7AppCompat_27_0_2_1,
146+
KnownPackages.AndroidXAppCompat
153147
},
154148
};
155149
using (var b = CreateApkBuilder ()) {
156150
Assert.IsTrue (b.Build (proj), "First build should have succeeded.");
157-
var Rdrawable = b.Output.GetIntermediaryPath (Path.Combine ("android", "bin", "classes", "android", "support", "v7", "appcompat", "R$drawable.class"));
151+
var Rdrawable = b.Output.GetIntermediaryPath (Path.Combine ("android", "bin", "classes", "androidx", "appcompat", "R$drawable.class"));
158152
Assert.IsTrue (File.Exists (Rdrawable), $"{Rdrawable} should exist");
159153
}
160154
}
@@ -410,8 +404,7 @@ protected override void OnClick()
410404
}
411405
}"
412406
});
413-
proj.PackageReferences.Add (KnownPackages.AndroidSupportV4_27_0_2_1);
414-
proj.PackageReferences.Add (KnownPackages.SupportV7AppCompat_27_0_2_1);
407+
proj.PackageReferences.Add (KnownPackages.AndroidXAppCompat);
415408
using (var libb = CreateDllBuilder (Path.Combine (projectPath, lib.ProjectName), cleanupOnDispose: false))
416409
using (var b = CreateApkBuilder (Path.Combine (projectPath, proj.ProjectName), cleanupOnDispose: false)) {
417410
Assert.IsTrue (libb.Build (lib), "Library Build should have succeeded.");
@@ -830,11 +823,7 @@ public void CheckFilesAreRemoved () {
830823
</style>
831824
</resources>",
832825
}
833-
},
834-
PackageReferences = {
835-
KnownPackages.SupportV7AppCompat_27_0_2_1,
836-
KnownPackages.AndroidSupportV4_27_0_2_1,
837-
},
826+
}
838827
};
839828
using (var builder = CreateApkBuilder ()) {
840829
Assert.IsTrue (builder.Build (proj), "Build should have succeeded");
@@ -1033,13 +1022,7 @@ public void BuildAppWithManagedResourceParserAndLibraries ()
10331022
new BuildItem.ProjectReference (@"..\Lib1\Lib1.csproj", libProj.ProjectName, libProj.ProjectGuid),
10341023
},
10351024
PackageReferences = {
1036-
KnownPackages.SupportMediaCompat_27_0_2_1,
1037-
KnownPackages.SupportFragment_27_0_2_1,
1038-
KnownPackages.SupportCoreUtils_27_0_2_1,
1039-
KnownPackages.SupportCoreUI_27_0_2_1,
1040-
KnownPackages.SupportCompat_27_0_2_1,
1041-
KnownPackages.AndroidSupportV4_27_0_2_1,
1042-
KnownPackages.SupportV7AppCompat_27_0_2_1,
1025+
KnownPackages.AndroidXAppCompat
10431026
},
10441027
};
10451028
appProj.SetProperty ("AndroidUseManagedDesignTimeResourceGenerator", "True");
@@ -1224,20 +1207,7 @@ public void CustomViewAddResourceId ()
12241207
{
12251208
var proj = new XamarinAndroidApplicationProject ();
12261209
proj.LayoutMain = proj.LayoutMain.Replace ("</LinearLayout>", "<android.support.design.widget.BottomNavigationView android:id=\"@+id/navigation\" /></LinearLayout>");
1227-
proj.PackageReferences.Add (KnownPackages.Android_Arch_Core_Common_26_1_0);
1228-
proj.PackageReferences.Add (KnownPackages.Android_Arch_Lifecycle_Common_26_1_0);
1229-
proj.PackageReferences.Add (KnownPackages.Android_Arch_Lifecycle_Runtime_26_1_0);
1230-
proj.PackageReferences.Add (KnownPackages.AndroidSupportV4_27_0_2_1);
1231-
proj.PackageReferences.Add (KnownPackages.SupportCompat_27_0_2_1);
1232-
proj.PackageReferences.Add (KnownPackages.SupportCoreUI_27_0_2_1);
1233-
proj.PackageReferences.Add (KnownPackages.SupportCoreUtils_27_0_2_1);
1234-
proj.PackageReferences.Add (KnownPackages.SupportDesign_27_0_2_1);
1235-
proj.PackageReferences.Add (KnownPackages.SupportFragment_27_0_2_1);
1236-
proj.PackageReferences.Add (KnownPackages.SupportMediaCompat_27_0_2_1);
1237-
proj.PackageReferences.Add (KnownPackages.SupportV7AppCompat_27_0_2_1);
1238-
proj.PackageReferences.Add (KnownPackages.SupportV7CardView_27_0_2_1);
1239-
proj.PackageReferences.Add (KnownPackages.SupportV7MediaRouter_27_0_2_1);
1240-
proj.PackageReferences.Add (KnownPackages.SupportV7RecyclerView_27_0_2_1);
1210+
proj.PackageReferences.Add (KnownPackages.AndroidXAppCompat);
12411211
using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) {
12421212
Assert.IsTrue (b.Build (proj), "first build should have succeeded");
12431213

@@ -1257,7 +1227,7 @@ public void CustomViewAddResourceId ()
12571227
var r_java = Path.Combine (Root, b.ProjectDirectory, proj.IntermediateOutputPath, "android", "src", proj.PackageNameJavaIntermediatePath, "R.java");
12581228
FileAssert.Exists (r_java);
12591229
var r_java_contents = File.ReadAllLines (r_java);
1260-
Assert.IsTrue (StringAssertEx.ContainsText (r_java_contents, textView1), $"android/support/compat/R.java should contain `{textView1}`!");
1230+
Assert.IsTrue (StringAssertEx.ContainsText (r_java_contents, textView1), $"{r_java} should contain `{textView1}`!");
12611231
}
12621232
}
12631233

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

Lines changed: 1 addition & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,6 @@ public void BuildAarBindigLibraryWithNuGetPackageOfJar (string classParser)
167167
var proj = new XamarinAndroidBindingProject () {
168168
IsRelease = true,
169169
};
170-
proj.PackageReferences.Add (KnownPackages.AndroidSupportV4_27_0_2_1);
171170
proj.Jars.Add (new AndroidItem.LibraryProjectZip ("Jars\\android-crop-1.0.1.aar") {
172171
WebContent = "https://repo1.maven.org/maven2/com/soundcloud/android/android-crop/1.0.1/android-crop-1.0.1.aar"
173172
});
@@ -187,13 +186,12 @@ public void BuildAarBindigLibraryWithNuGetPackageOfJar (string classParser)
187186
[Test]
188187
[TestCaseSource (nameof (ClassParseOptions))]
189188
[NonParallelizable]
190-
public void BuildLibraryZipBindigLibraryWithAarOfJar (string classParser)
189+
public void BuildLibraryZipBindingLibraryWithAarOfJar (string classParser)
191190
{
192191
var proj = new XamarinAndroidBindingProject () {
193192
IsRelease = true,
194193
};
195194
proj.AndroidClassParser = classParser;
196-
proj.PackageReferences.Add (KnownPackages.AndroidSupportV4_27_0_2_1);
197195
proj.Jars.Add (new AndroidItem.LibraryProjectZip ("Jars\\aFileChooserBinaries.zip") {
198196
WebContentFileNameFromAzure = "aFileChooserBinaries.zip"
199197
});
@@ -202,41 +200,6 @@ public void BuildLibraryZipBindigLibraryWithAarOfJar (string classParser)
202200
<attr path=""/api/package[@name='com.ipaulpro.afilechooser']/class[@name='FileListAdapter']/method[@name='getItem' and count(parameter)=1 and parameter[1][@type='int']]"" name=""managedReturn"">Java.Lang.Object</attr>
203201
<attr path=""/api/package[@name='com.ipaulpro.afilechooser']/class[@name='FileLoader']/method[@name='loadInBackground' and count(parameter)=0]"" name=""managedName"">LoadInBackgroundImpl</attr>
204202
</metadata>";
205-
proj.Sources.Add (new BuildItem (BuildActions.Compile, "Fixup.cs") {
206-
TextContent = () => @"using System;
207-
using System.Collections.Generic;
208-
using Android.App;
209-
using Android.Runtime;
210-
211-
namespace Com.Ipaulpro.Afilechooser {
212-
[Activity (Name = ""com.ipaulpro.afilechooser.FileChooserActivity"",
213-
Icon = ""@drawable/ic_chooser"",
214-
Exported = true)]
215-
[IntentFilter (new string [] {""android.intent.action.GET_CONTENT""},
216-
Categories = new string [] {
217-
""android.intent.category.DEFAULT"",
218-
//""android.intent.category.OPENABLE""
219-
},
220-
DataMimeType = ""*/*"")]
221-
public partial class FileChooserActivity
222-
{
223-
}
224-
225-
public partial class FileListFragment : global::Android.Support.V4.App.ListFragment, global::Android.Support.V4.App.LoaderManager.ILoaderCallbacks {
226-
227-
public void OnLoadFinished (global::Android.Support.V4.Content.Loader p0, Java.Lang.Object p1)
228-
{
229-
OnLoadFinished (p0, (IList<Java.IO.File>) new JavaList<Java.IO.File> (p1.Handle, JniHandleOwnership.DoNotTransfer));
230-
}
231-
}
232-
public partial class FileLoader : Android.Support.V4.Content.AsyncTaskLoader {
233-
public override Java.Lang.Object LoadInBackground ()
234-
{
235-
return (Java.Lang.Object) LoadInBackgroundImpl ();
236-
}
237-
}
238-
}"
239-
});
240203
using (var b = CreateDllBuilder ()) {
241204
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");
242205
}
@@ -467,7 +430,6 @@ public void RemoveEventHandlerResolution ()
467430
<attr path=""/api/package[@name='com.actionbarsherlock.view']"" name=""managedName"">Xamarin.ActionbarSherlockBinding.Views</attr>
468431
</metadata>",
469432
};
470-
binding.PackageReferences.Add (KnownPackages.AndroidSupportV4_27_0_2_1);
471433
using (var bindingBuilder = CreateDllBuilder (Path.Combine ("temp", "RemoveEventHandlerResolution", "Binding"))) {
472434
Assert.IsTrue (bindingBuilder.Build (binding), "binding build should have succeeded");
473435
}

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

Lines changed: 10 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -243,17 +243,9 @@ public void CheckAssemblyCounts (bool isRelease, bool aot)
243243
EmbedAssembliesIntoApk = true,
244244
AotAssemblies = aot,
245245
};
246-
proj.PackageReferences.Add (KnownPackages.AndroidXMigration);
247-
proj.PackageReferences.Add (KnownPackages.AndroidXAppCompat);
248-
proj.PackageReferences.Add (KnownPackages.AndroidXAppCompatResources);
249-
proj.PackageReferences.Add (KnownPackages.AndroidXBrowser);
250-
proj.PackageReferences.Add (KnownPackages.AndroidXMediaRouter);
251-
proj.PackageReferences.Add (KnownPackages.AndroidXLegacySupportV4);
252-
proj.PackageReferences.Add (KnownPackages.AndroidXLifecycleLiveData);
253-
proj.PackageReferences.Add (KnownPackages.XamarinGoogleAndroidMaterial);
254246

255247
var abis = new [] { "armeabi-v7a", "x86" };
256-
proj.SetAndroidSupportedAbis (abis);
248+
proj.SetRuntimeIdentifiers (abis);
257249
proj.SetProperty (proj.ActiveConfigurationProperties, "AndroidUseAssemblyStore", "True");
258250

259251
using (var b = CreateApkBuilder ()) {
@@ -292,10 +284,6 @@ public void SmokeTestBuildWithSpecialCharacters ([Values (false, true)] bool for
292284
proj.IsRelease = true;
293285
proj.AotAssemblies = aot;
294286

295-
if (forms) {
296-
proj.PackageReferences.Clear ();
297-
proj.PackageReferences.Add (KnownPackages.XamarinForms_4_7_0_1142);
298-
}
299287
using (var builder = CreateApkBuilder (Path.Combine (rootPath, proj.ProjectName))){
300288
Assert.IsTrue (builder.Build (proj), "Build should have succeeded.");
301289
}
@@ -445,26 +433,6 @@ public void ApplicationIdPlaceholder ()
445433
}
446434
}
447435

448-
[Test]
449-
[Category ("XamarinBuildDownload")]
450-
public void ExtraAaptManifest ()
451-
{
452-
var proj = new XamarinAndroidApplicationProject ();
453-
proj.MainActivity = proj.DefaultMainActivity.Replace ("base.OnCreate (bundle);", "base.OnCreate (bundle);\nCrashlytics.Crashlytics.HandleManagedExceptions();");
454-
proj.PackageReferences.Add (KnownPackages.Xamarin_Android_Crashlytics);
455-
proj.PackageReferences.Add (KnownPackages.Xamarin_Android_Fabric);
456-
proj.PackageReferences.Add (KnownPackages.Xamarin_Build_Download);
457-
using (var builder = CreateApkBuilder (Path.Combine ("temp", TestName))) {
458-
builder.Target = "Restore";
459-
Assert.IsTrue (builder.Build (proj), "Restore should have succeeded.");
460-
builder.Target = "Build";
461-
Assert.IsTrue (builder.Build (proj), "Build should have succeeded.");
462-
var manifest = File.ReadAllText (Path.Combine (Root, builder.ProjectDirectory, "obj", "Debug", "android", "AndroidManifest.xml"));
463-
Assert.IsTrue (manifest.Contains ($"android:authorities=\"{proj.PackageName}.crashlyticsinitprovider\""), "placeholder not replaced");
464-
Assert.IsFalse (manifest.Contains ("dollar_openBracket_applicationId_closeBracket"), "`aapt/AndroidManifest.xml` not ignored");
465-
}
466-
}
467-
468436
[Test]
469437
public void AarContentExtraction ()
470438
{
@@ -714,7 +682,10 @@ public void BuildAfterUpgradingNuget ()
714682
var proj = new XamarinAndroidApplicationProject ();
715683
proj.MainActivity = proj.DefaultMainActivity.Replace ("public class MainActivity : Activity", "public class MainActivity : AndroidX.AppCompat.App.AppCompatActivity");
716684

717-
proj.PackageReferences.Add (KnownPackages.AndroidXAppCompat);
685+
proj.PackageReferences.Add (new Package {
686+
Id = "Xamarin.AndroidX.AppCompat",
687+
Version = "1.6.1.5",
688+
});
718689

719690
using (var b = CreateApkBuilder (Path.Combine ("temp", TestContext.CurrentContext.Test.Name))) {
720691
//[TearDown] will still delete if test outcome successful, I need logs if assertions fail but build passes
@@ -732,8 +703,8 @@ public void BuildAfterUpgradingNuget ()
732703
FileAssert.Exists (build_props, "build.props should exist after first build.");
733704

734705
proj.PackageReferences.Clear ();
735-
//NOTE: we can get all the other dependencies transitively, yay!
736-
proj.PackageReferences.Add (KnownPackages.AndroidXAppCompat_1_6_0_1);
706+
//NOTE: this should be newer than specified above
707+
proj.PackageReferences.Add (KnownPackages.AndroidXAppCompat);
737708
b.Save (proj, doNotCleanupOnUpdate: true);
738709
Assert.IsTrue (b.Build (proj), "second build should have succeeded.");
739710
Assert.IsFalse (b.Output.IsTargetSkipped ("_CleanIntermediateIfNeeded"), "`_CleanIntermediateIfNeeded` should have run for the second build!");
@@ -1165,6 +1136,7 @@ public MyWorker (Context c, WorkerParameters p) : base (c, p) { }
11651136
"
11661137
});
11671138
proj.PackageReferences.Add (KnownPackages.AndroidXWorkRuntime);
1139+
proj.PackageReferences.Add (KnownPackages.AndroidXLifecycleLiveData);
11681140
using (var b = CreateApkBuilder (Path.Combine ("temp", TestName))) {
11691141
Assert.IsTrue (b.Build (proj), "Build should have succeeded.");
11701142
}
@@ -1438,8 +1410,7 @@ public void CheckLintErrorsAndWarnings ()
14381410

14391411
var proj = new XamarinAndroidApplicationProject () {
14401412
PackageReferences = {
1441-
KnownPackages.AndroidSupportV4_27_0_2_1,
1442-
KnownPackages.SupportConstraintLayout_1_0_2_2,
1413+
KnownPackages.AndroidXConstraintLayout
14431414
},
14441415
};
14451416
proj.SetProperty ("AndroidLintEnabled", true.ToString ());
@@ -1623,8 +1594,7 @@ public void CheckLintResourceFileReferencesAreFixed ()
16231594
{
16241595
var proj = new XamarinAndroidApplicationProject () {
16251596
PackageReferences = {
1626-
KnownPackages.AndroidSupportV4_27_0_2_1,
1627-
KnownPackages.SupportConstraintLayout_1_0_2_2,
1597+
KnownPackages.AndroidXConstraintLayout
16281598
},
16291599
};
16301600
proj.SetProperty ("AndroidLintEnabled", true.ToString ());

0 commit comments

Comments
 (0)