Skip to content

Commit

Permalink
[Xamarin.Android.Build.Tasks] redistribute proguard-android.txt fro…
Browse files Browse the repository at this point in the history
…m Android gradle plugin

Context: https://discord.com/channels/732297728826277939/732297837953679412/1303383272918618163

A customer found their app grew in size when building on Windows
versus macOS.

The difference being a file that was passed to the `<R8/>` task on
Windows, but not on macOS:

    C:\Users\[username]\AppData\Local\Android\Sdk\tools\proguard\proguard-android.txt

`tools` is *ancient*, as any Android SDK should be using
`cmdline-tools` now.

Let's stop using this file as a default set of proguard rules.

But we need to use the *right* set of proguard rules, reading
the text of the old one:

> This file is no longer maintained and is not used by new (2.2+)
> versions of the # Android plugin for Gradle. Instead, the Android
> plugin for Gradle generates the # default rules at build time and
> stores them in the build directory.

I found the source code for the gradle task that generates the new
files at:

* https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-main:build-system/gradle-core/src/main/java/com/android/build/gradle/ProguardFiles.java;l=116

In order to get this file, we can setup an empty gradle project
using the Android gradle plugin:

    plugins {
        id 'com.android.application' version '8.7.0'
    }

Which, hopefully, dependabot is able to update this version.

Then we can run the task:

    .\gradlew extractProguardFiles

This outputs files such as:

    src\proguard-android\build\intermediates\default_proguard_files\global\proguard-android-optimize.txt-8.7.0
    src\proguard-android\build\intermediates\default_proguard_files\global\proguard-android.txt-8.7.0
    src\proguard-android\build\intermediates\default_proguard_files\global\proguard-defaults.txt-8.7.0

For now, I simply redistributed the `proguard-android.txt` file, but
we could consider making `proguard-android-optimize.txt` useable in
the future. I believe the only difference is the
`-allowaccessmodification` flag, which users could put in their own
proguard rules.
  • Loading branch information
