-
Notifications
You must be signed in to change notification settings - Fork 32
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[android] Add gradle build task (#19)
Introduces a new `@(GradleProjectReference)` item to help simplify the content that needs to be added to the binding .csproj file. This item will translate relevant metadata to the `@(AndroidLibrary)` item that is automatically added to the project after the gradle project is built. A gradle build task has been added to improve msbuild output and error logging when a gradle invocation fails. We will now attempt to set `$ANDROID_HOME` and `$JAVA_HOME` automatically when invoking gradle. These values will be determined by Android SDK tooling resolution tasks, and can be changed by setting `$(AndroidSdkDirectory)` and `$(JavaSdkDirectory)` in the project file or on the command line.
- Loading branch information
Showing
7 changed files
with
432 additions
and
45 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,302 @@ | ||
# editorconfig.org | ||
|
||
# top-most EditorConfig file | ||
root = true | ||
|
||
# Default settings: | ||
# A newline ending every file | ||
# Use 4 spaces as indentation | ||
[*] | ||
insert_final_newline = true | ||
indent_style = space | ||
indent_size = 4 | ||
trim_trailing_whitespace = true | ||
spelling_exclusion_path = ./exclusion.dic | ||
|
||
[*.json] | ||
indent_size = 2 | ||
|
||
# Generated code | ||
|
||
# C# files | ||
[*.cs] | ||
# New line preferences | ||
csharp_new_line_before_open_brace = all | ||
csharp_new_line_before_else = true | ||
csharp_new_line_before_catch = true | ||
csharp_new_line_before_finally = true | ||
csharp_new_line_before_members_in_object_initializers = true | ||
csharp_new_line_before_members_in_anonymous_types = true | ||
csharp_new_line_between_query_expression_clauses = true | ||
|
||
# Indentation preferences | ||
csharp_indent_block_contents = true | ||
csharp_indent_braces = false | ||
csharp_indent_case_contents = true | ||
csharp_indent_case_contents_when_block = true | ||
csharp_indent_switch_labels = true | ||
csharp_indent_labels = one_less_than_current | ||
|
||
# Modifier preferences | ||
csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion | ||
|
||
# Types: use keywords instead of BCL types, and permit var only when the type is clear | ||
csharp_style_var_for_built_in_types = false:none | ||
csharp_style_var_when_type_is_apparent = false:none | ||
csharp_style_var_elsewhere = false:none | ||
dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion | ||
dotnet_style_predefined_type_for_member_access = true:suggestion | ||
|
||
# name all constant fields using PascalCase | ||
dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion | ||
dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields | ||
dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style | ||
dotnet_naming_symbols.constant_fields.applicable_kinds = field | ||
dotnet_naming_symbols.constant_fields.required_modifiers = const | ||
dotnet_naming_style.pascal_case_style.capitalization = pascal_case | ||
|
||
# static fields should have s_ prefix | ||
dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion | ||
dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields | ||
dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style | ||
dotnet_naming_symbols.static_fields.applicable_kinds = field | ||
dotnet_naming_symbols.static_fields.required_modifiers = static | ||
dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected | ||
dotnet_naming_style.static_prefix_style.required_prefix = s_ | ||
dotnet_naming_style.static_prefix_style.capitalization = camel_case | ||
|
||
# internal and private fields should be _camelCase | ||
dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion | ||
dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields | ||
dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style | ||
dotnet_naming_symbols.private_internal_fields.applicable_kinds = field | ||
dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal | ||
dotnet_naming_style.camel_case_underscore_style.required_prefix = _ | ||
dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case | ||
|
||
# Code style defaults | ||
csharp_using_directive_placement = outside_namespace:suggestion | ||
dotnet_sort_system_directives_first = true | ||
csharp_prefer_braces = true:silent | ||
csharp_preserve_single_line_blocks = true:none | ||
csharp_preserve_single_line_statements = false:none | ||
csharp_prefer_static_local_function = true:suggestion | ||
csharp_prefer_simple_using_statement = false:none | ||
csharp_style_prefer_switch_expression = true:suggestion | ||
|
||
# Code quality | ||
dotnet_style_readonly_field = true:suggestion | ||
dotnet_code_quality_unused_parameters = non_public:suggestion | ||
|
||
# Expression-level preferences | ||
dotnet_style_object_initializer = true:suggestion | ||
dotnet_style_collection_initializer = true:suggestion | ||
dotnet_style_explicit_tuple_names = true:suggestion | ||
dotnet_style_coalesce_expression = true:suggestion | ||
dotnet_style_null_propagation = true:suggestion | ||
dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion | ||
dotnet_style_prefer_inferred_tuple_names = true:suggestion | ||
dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion | ||
dotnet_style_prefer_auto_properties = true:suggestion | ||
dotnet_style_prefer_conditional_expression_over_assignment = true:silent | ||
dotnet_style_prefer_conditional_expression_over_return = true:silent | ||
csharp_prefer_simple_default_expression = true:suggestion | ||
|
||
# Expression-bodied members | ||
csharp_style_expression_bodied_methods = true:silent | ||
csharp_style_expression_bodied_constructors = true:silent | ||
csharp_style_expression_bodied_operators = true:silent | ||
csharp_style_expression_bodied_properties = true:silent | ||
csharp_style_expression_bodied_indexers = true:silent | ||
csharp_style_expression_bodied_accessors = true:silent | ||
csharp_style_expression_bodied_lambdas = true:silent | ||
csharp_style_expression_bodied_local_functions = true:silent | ||
|
||
# Pattern matching | ||
csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion | ||
csharp_style_pattern_matching_over_as_with_null_check = true:suggestion | ||
csharp_style_inlined_variable_declaration = true:suggestion | ||
|
||
# Null checking preferences | ||
csharp_style_throw_expression = true:suggestion | ||
csharp_style_conditional_delegate_call = true:suggestion | ||
|
||
# Other features | ||
csharp_style_prefer_index_operator = false:none | ||
csharp_style_prefer_range_operator = false:none | ||
csharp_style_pattern_local_over_anonymous_function = false:none | ||
|
||
# Space preferences | ||
csharp_space_after_cast = false | ||
csharp_space_after_colon_in_inheritance_clause = true | ||
csharp_space_after_comma = true | ||
csharp_space_after_dot = false | ||
csharp_space_after_keywords_in_control_flow_statements = true | ||
csharp_space_after_semicolon_in_for_statement = true | ||
csharp_space_around_binary_operators = before_and_after | ||
csharp_space_around_declaration_statements = do_not_ignore | ||
csharp_space_before_colon_in_inheritance_clause = true | ||
csharp_space_before_comma = false | ||
csharp_space_before_dot = false | ||
csharp_space_before_open_square_brackets = false | ||
csharp_space_before_semicolon_in_for_statement = false | ||
csharp_space_between_empty_square_brackets = false | ||
csharp_space_between_method_call_empty_parameter_list_parentheses = false | ||
csharp_space_between_method_call_name_and_opening_parenthesis = false | ||
csharp_space_between_method_call_parameter_list_parentheses = false | ||
csharp_space_between_method_declaration_empty_parameter_list_parentheses = false | ||
csharp_space_between_method_declaration_name_and_open_parenthesis = false | ||
csharp_space_between_method_declaration_parameter_list_parentheses = false | ||
csharp_space_between_parentheses = false | ||
csharp_space_between_square_brackets = false | ||
|
||
# Default analyzed API surface = 'all' (public APIs + non-public APIs) | ||
dotnet_code_quality.api_surface = all | ||
|
||
# Code files | ||
[*.{cs,vb}] | ||
# Analyzers | ||
dotnet_code_quality.ca1802.api_surface = private, internal | ||
dotnet_code_quality.ca1822.api_surface = private, internal | ||
dotnet_code_quality.ca2208.api_surface = public | ||
# Mark attributes with AttributeUsageAttribute | ||
dotnet_diagnostic.CA1018.severity = warning | ||
# Properties should not be write only | ||
dotnet_diagnostic.CA1044.severity = warning | ||
# Do not declare protected member in sealed type | ||
dotnet_diagnostic.CA1047.severity = warning | ||
# Declare types in namespaces | ||
dotnet_diagnostic.CA1050.severity = warning | ||
# Avoid using cref tags with a prefix | ||
dotnet_diagnostic.CA1200.severity = suggestion | ||
# P/Invokes should not be visible | ||
dotnet_diagnostic.CA1401.severity = warning | ||
# Parameter names should match base declaration | ||
dotnet_diagnostic.CA1725.severity = suggestion | ||
# Remove empty Finalizers | ||
dotnet_diagnostic.CA1821.severity = warning | ||
# Mark assemblies with NeutralResourcesLanguageAttribute | ||
dotnet_diagnostic.CA1824.severity = warning | ||
# Do not use CountAsync() or LongCountAsync() when AnyAsync() can be used | ||
dotnet_diagnostic.CA1828.severity = warning | ||
# Prefer strongly-typed Append and Insert method overloads on StringBuilder. | ||
dotnet_diagnostic.CA1830.severity = warning | ||
# Use AsSpan or AsMemory instead of Range-based indexers when appropriate | ||
dotnet_diagnostic.CA1832.severity = warning | ||
# Use AsSpan or AsMemory instead of Range-based indexers when appropriate | ||
dotnet_diagnostic.CA1833.severity = warning | ||
# Prefer IsEmpty over Count | ||
dotnet_diagnostic.CA1836.severity = warning | ||
# Use 'Environment.ProcessPath' | ||
dotnet_diagnostic.CA1839.severity = warning | ||
# Do not call ToImmutableCollection on an ImmutableCollection value | ||
dotnet_diagnostic.CA2009.severity = warning | ||
# Avoid infinite recursion | ||
dotnet_diagnostic.CA2011.severity = warning | ||
# Initialize value type static fields inline | ||
dotnet_diagnostic.CA2207.severity = warning | ||
# Implement serialization constructors | ||
dotnet_diagnostic.CA2229.severity = warning | ||
# Provide correct arguments to formatting methods | ||
dotnet_diagnostic.CA2241.severity = warning | ||
# Test for NaN correctly | ||
dotnet_diagnostic.CA2242.severity = warning | ||
# Do not assign a property to itself. | ||
dotnet_diagnostic.CA2245.severity = warning | ||
# Provide correct 'enum' argument to 'Enum.HasFlag' | ||
dotnet_diagnostic.CA2248.severity = warning | ||
# Do Not Add Schema By URL | ||
dotnet_diagnostic.CA3061.severity = warning | ||
# Insecure DTD processing in XML | ||
dotnet_diagnostic.CA3075.severity = warning | ||
# Insecure XSLT script processing. | ||
dotnet_diagnostic.CA3076.severity = warning | ||
# Insecure Processing in API Design, XmlDocument and XmlTextReader | ||
dotnet_diagnostic.CA3077.severity = warning | ||
# Mark Verb Handlers With Validate Antiforgery Token | ||
dotnet_diagnostic.CA3147.severity = warning | ||
# Do Not Use Broken Cryptographic Algorithms | ||
dotnet_diagnostic.CA5351.severity = warning | ||
# Do Not Disable Certificate Validation | ||
dotnet_diagnostic.CA5359.severity = warning | ||
# Do Not Call Dangerous Methods In Deserialization | ||
dotnet_diagnostic.CA5360.severity = warning | ||
# Do Not Disable SChannel Use of Strong Crypto | ||
dotnet_diagnostic.CA5361.severity = warning | ||
# Do Not Disable Request Validation | ||
dotnet_diagnostic.CA5363.severity = warning | ||
# Do Not Use Deprecated Security Protocols | ||
dotnet_diagnostic.CA5364.severity = warning | ||
# Do Not Disable HTTP Header Checking | ||
dotnet_diagnostic.CA5365.severity = warning | ||
# Set ViewStateUserKey For Classes Derived From Page | ||
dotnet_diagnostic.CA5368.severity = warning | ||
# Use XmlReader For Validating Reader | ||
dotnet_diagnostic.CA5370.severity = warning | ||
# Do not use obsolete key derivation function | ||
dotnet_diagnostic.CA5373.severity = warning | ||
# Do Not Use XslTransform | ||
dotnet_diagnostic.CA5374.severity = warning | ||
# Use SharedAccessProtocol HttpsOnly | ||
dotnet_diagnostic.CA5376.severity = warning | ||
# Use Container Level Access Policy | ||
dotnet_diagnostic.CA5377.severity = warning | ||
# Do not disable ServicePointManagerSecurityProtocols | ||
dotnet_diagnostic.CA5378.severity = warning | ||
# Do Not Use Weak Key Derivation Function Algorithm | ||
dotnet_diagnostic.CA5379.severity = warning | ||
# Do Not Add Certificates To Root Store | ||
dotnet_diagnostic.CA5380.severity = warning | ||
# Ensure Certificates Are Not Added To Root Store | ||
dotnet_diagnostic.CA5381.severity = warning | ||
# Do Not Use Digital Signature Algorithm (DSA) | ||
dotnet_diagnostic.CA5384.severity = warning | ||
# Use Rivest–Shamir–Adleman (RSA) Algorithm With Sufficient Key Size | ||
dotnet_diagnostic.CA5385.severity = warning | ||
dotnet_diagnostic.CS1591.severity = suggestion | ||
# UseIsNullCheck | ||
dotnet_diagnostic.IDE0041.severity = warning | ||
# ValidateFormatString | ||
dotnet_diagnostic.IDE0043.severity = warning | ||
# MakeLocalFunctionStatic | ||
dotnet_diagnostic.IDE0062.severity = warning | ||
# ConvertTypeOfToNameOf | ||
dotnet_diagnostic.IDE0082.severity = warning | ||
# Remove unnecessary lambda expression | ||
dotnet_diagnostic.IDE0200.severity = none | ||
# Remove redundant nullable directive | ||
dotnet_diagnostic.IDE0240.severity = warning | ||
|
||
# C++ Files | ||
[*.{cpp,h,in}] | ||
curly_bracket_next_line = true | ||
indent_brace_style = Allman | ||
|
||
# Xml project files | ||
[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}] | ||
indent_size = 2 | ||
|
||
[*.{csproj,vbproj,proj,nativeproj,locproj}] | ||
charset = utf-8-bom | ||
|
||
# Xml build files | ||
[*.builds] | ||
indent_size = 2 | ||
|
||
# Xml files | ||
[*.{xml,stylecop,resx,ruleset}] | ||
indent_size = 2 | ||
|
||
# Xml config files | ||
[*.{props,targets,config,nuspec}] | ||
indent_size = 2 | ||
|
||
# YAML config files | ||
[*.{yml,yaml}] | ||
indent_size = 2 | ||
|
||
# Shell scripts | ||
[*.sh] | ||
end_of_line = lf | ||
[*.{cmd, bat}] | ||
end_of_line = crlf |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,36 +1,56 @@ | ||
<?xml version="1.0" encoding="utf-8"?> | ||
<Project> | ||
|
||
<PropertyGroup> | ||
<_AndroidProjectDirFullPath>$([System.IO.Path]::GetFullPath($(AndroidProjectDir)))</_AndroidProjectDirFullPath> | ||
|
||
<_AndroidProjectModuleBuildPath>$(_AndroidProjectDirFullPath)/$(AndroidProjectModule)/build</_AndroidProjectModuleBuildPath> | ||
<_AndroidAarOutputPath>$(_AndroidProjectModuleBuildPath)/outputs/aar/$(AndroidProjectModule).aar</_AndroidAarOutputPath> | ||
<AndroidBuildAar Condition=" '$(AndroidBuildAar)' == '' ">True</AndroidBuildAar> | ||
|
||
<_AndroidGradleW>gradlew</_AndroidGradleW> | ||
<_AndroidGradleW Condition="$([MSBuild]::IsOSPlatform('windows'))">$(_AndroidGradleW).exe</_AndroidGradleW> | ||
<_AndroidGradleWFullPath>$([System.IO.Path]::Combine($(_AndroidProjectDirFullPath), $(_AndroidGradleW)))</_AndroidGradleWFullPath> | ||
|
||
<_AndroidHome>$([System.Environment]::GetEnvironmentVariable('ANDROID_HOME'))</_AndroidHome> | ||
<_AndroidHome Condition=" '$(_AndroidHome)' == '' ">$(HOME)/Library/Developer/Xamarin/android-sdk-macosx</_AndroidHome> | ||
</PropertyGroup> | ||
|
||
<ItemGroup> | ||
<_AndroidGradleInputs Include="$(_AndroidProjectDirFullPath)/**/*.java" Exclude="$(_AndroidProjectModuleBuildPath)/**/*" /> | ||
<_AndroidGradleInputs Include="$(_AndroidProjectDirFullPath)/**/*.gradle" Exclude="$(_AndroidProjectModuleBuildPath)/**/*" /> | ||
<_AndroidGradleInputs Include="$(_AndroidProjectDirFullPath)/**/*.xml" Exclude="$(_AndroidProjectModuleBuildPath)/**/*" /> | ||
<_AndroidGradleInputs Include="$(_AndroidProjectDirFullPath)/**/*.properties" Exclude="$(_AndroidProjectModuleBuildPath)/**/*" /> | ||
</ItemGroup> | ||
|
||
<Target Name="BuildAar" Condition=" '$(AndroidBuildAar)' == 'true' " DependsOnTargets="$(BuildAarDependsOnTargets)" BeforeTargets="$(CoreResolveReferencesDependsOn)" Inputs="@(_AndroidGradleInputs)" Outputs="$(_AndroidAarOutputPath)"> | ||
|
||
<Error Condition=" '$(AndroidProjectDir)' == '' " Text="The AndroidProjectDir property must be set." /> | ||
<Error Condition=" '$(AndroidProjectModule)' == '' " Text="The AndroidProjectModule property must be set." /> | ||
|
||
<Exec | ||
Command="$(_AndroidGradleWFullPath) $(AndroidProjectModule):assembleRelease" | ||
EnvironmentVariables="ANDROID_HOME=$(_AndroidHome)" | ||
WorkingDirectory="$(_AndroidProjectDirFullPath)" /> | ||
</Target> | ||
<Import Project="$(MSBuildThisFileDirectory)Common.targets" Condition=" '$(CommonTargetsImported)' != 'true' " /> | ||
|
||
<UsingTask TaskName="Gradle" AssemblyFile="$(BindingExtBuildTasksAssembly)"/> | ||
|
||
<PropertyGroup> | ||
<GradleProjectConfiguration Condition=" '$(GradleProjectConfiguration)' == '' ">Release</GradleProjectConfiguration> | ||
</PropertyGroup> | ||
|
||
<ItemDefinitionGroup> | ||
<GradleProjectReference> | ||
<Bind>true</Bind> | ||
<Pack>true</Pack> | ||
<Visible>false</Visible> | ||
</GradleProjectReference> | ||
</ItemDefinitionGroup> | ||
|
||
<Target Name="_GetBuildGradleProjectsInputs"> | ||
<ItemGroup> | ||
<_GradleInputs Include="%(GradleProjectReference.FullPath)/**/*.java" /> | ||
<_GradleInputs Include="%(GradleProjectReference.FullPath)/**/*.gradle" /> | ||
<_GradleInputs Include="%(GradleProjectReference.FullPath)/**/*.xml" /> | ||
<_GradleInputs Include="%(GradleProjectReference.FullPath)/**/*.properties"/> | ||
<_GradleInputs Remove="%(GradleProjectReference.FullPath)/%(GradleProjectReference.ModuleName)/build/**/*" /> | ||
</ItemGroup> | ||
</Target> | ||
|
||
<!-- TODO: Improve BeforeTargets to instead use tbd *DependsOn extension point--> | ||
<Target Name="_BuildGradleProjects" | ||
Condition=" '@(GradleProjectReference->Count())' != '0' and $(TargetFramework.Contains('android')) " | ||
DependsOnTargets="_ResolveMonoAndroidSdks;_EnsureBuildTasksAssembly;_GetBuildGradleProjectsInputs" | ||
BeforeTargets="$(CompileDependsOn)" | ||
Inputs="@(_GradleInputs)" | ||
Outputs="@(GradleProjectReference->'%(FullPath)/%(ModuleName)/build/outputs/aar/%(ModuleName)-$(GradleProjectConfiguration).aar')" > | ||
|
||
<Gradle ToolPath="%(GradleProjectReference.FullPath)" | ||
AndroidSdkDirectory="$(AndroidSdkDirectory)" | ||
JavaSdkDirectory="$(JavaSdkDirectory)" | ||
Arguments="%(GradleProjectReference.ModuleName):assemble$(GradleProjectConfiguration)" | ||
WorkingDirectory="%(GradleProjectReference.FullPath)" > | ||
</Gradle> | ||
|
||
<ItemGroup> | ||
<AndroidLibrary Include="@(GradleProjectReference->'%(FullPath)/%(ModuleName)/build/outputs/aar/%(ModuleName)-$(GradleProjectConfiguration).aar')"> | ||
<Bind>%(GradleProjectReference.Bind)</Bind> | ||
<Pack>%(GradleProjectReference.Pack)</Pack> | ||
<Visible>%(GradleProjectReference.Visible)</Visible> | ||
</AndroidLibrary> | ||
</ItemGroup> | ||
|
||
<Error Condition=" !Exists('@(AndroidLibrary)') " Text="Gradle project built successfully but did not produce expected output file: '@(AndroidLibrary)'" /> | ||
<Message Text="Adding reference to gradle project output: @(AndroidLibrary)" /> | ||
</Target> | ||
|
||
</Project> |
Oops, something went wrong.