1
1
using System ;
2
2
using System . Collections . Concurrent ;
3
3
using System . Collections . Generic ;
4
- using System . IO ;
5
4
using System . Linq ;
6
- using Java . Interop . Tools . Cecil ;
7
- using Java . Interop . Tools . JavaCallableWrappers ;
8
- using Java . Interop . Tools . TypeNameMappings ;
9
5
using Microsoft . Android . Build . Tasks ;
10
6
using Microsoft . Build . Framework ;
11
- using Mono . Cecil ;
7
+ using Microsoft . Build . Utilities ;
12
8
using Xamarin . Android . Tools ;
13
9
14
10
namespace Xamarin . Android . Tasks ;
@@ -17,6 +13,8 @@ public class GenerateMainAndroidManifest : AndroidTask
17
13
{
18
14
public override string TaskPrefix => "GMM" ;
19
15
16
+ [ Output ]
17
+ public ITaskItem [ ] ? AdditionalProviderSources { get ; set ; }
20
18
[ Required ]
21
19
public string AndroidRuntime { get ; set ; } = "" ;
22
20
public string ? AndroidSdkDir { get ; set ; }
@@ -25,10 +23,8 @@ public class GenerateMainAndroidManifest : AndroidTask
25
23
public string ? ApplicationLabel { get ; set ; }
26
24
public string ? BundledWearApplicationName { get ; set ; }
27
25
public string ? CheckedBuild { get ; set ; }
28
- public string CodeGenerationTarget { get ; set ; } = "" ;
29
26
public bool Debug { get ; set ; }
30
27
public bool EmbedAssemblies { get ; set ; }
31
- public bool EnableMarshalMethods { get ; set ; }
32
28
[ Required ]
33
29
public string IntermediateOutputDirectory { get ; set ; } = "" ;
34
30
public string [ ] ? ManifestPlaceholders { get ; set ; }
@@ -37,22 +33,16 @@ public class GenerateMainAndroidManifest : AndroidTask
37
33
public string [ ] ? MergedManifestDocuments { get ; set ; }
38
34
public bool MultiDex { get ; set ; }
39
35
public bool NeedsInternet { get ; set ; }
40
- public string ? OutputDirectory { get ; set ; }
41
36
public string ? PackageName { get ; set ; }
42
37
[ Required ]
43
38
public ITaskItem [ ] ResolvedUserAssemblies { get ; set ; } = [ ] ;
44
39
[ Required ]
45
40
public string [ ] SupportedAbis { get ; set ; } = [ ] ;
46
41
public string ? SupportedOSPlatformVersion { get ; set ; }
47
- [ Required ]
48
- public string TargetName { get ; set ; } = "" ;
49
42
public string ? VersionCode { get ; set ; }
50
43
public string ? VersionName { get ; set ; }
51
44
52
45
AndroidRuntime androidRuntime ;
53
- JavaPeerStyle codeGenerationTarget ;
54
-
55
- bool UseMarshalMethods => ! Debug && EnableMarshalMethods ;
56
46
57
47
public override bool RunTask ( )
58
48
{
@@ -68,21 +58,18 @@ public override bool RunTask ()
68
58
var userAssembliesPerArch = MonoAndroidHelper . GetPerArchAssemblies ( ResolvedUserAssemblies , SupportedAbis , validate : true ) ;
69
59
70
60
androidRuntime = MonoAndroidHelper . ParseAndroidRuntime ( AndroidRuntime ) ;
71
- codeGenerationTarget = MonoAndroidHelper . ParseCodeGenerationTarget ( CodeGenerationTarget ) ;
72
61
73
62
// Generate the merged manifest
74
63
var additionalProviders = MergeManifest ( templateCodeGenState , GenerateJavaStubs . MaybeGetArchAssemblies ( userAssembliesPerArch , templateCodeGenState . TargetArch ) ) ;
75
- GenerateAdditionalProviderSources ( templateCodeGenState , additionalProviders ) ;
76
64
65
+ AdditionalProviderSources = additionalProviders . Select ( p => new TaskItem ( p ) ) . ToArray ( ) ;
77
66
78
- // If we still need the NativeCodeGenState in the <GenerateNativeMarshalMethodSources> task because we're using marshal methods,
79
- // we're going to transfer it to a new object that doesn't require holding open Cecil AssemblyDefinitions.
80
- if ( UseMarshalMethods ) {
81
- var nativeCodeGenStateObject = MarshalMethodCecilAdapter . GetNativeCodeGenStateCollection ( Log , nativeCodeGenStates ) ;
67
+ // We still need the NativeCodeGenState for later tasks, but we're going to transfer
68
+ // it to a new object that doesn't require holding open Cecil AssemblyDefinitions.
69
+ var nativeCodeGenStateObject = MarshalMethodCecilAdapter . GetNativeCodeGenStateCollection ( Log , nativeCodeGenStates ) ;
82
70
83
- Log . LogDebugMessage ( $ "Saving { nameof ( NativeCodeGenStateObject ) } to { nameof ( GenerateJavaStubs . NativeCodeGenStateObjectRegisterTaskKey ) } ") ;
84
- BuildEngine4 . RegisterTaskObjectAssemblyLocal ( MonoAndroidHelper . GetProjectBuildSpecificTaskObjectKey ( GenerateJavaStubs . NativeCodeGenStateObjectRegisterTaskKey , WorkingDirectory , IntermediateOutputDirectory ) , nativeCodeGenStateObject , RegisteredTaskObjectLifetime . Build ) ;
85
- }
71
+ Log . LogDebugMessage ( $ "Saving { nameof ( NativeCodeGenStateObject ) } to { nameof ( GenerateJavaStubs . NativeCodeGenStateObjectRegisterTaskKey ) } ") ;
72
+ BuildEngine4 . RegisterTaskObjectAssemblyLocal ( MonoAndroidHelper . GetProjectBuildSpecificTaskObjectKey ( GenerateJavaStubs . NativeCodeGenStateObjectRegisterTaskKey , WorkingDirectory , IntermediateOutputDirectory ) , nativeCodeGenStateObject , RegisteredTaskObjectLifetime . Build ) ;
86
73
87
74
// Dispose the Cecil resolvers so the assemblies are closed.
88
75
Log . LogDebugMessage ( $ "Disposing all { nameof ( NativeCodeGenState ) } .{ nameof ( NativeCodeGenState . Resolver ) } ") ;
@@ -140,80 +127,4 @@ IList<string> MergeManifest (NativeCodeGenState codeGenState, Dictionary<string,
140
127
141
128
return additionalProviders ;
142
129
}
143
-
144
- void GenerateAdditionalProviderSources ( NativeCodeGenState codeGenState , IList < string > additionalProviders )
145
- {
146
- // Create additional runtime provider java sources.
147
- bool isMonoVM = androidRuntime switch {
148
- Xamarin . Android . Tasks . AndroidRuntime . MonoVM => true ,
149
- Xamarin . Android . Tasks . AndroidRuntime . CoreCLR => true ,
150
- _ => false ,
151
- } ;
152
- string providerTemplateFile = isMonoVM ?
153
- "MonoRuntimeProvider.Bundled.java" :
154
- "NativeAotRuntimeProvider.java" ;
155
- string providerTemplate = GetResource ( providerTemplateFile ) ;
156
-
157
- foreach ( var provider in additionalProviders ) {
158
- var contents = providerTemplate . Replace ( isMonoVM ? "MonoRuntimeProvider" : "NativeAotRuntimeProvider" , provider ) ;
159
- var real_provider = isMonoVM ?
160
- Path . Combine ( OutputDirectory , "src" , "mono" , provider + ".java" ) :
161
- Path . Combine ( OutputDirectory , "src" , "net" , "dot" , "jni" , "nativeaot" , provider + ".java" ) ;
162
- Files . CopyIfStringChanged ( contents , real_provider ) ;
163
- }
164
-
165
- // For NativeAOT, generate JavaInteropRuntime.java
166
- if ( androidRuntime == Xamarin . Android . Tasks . AndroidRuntime . NativeAOT ) {
167
- const string fileName = "JavaInteropRuntime.java" ;
168
- string template = GetResource ( fileName ) ;
169
- var contents = template . Replace ( "@MAIN_ASSEMBLY_NAME@" , TargetName ) ;
170
- var path = Path . Combine ( OutputDirectory , "src" , "net" , "dot" , "jni" , "nativeaot" , fileName ) ;
171
- Log . LogDebugMessage ( $ "Writing: { path } ") ;
172
- Files . CopyIfStringChanged ( contents , path ) ;
173
- }
174
-
175
- // Create additional application java sources.
176
- StringWriter regCallsWriter = new StringWriter ( ) ;
177
- regCallsWriter . WriteLine ( "// Application and Instrumentation ACWs must be registered first." ) ;
178
- foreach ( TypeDefinition type in codeGenState . JavaTypesForJCW ) {
179
- if ( JavaNativeTypeManager . IsApplication ( type , codeGenState . TypeCache ) || JavaNativeTypeManager . IsInstrumentation ( type , codeGenState . TypeCache ) ) {
180
- if ( codeGenState . Classifier != null && ! codeGenState . Classifier . TypeHasDynamicallyRegisteredMethods ( type ) ) {
181
- continue ;
182
- }
183
-
184
- string javaKey = JavaNativeTypeManager . ToJniName ( type , codeGenState . TypeCache ) . Replace ( '/' , '.' ) ;
185
- regCallsWriter . WriteLine (
186
- codeGenerationTarget == JavaPeerStyle . XAJavaInterop1 ?
187
- "\t \t mono.android.Runtime.register (\" {0}\" , {1}.class, {1}.__md_methods);" :
188
- "\t \t net.dot.jni.ManagedPeer.registerNativeMembers ({1}.class, {1}.__md_methods);" ,
189
- type . GetAssemblyQualifiedName ( codeGenState . TypeCache ) ,
190
- javaKey
191
- ) ;
192
- }
193
- }
194
- regCallsWriter . Close ( ) ;
195
-
196
- var real_app_dir = Path . Combine ( OutputDirectory , "src" , "net" , "dot" , "android" ) ;
197
- string applicationTemplateFile = "ApplicationRegistration.java" ;
198
- SaveResource (
199
- applicationTemplateFile ,
200
- applicationTemplateFile ,
201
- real_app_dir ,
202
- template => template . Replace ( "// REGISTER_APPLICATION_AND_INSTRUMENTATION_CLASSES_HERE" , regCallsWriter . ToString ( ) )
203
- ) ;
204
- }
205
-
206
- string GetResource ( string resource )
207
- {
208
- using ( var stream = GetType ( ) . Assembly . GetManifestResourceStream ( resource ) )
209
- using ( var reader = new StreamReader ( stream ) )
210
- return reader . ReadToEnd ( ) ;
211
- }
212
-
213
- void SaveResource ( string resource , string filename , string destDir , Func < string , string > applyTemplate )
214
- {
215
- string template = GetResource ( resource ) ;
216
- template = applyTemplate ( template ) ;
217
- Files . CopyIfStringChanged ( template , Path . Combine ( destDir , filename ) ) ;
218
- }
219
130
}
0 commit comments