From 605d88a37d0aba9aa2963de2b3298726ba9a9a02 Mon Sep 17 00:00:00 2001 From: Andrew Quan Date: Fri, 26 Mar 2021 13:38:21 +0200 Subject: [PATCH] Android - Optimization - added options for optimization: ``` "Android": { "Optimize": { "MinifyEnabled": true, "ShrinkResources": true, "DefaultAndroidProGuard": "proguard-android-optimize.txt", "PrependRulesFile": "proguard-rules-prepend.pro", "AppendRulesFile": "proguard-rules-append.pro" }, ... ``` Default android proguard rules(proguard-android.txt) are applied when not specified ``` "Android": { "Optimize": { "MinifyEnabled": true, "ShrinkResources": true }, ... ``` Can add custom proguard rules before or after the main generated class rules: ``` "Android": { "Optimize": { "MinifyEnabled": true, "ShrinkResources": true, "PrependRulesFile": "proguard-rules-prepend.pro", "AppendRulesFile": "proguard-rules-append.pro" }, ... ``` Create "proguard-rules-prepend.pro" in root of Project folder: e.g. MyApp/MainView.ux MyApp/proguard-rules-prepend.pro ... proguard-rules-prepend.pro ``` -keepattributes *Annotation* -keepattributes Exceptions -keepattributes InnerClasses -keepattributes Signature -keepattributes SourceFile,LineNumberTable ``` --- lib/UnoCore/Targets/Android/Android.uxl | 3 ++ lib/UnoCore/Targets/Android/app/build.gradle | 44 ++++++++++++++++++-- src/tool/engine/Targets/AndroidBuild.cs | 11 +++++ 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/lib/UnoCore/Targets/Android/Android.uxl b/lib/UnoCore/Targets/Android/Android.uxl index 8175ee140..ff0a3dbc0 100644 --- a/lib/UnoCore/Targets/Android/Android.uxl +++ b/lib/UnoCore/Targets/Android/Android.uxl @@ -79,6 +79,9 @@ + + + diff --git a/lib/UnoCore/Targets/Android/app/build.gradle b/lib/UnoCore/Targets/Android/app/build.gradle index e90dd465f..44db897c2 100644 --- a/lib/UnoCore/Targets/Android/app/build.gradle +++ b/lib/UnoCore/Targets/Android/app/build.gradle @@ -51,7 +51,15 @@ android { targetSdkVersion @(SDK.TargetVersion) versionCode = @(Project.Android.VersionCode) versionName = '@(Project.Android.VersionName)' - multiDexEnabled @(Project.Android.MultiDexEnabled:IsSet:Test(@(Project.Android.MultiDexEnabled:Bool),true)) + + #if @(Project.Android.Optimize.MinifyEnabled:Test(1, 0)) + //minifier handles multi-dexing for release + #if @(DEBUG:Defined) + multiDexEnabled @(Project.Android.MultiDexEnabled:IsSet:Test(@(Project.Android.MultiDexEnabled:Bool),true)) + #endif + #else + multiDexEnabled @(Project.Android.MultiDexEnabled:IsSet:Test(@(Project.Android.MultiDexEnabled:Bool),true)) + #endif ndk { #if @(DEBUG:Defined) @@ -83,6 +91,12 @@ android { } + //prevent gradle build crash - https://stackoverflow.com/a/47689687/2139770 + dexOptions { + javaMaxHeapSize "4g" + } + + #if @(Project.Android.Bundle.Language.EnableSplit:IsSet) || @(Project.Android.Bundle.Density.EnableSplit:IsSet) || @(Project.Android.Bundle.ABI.EnableSplit:IsSet) bundle { #if @(Project.Android.Bundle.Language.EnableSplit:IsSet) @@ -133,8 +147,32 @@ android { #elif @(Project.Android.Key.Store:IsSet) signingConfig = signingConfigs.release #endif - minifyEnabled = false - proguardFiles 'proguard-rules.pro' + +#if @(Project.Android.Optimize.MinifyEnabled:IsSet) + // Enables code shrinking, obfuscation, and optimization for only + // your project's release build type. + minifyEnabled @(Project.Android.Optimize.MinifyEnabled:ToLower) +#else + minifyEnabled true +#endif + +#if @(Project.Android.Optimize.ShrinkResources:IsSet) + // Enables resource shrinking, which is performed by the + // Android Gradle plugin. + shrinkResources @(Project.Android.Optimize.ShrinkResources:ToLower) +#else + shrinkResources true +#endif + // Includes the default ProGuard rules files that are packaged with + // the Android Gradle plugin. To learn more, go to the section about + // R8 configuration files. + proguardFiles getDefaultProguardFile( +#if @(Project.Android.Optimize.DefaultAndroidProGuard:IsSet) + '@(Project.Android.Optimize.DefaultAndroidProGuard:ToLower)' +#else + 'proguard-android.txt' +#endif + ), 'proguard-rules.pro' } } diff --git a/src/tool/engine/Targets/AndroidBuild.cs b/src/tool/engine/Targets/AndroidBuild.cs index 196344fb9..561ca5a69 100644 --- a/src/tool/engine/Targets/AndroidBuild.cs +++ b/src/tool/engine/Targets/AndroidBuild.cs @@ -52,9 +52,20 @@ public override void DeleteOutdated(Disk disk, IEnvironment env) var lines = new List {"## This file was generated by Uno compiler."}; var src = env.GetOutputPath("Java.SourceDirectory"); + // Prepend user-defined proguard rules. + var proGuardPrependFile = env.GetString("ProGuard.PrependRulesFile"); + if (proGuardPrependFile.IsValidPath()) + lines.AddRange(File.ReadAllLines(proGuardPrependFile)); + + // Add existing Java classes. if (Directory.Exists(src)) VisitSourceDirectoryRecursive(src, src, lines); + // Append user-defined proguard rules. + var proGuardAppendFile = env.GetString("ProGuard.AppendRulesFile"); + if (proGuardAppendFile.IsValidPath()) + lines.AddRange(File.ReadAllLines(proGuardAppendFile)); + // End with newline. lines.Add("");