title: Proguard removes overridden methods in abstract class as unused
body: <p>Proguard is removing the overridden methods in an abstract class as unused, even though they are used in the parent class. 
  Here is a reference implementation showing the behaviour</p>
  
  <pre><code>public abstract class Animal {
      Animal() {
          born();
      }
  
      abstract void born();
  }
  
  public abstract class Human extends Animal {
      @Override
      void born() {
          System.out.println("Human is born.");
      }
  }
  </code></pre>
  
  <p>The keep attributes are defined as:</p>
  
  <pre><code>-keep public class test.Human {
      public *;
  }
  </code></pre>
  
  <p>Proguard removes the overridden <code>born()</code> methods in Human class as unused, even though it is used from the constructor of Animal class. The resulting mapping file is </p>
  
  <pre><code>test.Animal -&gt; test.a:
      void born() -&gt; a
  test.Human -&gt; test.Human:
  </code></pre>
  
  <p>This problem does not exist if the class <code>Human</code> is not abstract. If the class <code>Human</code> is non-abstract, the resulting mapping file is</p>
  
  <pre><code>test.Animal -&gt; test.a:
      void born() -&gt; a
  test.Human -&gt; test.Human:
      void born() -&gt; a
  </code></pre>
  
  <p>As we can see, the method <code>born()</code> is retained in this case.</p>
  
  <p>Is this a bug in proguard? Or is there any optimization setting that can provide the desired behaviour?</p>
  
  <p>I am using proguard with android studio.</p>