2012-12-17 23 views
6

Tôi đã kích hoạt proguard trong dự án của mình vì tôi đang cố gắng phát hành ứng dụng này trên Google Play. Mặc dù Proguard-android.txt cóProguard làm cho sự phản chiếu với lớp R trong ứng dụng Android không còn hoạt động

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

}

có nghĩa là nó không nên xáo trộn những lớp R.raw mà tôi cần, tôi thấy rằng khi chạy mã này

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; 
} 

với đường dẫn thô chẳng hạn và tên tệp từ đó tôi nhận được một ArrayIndexOutOfBoundsException tại dòng

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

kể từ subClass.length là 0.

Điều này hoạt động tốt nếu không làm phiền vì vậy tôi đã phát hiện ra rằng vấn đề là với proguard.

tôi đã cố gắng chơi với nhiều cách khác nhau để làm cho nó không xáo trộn các lớp R như thế này:

-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 *; 
} 

và vẫn không hoạt động.

Tôi phải đề cập rằng tất cả mã của tôi đều nằm trong thư viện (headwayEnt.Blackhole_Darksun) và tôi tham chiếu thư viện đó trong headwayEnt.Blackhole_Darksun_Full. Về cơ bản tôi đang xây dựng hai phiên bản từ cùng một mã, một phiên bản đầy đủ và một phiên bản cho bản demo miễn phí. Tất cả sự xáo trộn này xảy ra trong ứng dụng, không phải trong thư viện tham chiếu (chỉ để rõ ràng).

Trả lời

17

này nên làm việc:

-keepattributes InnerClasses 

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

Thuộc tính InnerClasses là cần thiết để có được bất cứ điều gì từ Class$getDeclaredClasses(). Các tùy chọn bảo trì là cần thiết để giữ cho các lớp và các trường có liên quan, với tên ban đầu của chúng.

+0

Hoàn toàn quên câu hỏi này trong nhiều tháng và bây giờ phải làm xáo trộn gói đó và bạn đã cứu tôi! Cảm ơn! –

+0

Cảm ơn Eric. Làm việc tốt cho tôi! –

+0

Cảm ơn bạn rất nhiều. Bạn đã cứu cuộc đời tôi ! :) – PAD

Các vấn đề liên quan