Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions Documentation/docs-mobile/building-apps/build-properties.md
Original file line number Diff line number Diff line change
Expand Up @@ -465,6 +465,17 @@ removing the existing one(s) and adding your own AOT profiles.

This property is `False` by default.

## AndroidEnableR8JniNameObfuscation

A boolean property that enables R8 obfuscation of Java type, method, and field names
referenced by managed JNI metadata. The build uses an R8-generated mapping to rewrite
managed assemblies before trimming or NativeAOT compilation, then applies the same
mapping during the final R8 invocation.

This property requires `AndroidLinkTool=r8`,
`AndroidTypeMapImplementation=trimmable`, and either NativeAOT or CoreCLR with
`PublishTrimmed=true`.
The default value is `False`.

## AndroidEnableRestrictToAttributes

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,11 @@

<PropertyGroup>
<_TrimmableRuntimeProviderJavaName Condition=" '$(_TrimmableRuntimeProviderJavaName)' == '' ">mono.MonoRuntimeProvider</_TrimmableRuntimeProviderJavaName>
<_CompileToDalvikDependsOnTargets>$(_CompileToDalvikDependsOnTargets);_GenerateProguardConfiguration</_CompileToDalvikDependsOnTargets>
</PropertyGroup>

<PropertyGroup>
<_GenerateProguardAfterTargets Condition=" '$(_GenerateProguardAfterTargets)' == '' ">ILLink</_GenerateProguardAfterTargets>
<_GenerateProguardAfterTargets Condition=" '$(_GenerateProguardAfterTargets)' == '' ">_RunILLink</_GenerateProguardAfterTargets>
</PropertyGroup>

<!-- Add TypeMap DLLs to ILLink input. ILLink natively understands TypeMapAttribute<T>. -->
Expand All @@ -23,6 +24,57 @@
</ItemGroup>
</Target>

<Target Name="_AndroidRewriteJniNamesBeforeILLinkInputs"
Condition=" '$(_AndroidEnableR8JniNameRewriting)' == 'true' "
DependsOnTargets="_AddTrimmableTypeMapToLinker;_AndroidGenerateR8JniSeedMapping">
<PropertyGroup>
<_AndroidR8JniRewrittenAssemblyDirectory>$(IntermediateOutputPath)r8-jni-rewritten/</_AndroidR8JniRewrittenAssemblyDirectory>
<_AndroidR8JniRewriteStamp>$(_AndroidStampDirectory)_AndroidRewriteJniNamesBeforeILLink.stamp</_AndroidR8JniRewriteStamp>
</PropertyGroup>
<ItemGroup>
<_AndroidR8JniOriginalManagedAssembly Remove="@(_AndroidR8JniOriginalManagedAssembly)" />
<_AndroidR8JniHashedManagedAssembly Remove="@(_AndroidR8JniHashedManagedAssembly)" />
<_AndroidR8JniRewrittenManagedAssembly Remove="@(_AndroidR8JniRewrittenManagedAssembly)" />
<_AndroidR8JniExpectedRewriteOutput Remove="@(_AndroidR8JniExpectedRewriteOutput)" />
<_AndroidR8JniMissingRewriteOutput Remove="@(_AndroidR8JniMissingRewriteOutput)" />
<_AndroidR8JniOriginalManagedAssembly Include="@(ManagedAssemblyToLink)" />
</ItemGroup>
<ComputeHash Source="@(_AndroidR8JniOriginalManagedAssembly)">
<Output TaskParameter="Output" ItemName="_AndroidR8JniHashedManagedAssembly" />
</ComputeHash>
<ItemGroup>
<_AndroidR8JniRewrittenManagedAssembly Include="@(_AndroidR8JniHashedManagedAssembly->'$(_AndroidR8JniRewrittenAssemblyDirectory)%(Hash)/%(Filename)%(Extension)')" />
<_AndroidR8JniExpectedRewriteOutput Include="@(_AndroidR8JniRewrittenManagedAssembly);$(_AndroidR8JniRewriteManifest)" />
<_AndroidR8JniMissingRewriteOutput Include="@(_AndroidR8JniExpectedRewriteOutput)" Condition="!Exists('%(Identity)')" />
</ItemGroup>
<Delete Files="$(_AndroidR8JniRewriteStamp)" Condition=" '@(_AndroidR8JniMissingRewriteOutput->Count())' != '0' " />
</Target>

