2012-12-17 24 views
6

Aktywowałem proguard w moim projekcie, ponieważ próbuję go opublikować w Google Play. Chociaż PROGUARD-android.txt maProguard sprawia, że ​​odbicie w klasie R w aplikacji na Androida przestało działać

-keepclassmembers class **.R$* { 
public static <fields>; 

}

co oznacza, że ​​nie powinny zaciemniać klasę R.raw że muszę, że kiedy uruchomiony ten kod

import headwayEnt.Blackhole_Darksun.R; 

private static final String RES_PATH = "headwayEnt.Blackhole_Darksun.R"; 

public static int getFileHandle(String fileName, String path) { 
    String fullPath = RES_PATH + '$' + path; 
    if (subClass == null) { 
     Class<headwayEnt.Blackhole_Darksun.R> c = null;  
     try { 
      c = (Class<R>)Class.forName(RES_PATH); 
     } catch(ClassNotFoundException e) { 
      e.printStackTrace(); 
     } catch(ClassCastException e) { 
      e.printStackTrace(); 
     } 
     subClass = c.getDeclaredClasses(); 
    } 
    int fileHandle = 0; 
    try { 
     int i = 0; 
     System.out.println("fullPath: " + fullPath + " subclass len: " + 
       subClass.length); 
     for (; i < subClass.length; ++i) { 
      String name = subClass[i].getName(); 
      if (subClass[i].getName().equals(fullPath)) { 
       break; 
      } 
     } 
     System.out.println("found i: " + i); 
     Field[] f = subClass[i].getDeclaredFields(); 
     for (i = 0; i < f.length; ++i) { 
      if (f[i].getName().equals(fileName)) { 
       break; 
      } 
     } 

     try { 
      fileHandle = f[i].getInt(null); 
     } catch(IllegalAccessException e) { 

     } 
    } catch (RuntimeException e) { 
     System.out.println("Could not find filename: " + fileName + 
       " with path: " + path); 
     throw e; 
    } 
    return fileHandle; 
} 

z path raw na przykład i nazwa pliku z tego powodu otrzymuję wyjątek ArrayIndexOutOfBoundsEx w linii

Field[] f = subClass[i].getDeclaredFields(); 

, ponieważ subClass.length to 0.

Ta sprawa działa dobrze, jeśli nie zaciemniam, więc pomyślałem, że problem dotyczy proguarda.

Próbowałem grać z różnych sposobów, aby nie zaciemniać klasy R tak:

-keep public class headwayEnt.HotshotEngine.Resource.ENG_Resource { *; } 
-keep class headwayEnt.HotshotEngine.** { *; } 
-keep class **.R$* 
-keep public class headwayEnt.Blackhole_Darksun.R { *; } 
-keep public class headwayEnt.Blackhole_Darksun_Full.R { *; } 
-repackageclasses '' 
-keep public class **.R { 
    public *; 
} 
-keep public class **.R$* { 
    public *; 
} 

i nadal nie działa.

Muszę wspomnieć, że cały mój kod znajduje się w bibliotece (headwayEnt.Blackhole_Darksun) i że odwołuję się do tej biblioteki w headwayEnt.Blackhole_Darksun_Full. Zasadniczo buduję dwie wersje z tego samego kodu, jeden dla pełnej wersji i jeden dla darmowego demo. Cała ta obfuskacja dzieje się w aplikacji, a nie w bibliotece, do której się odwołuje (po to, żeby być czystym).

Odpowiedz

17

To powinno działać:

-keepattributes InnerClasses 

-keep class **.R 
-keep class **.R$* { 
    <fields>; 
} 

Atrybut InnerClasses jest konieczne, aby uzyskać coś od Class$getDeclaredClasses(). Opcje -keep są niezbędne do zachowania odpowiednich klas i pól wraz z ich oryginalnymi nazwami.

+0

Zupełnie zapomniałem o tym pytaniu przez tyle miesięcy, a teraz musiałem go zaciemnić, a ty mnie uratowałeś! Dzięki! –

+0

Dzięki Eric. Działa dobrze dla mnie! –

+0

Dziękuję bardzo. Uratowałeś mi życie ! :) – PAD

Powiązane problemy