Skip to content

Commit 25f528a

Browse files
Remove unrelated changes: revert test plumbing, CI lane, and manifest refactoring
Revert files that are not about [Export] support: - CI lane (stage-package-tests.yaml) - Test exclusions/categories (TrimmableIgnore, DoNotGenerateAcw) - NUnitInstrumentation test plumbing - Mono.Android.NET-Tests.csproj trimmable setup - TrimmableTypeMapGenerator manifest refactoring (from #11105) - TrimmableTypeMapGeneratorTests manifest/propagation tests Keep only Export-related changes: - CoreCLRIgnore removal from Export tests in JnienvTest.cs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 7faae1d commit 25f528a

10 files changed

Lines changed: 52 additions & 181 deletions

File tree

build-tools/automation/yaml-templates/stage-package-tests.yaml

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -199,20 +199,10 @@ stages:
199199
testName: Mono.Android.NET_Tests-CoreCLR
200200
project: tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj
201201
testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)CoreCLR.xml
202-
extraBuildArgs: -p:TestsFlavor=CoreCLR -p:_AndroidTypeMapImplementation=llvm-ir
202+
extraBuildArgs: -p:TestsFlavor=CoreCLR -p:UseMonoRuntime=false
203203
artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
204204
artifactFolder: $(DotNetTargetFramework)-CoreCLR
205205

206-
- template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml
207-
parameters:
208-
configuration: $(XA.Build.Configuration)
209-
testName: Mono.Android.NET_Tests-CoreCLRTrimmable
210-
project: tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj
211-
testResultsFiles: TestResult-Mono.Android.NET_Tests-$(XA.Build.Configuration)CoreCLRTrimmable.xml
212-
extraBuildArgs: -p:_AndroidTypeMapImplementation=trimmable -p:UseMonoRuntime=false
213-
artifactSource: bin/Test$(XA.Build.Configuration)/$(DotNetTargetFramework)-android/Mono.Android.NET_Tests-Signed.aab
214-
artifactFolder: $(DotNetTargetFramework)-CoreCLRTrimmable
215-
216206
- template: /build-tools/automation/yaml-templates/apk-instrumentation.yaml
217207
parameters:
218208
configuration: $(XA.Build.Configuration)

src/Microsoft.Android.Sdk.TrimmableTypeMap/TrimmableTypeMapGenerator.cs

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,7 @@ public TrimmableTypeMapResult Execute (
3838
return new TrimmableTypeMapResult ([], [], allPeers);
3939
}
4040

41-
var preparedManifest = PrepareManifestForRooting (manifestTemplate, manifestConfig);
42-
RootManifestReferencedTypes (allPeers, preparedManifest);
41+
RootManifestReferencedTypes (allPeers, PrepareManifestForRooting (manifestTemplate, manifestConfig));
4342
PropagateDeferredRegistrationToBaseClasses (allPeers);
4443

4544
var generatedAssemblies = GenerateTypeMapAssemblies (allPeers, systemRuntimeVersion);
@@ -62,7 +61,7 @@ public TrimmableTypeMapResult Execute (
6261
}
6362

6463
var manifest = manifestConfig is not null
65-
? GenerateManifest (allPeers, assemblyManifestInfo, manifestConfig, preparedManifest)
64+
? GenerateManifest (allPeers, assemblyManifestInfo, manifestConfig, manifestTemplate)
6665
: null;
6766