<Target Name="_AndroidRewriteJniNamesBeforeILLink"
Condition=" '$(_AndroidEnableR8JniNameRewriting)' == 'true' "
AfterTargets="PrepareForILLink"
BeforeTargets="_RunILLink"
DependsOnTargets="_AndroidRewriteJniNamesBeforeILLinkInputs"
Inputs="@(_AndroidR8JniHashedManagedAssembly);$(_AndroidR8JniSeedMapping)"
Outputs="$(_AndroidR8JniRewriteStamp)">
<RewriteJniNamesForR8
SourceFiles="@(_AndroidR8JniHashedManagedAssembly)"
DestinationFiles="@(_AndroidR8JniRewrittenManagedAssembly)"
MappingFile="$(_AndroidR8JniSeedMapping)"
RewriteManifestFile="$(_AndroidR8JniRewriteManifest)" />
<Touch Files="$(_AndroidR8JniRewriteStamp)" AlwaysCreate="true" />
<ItemGroup>
<ResolvedFileToPublish Remove="@(_AndroidR8JniHashedManagedAssembly)" />
<ResolvedFileToPublish Include="@(_AndroidR8JniRewrittenManagedAssembly)" />
<ManagedAssemblyToLink Remove="@(ManagedAssemblyToLink)" />
<ManagedAssemblyToLink Include="@(_AndroidR8JniRewrittenManagedAssembly)" />
<FileWrites Include="@(_AndroidR8JniRewrittenManagedAssembly)" />
<FileWrites Include="$(_AndroidR8JniRewriteStamp)" />
<_AndroidR8JniExpectedRewriteOutput Remove="@(_AndroidR8JniExpectedRewriteOutput)" />
<_AndroidR8JniMissingRewriteOutput Remove="@(_AndroidR8JniMissingRewriteOutput)" />
</ItemGroup>
</Target>

<!-- Pass TypeMap entry assembly name to ILLink -->
<Target Name="_ConfigureTrimmableTypeMapForLinker"
BeforeTargets="PrepareForILLink;_RunILLink"
Expand All @@ -42,12 +94,19 @@

<Target Name="_GenerateProguardConfiguration"
AfterTargets="_PrepareLinkedAssembliesForProguard"
DependsOnTargets="_PrepareLinkedAssembliesForProguard"
Condition=" '$(PublishTrimmed)' == 'true' and '$(_ProguardProjectConfiguration)' != '' "
Inputs="@(_LinkedAssemblyForProguard)"
Outputs="$(_ProguardProjectConfiguration)">
Inputs="@(_LinkedAssemblyForProguard);$(_AndroidR8JniSeedMapping);$(_AndroidR8JniRewriteManifest)"
Outputs="$(_ProguardProjectConfiguration);$(_AndroidR8JniReachabilityManifest)">
<GenerateProguardConfiguration
LinkedAssemblies="@(_LinkedAssemblyForProguard)"
OutputFile="$(_ProguardProjectConfiguration)" />
OutputFile="$(_ProguardProjectConfiguration)"
R8MappingFile="$(_AndroidR8JniSeedMapping)"
R8RewriteManifestFile="$(_AndroidR8JniRewriteManifest)"
R8ReachabilityManifestFile="$(_AndroidR8JniReachabilityManifest)" />
<ItemGroup>
<FileWrites Include="$(_AndroidR8JniReachabilityManifest)" Condition=" '$(_AndroidR8JniReachabilityManifest)' != '' " />
</ItemGroup>
</Target>

