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).
Zupełnie zapomniałem o tym pytaniu przez tyle miesięcy, a teraz musiałem go zaciemnić, a ty mnie uratowałeś! Dzięki! –
Dzięki Eric. Działa dobrze dla mnie! –
Dziękuję bardzo. Uratowałeś mi życie ! :) – PAD