jonathanpeppers committed Nov 7, 2024
1 parent 4266c2b commit 4ee6762
Show file tree
Hide file tree
Showing 8 changed files with 81 additions and 1 deletion.
7 changes: 7 additions & 0 deletions Xamarin.Android.sln
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{FFCF518F-2A4
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.Android.Sdk.Analysis", "src\Microsoft.Android.Sdk.Analysis\Microsoft.Android.Sdk.Analysis.csproj", "{5E806C9F-1B67-4B6B-A6AB-258834250DBB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "proguard-android", "src\proguard-android\proguard-android.csproj", "{5FD0133B-69E5-4474-9B67-9FD1D0150C70}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|AnyCPU = Debug|AnyCPU
Expand Down Expand Up @@ -343,6 +345,10 @@ Global
{5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Debug|AnyCPU.Build.0 = Debug|Any CPU
{5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Release|AnyCPU.ActiveCfg = Release|Any CPU
{5E806C9F-1B67-4B6B-A6AB-258834250DBB}.Release|AnyCPU.Build.0 = Release|Any CPU
{5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Debug|AnyCPU.ActiveCfg = Debug|Any CPU
{5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Debug|AnyCPU.Build.0 = Debug|Any CPU
{5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Release|AnyCPU.ActiveCfg = Release|Any CPU
{5FD0133B-69E5-4474-9B67-9FD1D0150C70}.Release|AnyCPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
Expand Down Expand Up @@ -402,6 +408,7 @@ Global
{BA4D889D-066B-4C2C-A973-09E319CBC396} = {E351F97D-EA4F-4E7F-AAA0-8EBB1F2A4A62}
{A39B6D7C-6616-40D6-8AE4-C6CEE93D2708} = {CAB438D8-B0F5-4AF0-BEBD-9E2ADBD7B483}
{5E806C9F-1B67-4B6B-A6AB-258834250DBB} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
{5FD0133B-69E5-4474-9B67-9FD1D0150C70} = {FFCF518F-2A4A-40A2-9174-2EE13B76C723}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {53A1F287-EFB2-4D97-A4BB-4A5E145613F6}
Expand Down
1 change: 1 addition & 0 deletions build-tools/installers/create-installers.targets
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@
<_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)java_runtime_net6.dex" ExcludeFromLegacy="true" />
<_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)java_runtime_fastdev_net6.dex" ExcludeFromLegacy="true" />
<_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)manifestmerger.jar" />
<_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)proguard-android.txt" />
<_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)protobuf-net.dll" />
<_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)System.CodeDom.dll" />
<_MSBuildFiles Include="$(MicrosoftAndroidSdkOutDir)System.Collections.Immutable.dll" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1899,7 +1899,7 @@ because xbuild doesn't support framework reference assemblies.
<_ProguardConfiguration Include="$(ProguardConfigFiles)" />
</ItemGroup>
<ItemGroup Condition=" '$(ProguardConfigFiles)' == '' ">
<_ProguardConfiguration Include="$(_AndroidSdkDirectory)tools\proguard\proguard-android.txt" Condition=" Exists ('$(_AndroidSdkDirectory)tools\proguard\proguard-android.txt') " />
<_ProguardConfiguration Include="$(MSBuildThisFileDirectory)proguard-android.txt" />
<_ProguardConfiguration Include="$(IntermediateOutputPath)proguard\proguard_xamarin.cfg" Condition=" '$(AndroidLinkTool)' != '' " />
<_ProguardConfiguration Include="$(_ProguardProjectConfiguration)" Condition=" '$(AndroidLinkTool)' != '' " />
<_ProguardConfiguration Include="$(IntermediateOutputPath)proguard\proguard_project_primary.cfg" Condition=" '$(AndroidLinkTool)' != '' " />
Expand Down
6 changes: 6 additions & 0 deletions src/proguard-android/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.idea/
build/
out/
.classpath
.project
.settings/
14 changes: 14 additions & 0 deletions src/proguard-android/build.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
plugins {
id 'com.android.application' version '8.7.0'
}

repositories {
google()
mavenCentral()
}

android {
namespace 'com.microsoft.proguard.android'
// Setting the minimum we support at the moment, might not matter
compileSdk 21
}
10 changes: 10 additions & 0 deletions src/proguard-android/proguard-android.csproj
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<Project Sdk="Microsoft.Build.NoTargets">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netstandard2.0</TargetFramework>
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
<OutputPath Condition="'$(OutputPath)'==''">bin\$(Configuration)</OutputPath>
</PropertyGroup>
<Import Project="..\..\Configuration.props" />
<Import Project="proguard-android.targets" />
</Project>
34 changes: 34 additions & 0 deletions src/proguard-android/proguard-android.targets
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<_Destination>$(MicrosoftAndroidSdkOutDir)proguard-android.txt</_Destination>
</PropertyGroup>

<Target Name="_GenerateProGuardRules"
BeforeTargets="Build"
Inputs="$(MSBuildThisFile);build.gradle;settings.gradle"
Outputs="$(_Destination)">
<Exec
Command="&quot;$(GradleWPath)&quot; extractProguardFiles $(GradleArgs)"
EnvironmentVariables="JAVA_HOME=$(JavaSdkDirectory);APP_HOME=$(GradleHome)"
WorkingDirectory="$(MSBuildThisFileDirectory)"
/>
<ItemGroup>
<_ProguardRules Include="$(MSBuildThisFileDirectory)build\intermediates\default_proguard_files\global\proguard-android.txt-*" />
</ItemGroup>
<Copy
SourceFiles="@(_ProguardRules)"
DestinationFiles="$(_Destination)"
/>
<Touch Files="$(_Destination)" />
</Target>

<Target Name="_CleanProguardRules" BeforeTargets="Clean">
<Delete Files="$(_Destination)" />
<Exec
Command="&quot;$(GradleWPath)&quot; clean $(GradleArgs)"
EnvironmentVariables="JAVA_HOME=$(JavaSdkDirectory);APP_HOME=$(GradleHome)"
WorkingDirectory="$(MSBuildThisFileDirectory)"
/>
</Target>

</Project>
8 changes: 8 additions & 0 deletions src/proguard-android/settings.gradle
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
pluginManagement {
repositories {
gradlePluginPortal()
google()
mavenCentral()
}
}
rootProject.name = 'proguard-android'

0 comments on commit 4ee6762

Please sign in to comment.