<Target Name="_ComputePostTrimTrimmableTypeMapInputs"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
<_AndroidBuildRuntimeIdentifiersInParallel
Condition=" ('$(_AndroidTrimmableTypemapTrimJavaCode)' == 'true' or '$(IlcGenerateDgmlFile)' == 'true') and '$(_AndroidBuildRuntimeIdentifiersInParallel)' == '' ">false</_AndroidBuildRuntimeIdentifiersInParallel>
<_TrimmableRuntimeProviderJavaName Condition=" '$(_TrimmableRuntimeProviderJavaName)' == '' ">net.dot.jni.nativeaot.NativeAotRuntimeProvider</_TrimmableRuntimeProviderJavaName>
<AndroidLinkTool Condition=" '$(AndroidLinkTool)' == '' ">r8</AndroidLinkTool>
<AndroidDexTool Condition=" '$(AndroidLinkTool)' == 'r8' ">d8</AndroidDexTool>
<AndroidEnableProguard Condition=" '$(AndroidLinkTool)' != '' ">True</AndroidEnableProguard>
<AndroidCreateProguardMappingFile Condition=" '$(AndroidCreateProguardMappingFile)' == '' and '$(AndroidLinkTool)' == 'r8' ">True</AndroidCreateProguardMappingFile>
Expand Down Expand Up @@ -73,6 +72,64 @@
</ItemGroup>
</Target>

<Target Name="_AndroidRewriteJniNamesBeforeIlcInputs"
Condition=" '$(_AndroidEnableR8JniNameRewriting)' == 'true' "
DependsOnTargets="_AndroidGenerateR8JniSeedMapping">
<PropertyGroup>
<_AndroidR8JniRewrittenAssemblyDirectory>$(IntermediateOutputPath)r8-jni-rewritten/</_AndroidR8JniRewrittenAssemblyDirectory>
<_AndroidR8JniRewriteStamp>$(_AndroidStampDirectory)_AndroidRewriteJniNamesBeforeIlc.stamp</_AndroidR8JniRewriteStamp>
</PropertyGroup>
<ItemGroup>
<_AndroidR8JniIlcAssembly Remove="@(_AndroidR8JniIlcAssembly)" />
<_AndroidR8JniHashedIlcAssembly Remove="@(_AndroidR8JniHashedIlcAssembly)" />
<_AndroidR8JniRewrittenIlcAssembly Remove="@(_AndroidR8JniRewrittenIlcAssembly)" />
<_AndroidR8JniExpectedRewriteOutput Remove="@(_AndroidR8JniExpectedRewriteOutput)" />
<_AndroidR8JniMissingRewriteOutput Remove="@(_AndroidR8JniMissingRewriteOutput)" />
<_AndroidR8JniIlcAssembly Include="@(ManagedBinary)">
<R8JniInputKind>ManagedBinary</R8JniInputKind>
</_AndroidR8JniIlcAssembly>
<_AndroidR8JniIlcAssembly Include="@(IlcReference)">
<R8JniInputKind>IlcReference</R8JniInputKind>
</_AndroidR8JniIlcAssembly>
<_AndroidR8JniIlcAssembly Remove="@(_AndroidR8JniIlcAssembly)" Condition=" '%(Extension)' != '.dll' " />
</ItemGroup>
<ComputeHash Source="@(_AndroidR8JniIlcAssembly)">
<Output TaskParameter="Output" ItemName="_AndroidR8JniHashedIlcAssembly" />
</ComputeHash>
<ItemGroup>
<_AndroidR8JniRewrittenIlcAssembly Include="@(_AndroidR8JniHashedIlcAssembly->'$(_AndroidR8JniRewrittenAssemblyDirectory)%(Hash)/%(Filename)%(Extension)')" />
<_AndroidR8JniExpectedRewriteOutput Include="@(_AndroidR8JniRewrittenIlcAssembly);$(_AndroidR8JniRewriteManifest)" />
<_AndroidR8JniMissingRewriteOutput Include="@(_AndroidR8JniExpectedRewriteOutput)" Condition="!Exists('%(Identity)')" />
</ItemGroup>
<Delete Files="$(_AndroidR8JniRewriteStamp)" Condition=" '@(_AndroidR8JniMissingRewriteOutput->Count())' != '0' " />
</Target>

