# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# Proguard flags for what should be kept in the main dex. Only used
# during main dex list determination, not during actual proguarding.

-keep @org.chromium.base.annotations.MainDex class * {
  *;
}

-keepclasseswithmembers class * {
  @org.chromium.base.annotations.MainDex <methods>;
}

# Assume all IDL-generated classes should be kept. They can't reference other
# non-framework classes, so fairly low-risk.
-keepclasseswithmembers class * {
  public static ** asInterface(android.os.IBinder);
}

# Required when code coverage is enabled.
-keep class com.vladium.** {
  *;
}

# Renderers / GPU process don't load secondary dex.
-keep public class * extends org.chromium.base.process_launcher.ChildProcessService {
  *;
}

# Used by tests for secondary dex extraction.
-keep class android.support.v4.content.ContextCompat {
  *;
}

# The following are based on $SDK_BUILD_TOOLS/mainDexClasses.rules
# Ours differ in that:
# 1. It omits -keeps for application / instrumentation / backupagents (these are
#    redundant since they are added by aapt's main dex list rules output).
# 2. Omits keep for Application.attachBaseContext(), which is overly broad.
# 3. Omits keep for all annotations, which is also overly broad (and pulls in
#    any class that has an @IntDef).

######## START mainDexClasses.rules ########

# Keep old fashion tests in the main dex or they'll be silently ignored by InstrumentationTestRunner
-keep public class * extends android.test.InstrumentationTestCase {
  <init>();
}

######## END mainDexClasses.rules ########