6867
return new TrimmableTypeMapResult (generatedAssemblies, generatedJavaSources, allPeers, manifest, appRegTypes);
@@ -157,7 +156,8 @@ internal void RootManifestReferencedTypes (List<JavaPeerInfo> allPeers, XDocumen
157156
XName attName = androidNs + "name";
158157
var packageName = (string?) root.Attribute ("package") ?? "";
159158

160-
var componentEntries = new List<(string Name, bool DeferredRegistration, XElement Element)> ();
159+
var componentNames = new HashSet<string> (StringComparer.Ordinal);
160+
var deferredRegistrationNames = new HashSet<string> (StringComparer.Ordinal);
161161
foreach (var element in root.Descendants ()) {
162162
switch (element.Name.LocalName) {
163163
case "application":
@@ -169,13 +169,17 @@ internal void RootManifestReferencedTypes (List<JavaPeerInfo> allPeers, XDocumen
169169
var name = (string?) element.Attribute (attName);
170170
if (name is not null) {
171171
var resolvedName = ManifestNameResolver.Resolve (name, packageName);
172-
componentEntries.Add ((resolvedName, element.Name.LocalName is "application" or "instrumentation", element));
172+
componentNames.Add (resolvedName);
173+
174+
if (element.Name.LocalName is "application" or "instrumentation") {
175+
deferredRegistrationNames.Add (resolvedName);
176+
}
173177
}
174178
break;
175179
}
176180
}
177181

178-
if (componentEntries.Count == 0) {
182+
if (componentNames.Count == 0) {
179183
return;
180184
}
181185

@@ -189,15 +193,10 @@ internal void RootManifestReferencedTypes (List<JavaPeerInfo> allPeers, XDocumen
189193
}
190194
}
191195

192-
foreach (var (name, deferredRegistration, element) in componentEntries) {
196+
foreach (var name in componentNames) {
193197
if (peersByDotName.TryGetValue (name, out var peers)) {
194-
string actualJavaName = JniSignatureHelper.JniNameToJavaName (peers [0].JavaName);
195-
if (!string.Equals ((string?) element.Attribute (attName), actualJavaName, StringComparison.Ordinal)) {
196-
element.SetAttributeValue (attName, actualJavaName);
197-
}
198-
199198
foreach (var peer in peers) {
200-
if (deferredRegistration) {
199+
if (deferredRegistrationNames.Contains (name)) {
201200
peer.CannotRegisterInStaticConstructor = true;
202201
}
203202

@@ -218,28 +217,32 @@ internal void RootManifestReferencedTypes (List<JavaPeerInfo> allPeers, XDocumen
218217
/// TestInstrumentation_1 must also defer — otherwise the base class <c>&lt;clinit&gt;</c> will call
219218
/// <c>registerNatives</c> before the managed runtime is ready.
220219
/// </summary>
221-
static void PropagateDeferredRegistrationToBaseClasses (List<JavaPeerInfo> allPeers)
220+
internal static void PropagateDeferredRegistrationToBaseClasses (List<JavaPeerInfo> allPeers)
222221
{
223-
var peersByJniName = new Dictionary<string, JavaPeerInfo> (StringComparer.Ordinal);
222+
// In practice only 1–2 types need propagation (one Application, maybe one
223+
// Instrumentation), each with a short base-class chain. A linear scan per
224+
// ancestor is simpler and cheaper than building a Dictionary<JavaName, List<Peer>>
225+
// lookup over all peers up front.
224226
foreach (var peer in allPeers) {
225-
if (!peersByJniName.ContainsKey (peer.JavaName)) {
226-
peersByJniName [peer.JavaName] = peer;
227+
if (peer.CannotRegisterInStaticConstructor) {
228+
PropagateToAncestors (peer.BaseJavaName, allPeers);
227229
}
228230
}
229231

230-
foreach (var peer in allPeers) {
231-
if (!peer.CannotRegisterInStaticConstructor) {
232-
continue;
233-
}
232+
static void PropagateToAncestors (string? baseJniName, List<JavaPeerInfo> allPeers)
233+
{
234+
while (baseJniName is not null) {
235+
string? nextBase = null;
236+
foreach (var basePeer in allPeers) {
237+
if (!string.Equals (basePeer.JavaName, baseJniName, StringComparison.Ordinal) || basePeer.DoNotGenerateAcw) {
238+
continue;
239+
}
234240

235-
var current = peer;
236-
while (current.BaseJavaName is { } baseJniName && peersByJniName.TryGetValue (baseJniName, out var basePeer)) {
237-
if (basePeer.DoNotGenerateAcw) {
238-
break;
241+
basePeer.CannotRegisterInStaticConstructor = true;
242+
nextBase = basePeer.BaseJavaName;
239243
}
240244

241-
basePeer.CannotRegisterInStaticConstructor = true;
242-
current = basePeer;
245+
baseJniName = nextBase;
243246
}
244247
}
245248
}

tests/Microsoft.Android.Sdk.TrimmableTypeMap.Tests/Generator/TrimmableTypeMapGeneratorTests.cs

Lines changed: 10 additions & 114 deletions
Original file line numberDiff line numberDiff line change
@@ -148,38 +148,6 @@ public void Execute_ManifestPlaceholdersAreResolvedBeforeRooting ()
148148
Assert.True (peer.IsUnconditional, "Relative manifest names should root correctly after placeholder substitution.");
149149
}
150150

151-
[Fact]
152-
public void Execute_ManifestReferencedTypeNames_AreNormalizedInGeneratedManifest ()
153-
{
154-
using var peReader = CreateTestFixturePEReader ();
155-
var manifestTemplate = System.Xml.Linq.XDocument.Parse ("""
156-
<?xml version="1.0" encoding="utf-8"?>
157-
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.app">
158-
<application>
159-
<activity android:name=".SimpleActivity" />
160-
</application>
161-
</manifest>
162-
""");
163-
164-
var result = CreateGenerator ().Execute (
165-
new List<(string, PEReader)> { ("TestFixtures", peReader) },
166-
new Version (11, 0),
167-
new HashSet<string> (),
168-
new ManifestConfig (
169-
PackageName: "my.app",
170-
AndroidApiLevel: "35",
171-
SupportedOSPlatformVersion: "21",
172-
RuntimeProviderJavaName: "mono.MonoRuntimeProvider"),
173-
manifestTemplate);
174-
175-
var androidName = (string?) result.Manifest?.Document.Root?
176-
.Element ("application")?
177-
.Element ("activity")?
178-
.Attribute (System.Xml.Linq.XName.Get ("name", "http://schemas.android.com/apk/res/android"));
179-
180-
Assert.Equal ("my.app.SimpleActivity", androidName);
181-
}
182-
183151
TrimmableTypeMapGenerator CreateGenerator () => new (new TestTrimmableTypeMapLogger (logMessages));
184152

185153
TrimmableTypeMapGenerator CreateGenerator (List<string> warnings) =>
@@ -223,12 +191,6 @@ public void RootManifestReferencedTypes_RootsManifestReferencedTypes (
223191
var generator = CreateGenerator ();
224192
generator.RootManifestReferencedTypes (peers, doc);
225193

226-
var actualName = (string?) doc.Root?
227-
.Element ("application")?
228-
.Element (elementName)?
229-
.Attribute (System.Xml.Linq.XName.Get ("name", "http://schemas.android.com/apk/res/android"));
230-
231-
Assert.Equal (JniSignatureHelper.JniNameToJavaName (javaName), actualName);
232194
Assert.True (peers [0].IsUnconditional, "The manifest-referenced type should be rooted as unconditional.");
233195
Assert.False (peers [1].IsUnconditional, "Non-matching peers should remain conditional.");
234196
Assert.Contains (logMessages, m => m.Contains ("Rooting manifest-referenced type"));
@@ -268,7 +230,7 @@ public void RootManifestReferencedTypes_RootsApplicationAndInstrumentationTypes
268230
}
269231

270232
[Fact]
271-
public void PropagateDeferredRegistration_PropagatesCannotRegisterToBaseClasses ()
233+
public void PropagateDeferredRegistrationToBaseClasses_PropagatesToBaseClassesOfManifestReferencedTypes ()
272234
{
273235
var basePeer = new JavaPeerInfo {
274236
JavaName = "crc64aaa/TestInstrumentation_1", CompatJniName = "crc64aaa/TestInstrumentation_1",
@@ -300,83 +262,17 @@ public void PropagateDeferredRegistration_PropagatesCannotRegisterToBaseClasses
300262
var generator = CreateGenerator ();
301263
generator.RootManifestReferencedTypes (peers, doc);
302264

303-
// Execute calls PropagateDeferredRegistrationToBaseClasses internally,
304-
// but we test the generator method through the public Execute path indirectly.
305-
// For unit testing, call RootManifestReferencedTypes + verify the propagation
306-
// by invoking the static helper through a full Execute run.
307-
// Instead, use reflection or just verify after calling Execute with a manifest.
308-
309-
// RootManifestReferencedTypes sets the flag on the leaf only
310-
Assert.True (leafPeer.CannotRegisterInStaticConstructor, "Leaf instrumentation should have deferred registration.");
311-
Assert.False (midPeer.CannotRegisterInStaticConstructor, "Mid peer should NOT have deferred registration yet (before propagation).");
312-
Assert.False (basePeer.CannotRegisterInStaticConstructor, "Base peer should NOT have deferred registration yet (before propagation).");
313-
}
314-
315-
[Fact]
316-
public void Execute_PropagatesDeferredRegistrationToBaseClasses ()
317-
{
318-
using var peReader = CreateTestFixturePEReader ();
319-
var manifestTemplate = System.Xml.Linq.XDocument.Parse ("""
320-
<?xml version="1.0" encoding="utf-8"?>
321-
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="my.app">
322-
<instrumentation android:name=".DerivedInstrumentation" />
323-
</manifest>
324-
""");
325-
326-
var result = CreateGenerator ().Execute (
327-
new List<(string, PEReader)> { ("TestFixtures", peReader) },
328-
new Version (11, 0),
329-
new HashSet<string> (),
330-
new ManifestConfig (
331-
PackageName: "my.app",
332-
AndroidApiLevel: "35",
333-
SupportedOSPlatformVersion: "21",
334-
RuntimeProviderJavaName: "mono.MonoRuntimeProvider"),
335-
manifestTemplate);
336-
337-
var derivedPeer = result.AllPeers.FirstOrDefault (
338-
p => p.ManagedTypeShortName == "DerivedInstrumentation");
339-
var basePeer = derivedPeer?.BaseJavaName is not null
340-
? result.AllPeers.FirstOrDefault (p => p.JavaName == derivedPeer.BaseJavaName)
341-
: null;
342-
343-
if (derivedPeer is not null && basePeer is not null) {
344-
Assert.True (derivedPeer.CannotRegisterInStaticConstructor,
345-
"Instrumentation type should defer registerNatives.");
346-
Assert.True (basePeer.CannotRegisterInStaticConstructor,
347-
"Base class of instrumentation type should also defer registerNatives.");
348-
}
349-
// If test fixtures don't have a matching hierarchy, the test is skipped implicitly.
350-
}
351-
352-
[Fact]
353-
public void RootManifestReferencedTypes_RewritesManifestApplicationToActualJavaName ()
354-
{
355-
var peers = new List<JavaPeerInfo> {
356-
new JavaPeerInfo {
357-
JavaName = "crc64123456789abc/App", CompatJniName = "android/apptests/App",
358-
ManagedTypeName = "Android.AppTests.App", ManagedTypeNamespace = "Android.AppTests", ManagedTypeShortName = "App",
359-
AssemblyName = "Mono.Android.NET-Tests", IsUnconditional = false,
360-
},
361-
};
362-
363-
var doc = System.Xml.Linq.XDocument.Parse ("""
364-
<?xml version="1.0" encoding="utf-8"?>
365-
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="Mono.Android.NET_Tests">
366-
<application android:name="android.apptests.App" />
367-
</manifest>
368-
""");
265+
// RootManifestReferencedTypes sets the flag only on the directly matched leaf
266+
Assert.True (leafPeer.CannotRegisterInStaticConstructor, "Leaf instrumentation should have deferred registration after manifest rooting.");
267+
Assert.False (midPeer.CannotRegisterInStaticConstructor, "Mid peer should NOT have deferred registration before propagation.");
268+
Assert.False (basePeer.CannotRegisterInStaticConstructor, "Base peer should NOT have deferred registration before propagation.");
369269

370-
var generator = CreateGenerator ();
371-
generator.RootManifestReferencedTypes (peers, doc);
270+
// PropagateDeferredRegistrationToBaseClasses walks the BaseJavaName chain
271+
TrimmableTypeMapGenerator.PropagateDeferredRegistrationToBaseClasses (peers);
372272

373-
var actualName = (string?) doc.Root?
374-
.Element ("application")?
375-
.Attribute (System.Xml.Linq.XName.Get ("name", "http://schemas.android.com/apk/res/android"));
376-
377-
Assert.Equal ("crc64123456789abc.App", actualName);
378-
Assert.True (peers [0].IsUnconditional);
379-
Assert.True (peers [0].CannotRegisterInStaticConstructor);
273+
Assert.True (leafPeer.CannotRegisterInStaticConstructor, "Leaf instrumentation should still have deferred registration.");
274+
Assert.True (midPeer.CannotRegisterInStaticConstructor, "Mid peer should have deferred registration after propagation.");
275+
Assert.True (basePeer.CannotRegisterInStaticConstructor, "Base peer should have deferred registration after propagation.");
380276
}
381277

382278
[Fact]

tests/Mono.Android-Tests/Mono.Android-Tests/Android.Runtime/JnienvArrayMarshaling.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ public void NewArray_Int32ArrayArray_ShouldNotLeak ()
321321
}
322322
}
323323

324-
[Test, Category ("TrimmableIgnore")]
324+
[Test]
325325
public void NewArray_UseJcwTypeWhenRenamed ()
326326
{
327327
IntPtr lref = JNIEnv.NewArray<CreateInstance_OverrideAbsListView_Adapter>(new CreateInstance_OverrideAbsListView_Adapter[0]);

tests/Mono.Android-Tests/Mono.Android-Tests/Android.Widget/AdapterTests.cs

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace Android.WidgetTests {
1313
[TestFixture]
1414
public class AdapterTests {
1515

16-
[Test, Category ("TrimmableIgnore")]
16+
[Test]
1717
public void InvokeOverriddenAbsListView_AdapterProperty ()
1818
{
1919
IntPtr grefAbsListView_class = JNIEnv.FindClass ("android/widget/AbsListView");
@@ -57,13 +57,8 @@ public void GridView_Adapter ()
5757
}
5858
}
5959

60-
#if TRIMMABLE_TYPEMAP
61-
[Register (CanOverrideAbsListView_Adapter.JcwType, DoNotGenerateAcw = true)]
62-
#endif
6360
public class CanOverrideAbsListView_Adapter : AbsListView {
6461

65-
internal const string JcwType = "crc647ca01befd1981339/CanOverrideAbsListView_Adapter";
66-
6762
public CanOverrideAbsListView_Adapter (Context context)
6863
: base (context)
6964
{

tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/JavaObjectExtensionsTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,11 @@
1212

1313
namespace Java.InteropTests {
1414

15-
[TestFixture]
16-
public class JavaObjectExtensionsTests {
15+
[TestFixture]
16+
public class JavaObjectExtensionsTests {
1717

18-
[Test, Category ("TrimmableIgnore")]
19-
public void JavaCast_BaseToGenericWrapper ()
18+
[Test]
19+
public void JavaCast_BaseToGenericWrapper ()
2020
{
2121
using (var list = new JavaList (new[]{ 1, 2, 3 }))
2222
using (var generic = JavaObjectExtensions.JavaCast<JavaList<int>> (list)) {

tests/Mono.Android-Tests/Mono.Android-Tests/Java.Interop/JnienvTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public void InvokingNullInstanceDoesNotCrashDalvik ()
121121
}
122122
}
123123

124-
[Test, Category ("TrimmableIgnore")]
124+
[Test]
125125
public void NewOpenGenericTypeThrows ()
126126
{
127127
try {
@@ -299,7 +299,7 @@ public void ActivatedDirectObjectSubclassesShouldBeRegistered ()
299299
}
300300
}
301301

302-
[Test, Category ("TrimmableIgnore")]
302+
[Test]
303303
public void ActivatedDirectThrowableSubclassesShouldBeRegistered ()
304304
{
305305
if (Build.VERSION.SdkInt <= BuildVersionCodes.GingerbreadMr1)

tests/Mono.Android-Tests/Mono.Android-Tests/Java.Lang/ObjectTest.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,13 +65,14 @@ static MethodInfo MakeGenericMethod (MethodInfo method, Type type) =>
6565
MakeGenericMethod (FromJavaObject_T, typeof (int)));
6666
}
6767

68-
[Test, Category ("TrimmableIgnore")]
68+
[Test]
6969
public void JnienvCreateInstance_RegistersMultipleInstances ()
7070
{
7171
using (var adapter = new CreateInstance_OverrideAbsListView_Adapter (Application.Context)) {
7272

7373
var intermediate = CreateInstance_OverrideAbsListView_Adapter.Intermediate;
7474
var registered = Java.Lang.Object.GetObject<CreateInstance_OverrideAbsListView_Adapter>(adapter.Handle, JniHandleOwnership.DoNotTransfer);
75+
7576
Assert.AreNotSame (adapter, intermediate);
7677
Assert.AreSame (adapter, registered);
7778
}
@@ -108,11 +109,7 @@ public void java_lang_Object_Is_Java_Lang_Object ()
108109
*
109110
* Alas, this is the pre-4.10 behavior!
110111
*/
111-
#if TRIMMABLE_TYPEMAP
112-
[Register (CreateInstance_OverrideAbsListView_Adapter.JcwType, DoNotGenerateAcw = true)]
113-
#else
114112
[Register (CreateInstance_OverrideAbsListView_Adapter.JcwType)]
115-
#endif
116113
public class CreateInstance_OverrideAbsListView_Adapter : AbsListView {
117114

118115
/* (IntPtr, JniHandleOwnership) ctor is reqiured because AbsListView

tests/Mono.Android-Tests/Mono.Android-Tests/Mono.Android.NET-Tests.csproj

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,13 +37,6 @@
3737
<ExcludeCategories Condition=" '$(EnableLLVM)' == 'true' ">$(ExcludeCategories):InetAccess:NetworkInterfaces</ExcludeCategories>
3838
</PropertyGroup>
3939

40-
<PropertyGroup>
41-
<UseMonoRuntime Condition=" '$(_AndroidTypeMapImplementation)' == 'trimmable' and '$(UseMonoRuntime)' == '' and '$(PublishAot)' != 'true' ">false</UseMonoRuntime>
42-
<TestsFlavor Condition=" '$(TestsFlavor)' == '' and '$(_AndroidTypeMapImplementation)' == 'trimmable' ">CoreCLRTrimmable</TestsFlavor>
43-
<ExcludeCategories Condition=" '$(_AndroidTypeMapImplementation)' == 'trimmable' ">$(ExcludeCategories):NativeTypeMap:TrimmableIgnore:SSL</ExcludeCategories>
44-
<DefineConstants Condition=" '$(_AndroidTypeMapImplementation)' == 'trimmable' ">$(DefineConstants);TRIMMABLE_TYPEMAP</DefineConstants>
45-
</PropertyGroup>
46-
4740
<ItemGroup>
4841
<PackageReference Include="Mono.Linq.Expressions" Version="2.0.0" />
4942
</ItemGroup>

0 commit comments

Comments
 (0)