<Target Name="_AndroidRewriteJniNamesBeforeIlc"
Condition=" '$(_AndroidEnableR8JniNameRewriting)' == 'true' "
BeforeTargets="WriteIlcRspFileForCompilation"
DependsOnTargets="_AndroidRewriteJniNamesBeforeIlcInputs"
Inputs="@(_AndroidR8JniHashedIlcAssembly);$(_AndroidR8JniSeedMapping)"
Outputs="$(_AndroidR8JniRewriteStamp)">
<RewriteJniNamesForR8
SourceFiles="@(_AndroidR8JniHashedIlcAssembly)"
DestinationFiles="@(_AndroidR8JniRewrittenIlcAssembly)"
MappingFile="$(_AndroidR8JniSeedMapping)"
RewriteManifestFile="$(_AndroidR8JniRewriteManifest)" />
<Touch Files="$(_AndroidR8JniRewriteStamp)" AlwaysCreate="true" />
<ItemGroup>
<ManagedBinary Remove="@(ManagedBinary)" />
<ManagedBinary Include="@(_AndroidR8JniRewrittenIlcAssembly)" Condition=" '%(R8JniInputKind)' == 'ManagedBinary' " />
<IlcCompileInput Remove="@(IlcCompileInput)" />
<IlcCompileInput Include="@(ManagedBinary)" />
<IlcReference Remove="@(IlcReference)" />
<IlcReference Include="@(_AndroidR8JniRewrittenIlcAssembly)" Condition=" '%(R8JniInputKind)' == 'IlcReference' " />
<FileWrites Include="@(_AndroidR8JniRewrittenIlcAssembly)" />
<FileWrites Include="$(_AndroidR8JniRewriteStamp)" />
<_AndroidR8JniExpectedRewriteOutput Remove="@(_AndroidR8JniExpectedRewriteOutput)" />
<_AndroidR8JniMissingRewriteOutput Remove="@(_AndroidR8JniMissingRewriteOutput)" />
</ItemGroup>
</Target>

<!--
Force the typemap to be generated in the OUTER build (the build that is not an inner
per-RID build, i.e. '$(_OuterIntermediateOutputPath)' == '') before _ResolveAssemblies
Expand Down Expand Up @@ -231,15 +288,18 @@
<Target Name="_GenerateTrimmableTypeMapProguardConfiguration"
DependsOnTargets="_WriteTrimmableNativeAotProguardConfigurationInputs;_CollectTrimmableNativeAotDgmlFiles"
Condition=" '$(PublishTrimmed)' == 'true' and '$(_ProguardProjectConfiguration)' != '' "
Inputs="$(_TrimmableNativeAotProguardConfigurationInputsStamp);@(_TrimmableNativeAotDgmlFiles);$(IntermediateOutputPath)acw-map.txt"
Outputs="$(_ProguardProjectConfiguration)">
Inputs="$(_TrimmableNativeAotProguardConfigurationInputsStamp);@(_TrimmableNativeAotDgmlFiles);$(IntermediateOutputPath)acw-map.txt;$(_AndroidR8JniSeedMapping)"
Outputs="$(_ProguardProjectConfiguration);$(_AndroidR8JniReachabilityManifest)">
<GenerateNativeAotProguardConfiguration
NativeAotDgmlFiles="@(_TrimmableNativeAotDgmlFiles)"
AcwMapFile="$(IntermediateOutputPath)acw-map.txt"
TrimJavaCallableWrappers="$(_AndroidTrimmableTypemapTrimJavaCode)"
OutputFile="$(_ProguardProjectConfiguration)" />
OutputFile="$(_ProguardProjectConfiguration)"
R8MappingFile="$(_AndroidR8JniSeedMapping)"
R8ReachabilityManifestFile="$(_AndroidR8JniReachabilityManifest)" />
<ItemGroup>
<FileWrites Include="$(_ProguardProjectConfiguration)" />
<FileWrites Include="$(_AndroidR8JniReachabilityManifest)" Condition=" '$(_AndroidR8JniReachabilityManifest)' != '' " />
</ItemGroup>
</Target>

Expand Down
Loading
Loading