Android Build Tools Prevent ProGuard from Removing Unused Application Library Classes

Here is a part of mine build.gradle:

android {
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:21.0.3'
}

There is proguard-rules.pronothing in it, but I noticed that a file was created with a name aapt_rules.txtthat has something like this:

# view res/layout/abc_action_menu_item_layout.xml #generated:17
-keep class android.support.v7.internal.view.menu.ActionMenuItemView { <init>(...); }

# view res/layout/abc_expanded_menu_layout.xml #generated:17
-keep class android.support.v7.internal.view.menu.ExpandedMenuView { <init>(...); }

# view res/layout/abc_list_menu_item_layout.xml #generated:17
# view res/layout/abc_popup_menu_item_layout.xml #generated:17
-keep class android.support.v7.internal.view.menu.ListMenuItemView { <init>(...); }

# view res/layout/abc_screen_toolbar.xml #generated:27
-keep class android.support.v7.internal.widget.ActionBarContainer { <init>(...); }

# view res/layout/abc_action_mode_bar.xml #generated:19
# view res/layout/abc_screen_toolbar.xml #generated:43
-keep class android.support.v7.internal.widget.ActionBarContextView { <init>(...); }

# view res/layout/abc_screen_toolbar.xml #generated:17
-keep class android.support.v7.internal.widget.ActionBarOverlayLayout { <init>(...); }

# view res/layout/abc_screen_content_include.xml #generated:19
-keep class android.support.v7.internal.widget.ContentFrameLayout { <init>(...); }

# view res/layout/abc_screen_simple_overlay_action_mode.xml #generated:23
-keep class android.support.v7.internal.widget.FitWindowsFrameLayout { <init>(...); }

# view res/layout/abc_screen_simple.xml #generated:17
-keep class android.support.v7.internal.widget.FitWindowsLinearLayout { <init>(...); }

# view v11/res/layout-v11/abc_screen_content_include.xml #generated:19
-keep class android.support.v7.internal.widget.NativeActionModeAwareLayout { <init>(...); }

# view res/layout/abc_action_mode_close_item_material.xml #generated:17
# view res/layout/abc_search_dropdown_item_icons_2line.xml #generated:27
# view res/layout/abc_search_dropdown_item_icons_2line.xml #generated:37
# view res/layout/abc_search_dropdown_item_icons_2line.xml #generated:48
# view res/layout/abc_search_view.xml #generated:116
# view res/layout/abc_search_view.xml #generated:128
# view res/layout/abc_search_view.xml #generated:38
# view res/layout/abc_search_view.xml #generated:60
# view res/layout/abc_search_view.xml #generated:97
-keep class android.support.v7.internal.widget.TintImageView { <init>(...); }

# view res/layout/abc_screen_simple.xml #generated:25
# view res/layout/abc_screen_simple_overlay_action_mode.xml #generated:32
-keep class android.support.v7.internal.widget.ViewStubCompat { <init>(...); }

# view res/layout/abc_action_menu_layout.xml #generated:17
-keep class android.support.v7.widget.ActionMenuView { <init>(...); }

# view res/layout/abc_activity_chooser_view.xml #generated:19
-keep class android.support.v7.widget.LinearLayoutCompat { <init>(...); }

# view res/layout/abc_search_view.xml #generated:78
-keep class android.support.v7.widget.SearchView$SearchAutoComplete { <init>(...); }

# view res/layout/abc_screen_toolbar.xml #generated:36
-keep class android.support.v7.widget.Toolbar { <init>(...); }

Which, obviously, saves all the XML used in the support library, even if these XML are not used at all. And codes that are saved again do not allow all resources to be skipped with shrinkResources true. And the apk size has increased significantly, even nothing is used in the support library. The same thing happens with other libraries.

So, is there a way to tweak aapt_rules.txtor do something similar to remove unused code and resources? (or do I need to open the problem for this somewhere?)

+4
3

, aapt_rules.txt. , . :

# view res/layout/abc_list_menu_item_layout.xml #generated:17
# view res/layout/abc_popup_menu_item_layout.xml #generated:17
-keep class android.support.v7.internal.view.menu.ListMenuItemView { <init>(...); }

, , ​​ . , -.

, appcompat? , , .

  • sdk\extras\android\m2repository\com\android\support\appcompat-v7\version\appcompat-v7-version.aar. , , . , .

  • . . , . , appcompat . , .

  • , gradle script, . .

( shrinkResources , aapt_rules.txt . .)

, -

aapt_rules.txt. 100 apk. . .

+1

sbt-android , proguardConfig :

proguardConfig in Android := List("-dontobfuscate",
  "-dontoptimize",
  "-renamesourcefileattribute SourceFile",
  "-keepattributes SourceFile,LineNumberTable",
  "-verbose",
  "-flattenpackagehierarchy",
  "-dontusemixedcaseclassnames",
  "-dontpreverify",
  "-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*,!code/allocation/variable",
  "-keepattributes *Annotation*",
  "-dontnote android.annotation.**",
  "-dontwarn android.support.**",
  "-dontnote android.support.**",
  "-dontnote scala.ScalaObject",
  "-dontnote org.xml.sax.EntityResolver",
  "-dontnote scala.concurrent.forkjoin.**",
  "-dontwarn scala.beans.ScalaBeanInfo",
  "-dontwarn scala.concurrent.**",
  "-dontnote scala.reflect.**",
  "-dontwarn scala.reflect.**",
  "-dontwarn scala.sys.process.package$",
  "-dontwarn **$$anonfun$*",
  "-dontwarn scala.collection.immutable.RedBlack$Empty",
  "-dontwarn scala.tools.**,plugintemplate.**",

  "-keep class scala.collection.SeqLike { public java.lang.String toString(); }",

  "-keep class android.support.v7.view.menu.ListMenuItemView { <init>(...); }",
  ...
)
0

getDefaultProguardFile ('proguard-android.txt'), proguard {android-sdks}/tools/proguard

 # The support library contains references to newer platform versions.
 # Don't warn about those in case this app is linking against an older
 # platform version.  We know about them, and they are safe.
 -dontwarn android.support.**

, .

Useless code can be transferred by another proguard file, {android-sdks} /tools/proguard/proguard-android-optimize.txt, which uses the default value of 5 turns into code optimization ( -optimizationpasses 5 ).

-1
source

All Articles