2013-07-02 54 views
2

我需要一些Javascript項目,因此我使用Gson將JSON字符串轉換爲值,如下面的代碼所示。在Android中進行模糊處理後找不到匿名類

從Java腳本:

var Items = [{ "ItemName": "Item1", "ItemPos": "1", "ItemValue":"value1"},{ "ItemName": "Item2", "ItemPos": "2", "ItemValue":"value2"}]; 

調用Android本地方法傳遞這些值作爲JSON.parse(項目)

在天然I類有如下這些檢索值,

List<Items> ItemsList; 
Gson gson = new Gson(); 
ItemsList= gson.fromJson(args[0].toString(), new TypeToken<List<Items>>(){}.getType()); 

我已經聲明如下Item類。

public class Items 
    { 
    public String Name; 
    public String Position; 
    public String Value; 

    } 

這些實現方法在原生源中工作正常。但是在混淆源代碼之後,這些實施方法無法正常工作。我得到「查找失敗」錯誤。在反編譯模糊代碼時,Item類不在該位置「匿名類未找到」存在。即使是列表ItemsList的聲明也不存在。如何解決這個問題?

編輯1: MyProguard.pro

-injars  input.jar 
-outjars  output.jar 
-libraryjars android.jar 
-libraryjars android-support-v4.jar 
-libraryjars annotations.jar 
-libraryjars gson-2.2.1.jar 


-dontpreverify 
-repackageclasses '' 
-allowaccessmodification 
-optimizations !code/simplification/arithmetic 
-keepattributes *Annotation* 

-keepparameternames 
-renamesourcefileattribute SourceFile 
-keepattributes Exceptions,InnerClasses,Signature,Deprecated, 
      SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 

-keep public class * { 
    public protected *; 
} 

-keepclassmembernames class * { 
    java.lang.Class class$(java.lang.String); 
    java.lang.Class class$(java.lang.String, boolean); 
} 

-keepclasseswithmembernames class * { 
    native <methods>; 
} 

-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keepclassmembers class * implements java.io.Serializable { 
    static final long serialVersionUID; 
    private static final java.io.ObjectStreamField[] serialPersistentFields; 
    private void writeObject(java.io.ObjectOutputStream); 
    private void readObject(java.io.ObjectInputStream); 
    java.lang.Object writeReplace(); 
    java.lang.Object readResolve(); 
} 

-keep public class * extends android.app.Activity 
-keep public class * extends android.app.Application 
-keep public class * extends android.app.Service 
-keep public class * extends android.content.BroadcastReceiver 
-keep public class * extends android.content.ContentProvider 

-keep public class * extends android.view.View { 
    public <init>(android.content.Context); 
    public <init>(android.content.Context, android.util.AttributeSet); 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
    public void set*(...); 
    } 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet); 
    } 

-keepclasseswithmembers class * { 
    public <init>(android.content.Context, android.util.AttributeSet, int); 
    } 

-keepclassmembers class * extends android.content.Context { 
    public void *(android.view.View); 
    public void *(android.view.MenuItem); 
    } 

    -keepclassmembers class * implements android.os.Parcelable { 
     static android.os.Parcelable$Creator CREATOR; 
    } 

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

我已經通過 「Java的罐子proguard.jar @ MyProguard.pro

+0

也許你能告訴我們你如何混淆您的代碼(proguard的,...),你用什麼樣的配置。我認爲這是最相關的部分。 – OcuS

+0

嗨,我在我的問題中包含了MyProguard.pro。 – Karthick

回答

0
I think that compiler may ignore the item class during Obfuscating 

you must manually mention your missed class name in your proguard.txt file like as follows 

-keep public class <your_class_name> 

請參閱此鏈接混淆源here

它可能會幫你

+0

感謝您的回覆。我已經嘗試過這種方式,它保留了類的Items。但是在檢索javascript json值時,我收到了查找失敗的消息。列表 ItemsList;這在反編譯的java文件中不存在。如何在混淆中保留這些類型的聲明。 – Karthick

+0

你在應用程序中使用任何第三方jar文件嗎? – Nas

+0

是的,我在我的源代碼中使用了gson-2.1.1.jar。只使用這個Gson方法我正在檢索JSON值。 – Karthick

0

嘗試添加:

-keep class com.xxx.yyy$Items { *; } 
+0

我已經包含上述屬性,仍然收到查找失敗的錯誤。在反編譯混淆的jar文件時,出現「Anonymous class not found」錯誤。 – Karthick

+0

@Karthick:我確定了答案。 – OcuS

+0

感謝您的回覆。我正在使用這個Items類作爲NativeMethodProcessClass的內部類,現在我正在給Proguard.pro文件中的com.example.Android.NativeMethodProcessClass $ Items {*;}。但在被解密的文件中獲得「未找到成員類」。 Proguard中有什麼需要改變嗎? – Karthick