Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 导致NoSuchMethodException的Proguard-后续_Android_Proguard - Fatal编程技术网

Android 导致NoSuchMethodException的Proguard-后续

Android 导致NoSuchMethodException的Proguard-后续,android,proguard,Android,Proguard,根据中@AlexWein的建议,我在SherlockFragment中有以下内容: Class<?> c = Class.forName("co.uk.MyApp.pdf.MyData"); Method main = c.getDeclaredMethod("pdfsleep", Report_Holder.class); Report_Holder paramsh = null; paramsh = SRH; main.invoke(null, (Object)paramsh);

根据中@AlexWein的建议,我在SherlockFragment中有以下内容:

Class<?> c = Class.forName("co.uk.MyApp.pdf.MyData");
Method main = c.getDeclaredMethod("pdfsleep", Report_Holder.class);
Report_Holder paramsh = null;
paramsh = SRH;
main.invoke(null, (Object)paramsh);
Proguard的设置如下:

-keepnames class co.uk.MyApp.classes.Report_Holder
-keepclassmembers class co.uk.MyApp.pdf.Data { public static void   pdfsleep(Report_Holder); }
-keepnames class co.uk.MyApp.DataActivity
但我仍然得到一个例外:

05/23/13 12:14:28 GMT+01:00 ERROR  AsyncTask #2 - java.lang.NoSuchMethodException: pdfsleep [class co.uk.MyApp.classes.Report_Holder]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getDeclaredMethod(Class.java:685)
at co.uk.MyApp.fy.a(Unknown Source)
at co.uk.MyApp.fy.doInBackground(Unknown Source)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)
我错过了什么

更新

我已将前进路线更改为:

-keepattributes Signature
-keepnames class co.uk.MyApp.classes.Report_Holder
-keepclasseswithmembers class co.uk.MyApp.DataActivity 
-keepclasseswithmembers class co.uk.MyApp.pdf.Data { void pdfsleep(Report_Holder); }
但我仍然得到了错误

查看映射文件,我认为我看到了导致问题的原因:

co.uk.MyApp.classes.Report_Holder -> co.uk.MyApp.classes.Report_Holder:

co.uk.MyApp.DataActivity -> co.uk.MyApp.DataActivity:
java.util.ArrayList arrDataItems -> a
co.uk.MyApp.classes.Report_Holder SRH -> b
Proguard似乎保留了对co.uk.MyApp.classes.Report_Holder的引用,但在将其作为co.uk.MyApp.DataActivity的子项引用时,将其混淆

我尝试了不同的方法来保持co.uk.MyApp.DataActivity,试图让它停止混淆co.uk.MyApp.classes.Report\u Holder,但无法获得正确的语法。有什么建议吗

更新2

我已经按照Eric Lafortune的建议更新了一些代码和ProGuard配置文件(顺便说一句,我现在正在显示正确的包/类名):

在co.uk.FibroApp.SleepDataActivity中

Class<?> c = Class.forName("co.uk.FibroApp.pdf.SleepData");
Method main = c.getDeclaredMethod("pdfsleep", co.uk.FibroApp.classes.SleepReport_Holder.class);

SleepReport_Holder paramsh = SRH;
完整的ProGuard配置为:

-keepattributes Signature

-keep class co.uk.FibroApp.classes.SleepReport_Holder
-keep class co.uk.FibroApp.pdf.SleepData
-keepclassmembers class co.uk.FibroApp.pdf.SleepData {
    public static void pdfsleep(co.uk.FibroApp.classes.SleepReport_Holder);
}

# do not obfuscate the classes from droidtext but shrink them
-keep,allowshrinking class harmony.java.awt.** { *; }
-keep,allowshrinking class org.apache.harmony.** { *; }
-keep,allowshrinking class org.bouncycastle.** { *; }

-keep class android.support.v4.app.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep class com.actionbarsherlock.** { *; }
-keep interface com.actionbarsherlock.** { *; }

-keepattributes *Annotation*
完整的错误日志是:

05/24/13 08:25:52 WEST ERROR  AsyncTask #2 - java.lang.NoSuchMethodException: sleeppdf [class co.uk.FibroApp.classes.SleepReport_Holder]
at java.lang.Class.getConstructorOrMethod(Class.java:460)
at java.lang.Class.getDeclaredMethod(Class.java:685)
at co.uk.FibroApp.fy.a(Unknown Source)
at co.uk.FibroApp.fy.doInBackground(Unknown Source)
at android.os.AsyncTask$2.call(AsyncTask.java:264)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:137)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
at java.lang.Thread.run(Thread.java:856)

您的问题之一可能是在模糊规则中指定了
Report\u Holder
, 但是排除的方法使用
SleepReport\u Holder

我使用这个规则 它位于ant proguard扩展中,但您可以轻松地将其转换为其他规则描述系统:

<keepclasseswithmembers name="co.uk.MyApp.pdf.MyData" access="public">
<method access="public static" type="void" name="pdfsleep" parameters="co.uk.MyApp.classes.SleepReport_Holder" />
</keepclasseswithmembers>

否则集合和泛型将不起作用

您的问题之一可能是在模糊规则中指定了
Report\u Holder
, 但是排除的方法使用
SleepReport\u Holder

我使用这个规则 它位于ant proguard扩展中,但您可以轻松地将其转换为其他规则描述系统:

<keepclasseswithmembers name="co.uk.MyApp.pdf.MyData" access="public">
<method access="public static" type="void" name="pdfsleep" parameters="co.uk.MyApp.classes.SleepReport_Holder" />
</keepclasseswithmembers>

否则集合和泛型将无法工作

您的代码通过反射访问方法。堆栈跟踪表明ProGuard已将其删除或重命名。因此,您应该保留它,其中的一行几乎是代码头的直接副本:

-keepclassmembers class co.uk.MyApp.pdf.MyData {
    public static void pdfsleep(co.uk.MyApp.classes.Report_Holder);
}
ProGuard识别Class.forName构造并已保留类MyData。为了更好地衡量,您可以确保ProGuard不会删除类报告\u持有者(如果类碰巧未使用,而不是作为参数类型):

注:

  • ProGuard文档解释了各种保留选项之间的差异。如果你不确定,就使用-保留。美国联邦法规。用法>

  • 您可能在控制台日志中看到一条警告,即必须使用其完全限定名指定报表持有者


您的代码通过反射访问方法。堆栈跟踪表明ProGuard已将其删除或重命名。因此,您应该保留它,其中的一行几乎是代码头的直接副本:

-keepclassmembers class co.uk.MyApp.pdf.MyData {
    public static void pdfsleep(co.uk.MyApp.classes.Report_Holder);
}
ProGuard识别Class.forName构造并已保留类MyData。为了更好地衡量,您可以确保ProGuard不会删除类报告\u持有者(如果类碰巧未使用,而不是作为参数类型):

注:

  • ProGuard文档解释了各种保留选项之间的差异。如果你不确定,就使用-保留。美国联邦法规。用法>

  • 您可能在控制台日志中看到一条警告,即必须使用其完全限定名指定报表持有者


    • 解决了

      我在ProGuard配置文件中添加了以下行:

      -keep class co.uk.FibroApp.pdf.SleepDataActivity
      -keep class co.uk.FibroApp.pdf.SleepMainActivity
      
      我添加了SleepDataActivity,因为该类保存了联系pdfsleep的异步任务

      我添加了SleepMainActivity,因为从技术上讲,SleepDataActivity是TabSwipe活动中的一个片段,而SleepMainActivity是这些选项卡的父级

      “pdfsleep”现在在mapping.txt中提到,并且所有操作都按预期进行

      我会接受Eric Lafortune的回答作为这个问题的答案,因为他对“-keepclassmembers”的语法不是我自己会知道的,也因为我在上一个问题中接受了AlexWien的答案,这让我进入了这个阶段


      谢谢你们两位,你们已经保存了我的发布日期

      解决了

      我在ProGuard配置文件中添加了以下行:

      -keep class co.uk.FibroApp.pdf.SleepDataActivity
      -keep class co.uk.FibroApp.pdf.SleepMainActivity
      
      我添加了SleepDataActivity,因为该类保存了联系pdfsleep的异步任务

      我添加了SleepMainActivity,因为从技术上讲,SleepDataActivity是TabSwipe活动中的一个片段,而SleepMainActivity是这些选项卡的父级

      “pdfsleep”现在在mapping.txt中提到,并且所有操作都按预期进行

      我会接受Eric Lafortune的回答作为这个问题的答案,因为他对“-keepclassmembers”的语法不是我自己会知道的,也因为我在上一个问题中接受了AlexWien的答案,这让我进入了这个阶段


      谢谢你们两位,你们已经保存了我的发布日期

      对不起,那是个打字错误,我已经改正了。我想我可能已经确定了导致错误的原因,但是我在修复它的语法方面遇到了问题。我已经更新了上面的问题。对不起,这是一个打字错误,我已经修正了。我想我可能已经确定了导致错误的原因,但是我在修复它的语法方面遇到了问题。我已经更新了上面的问题。这行仍然错误:SleepReport\u Holder paramsh=null;抱歉,我从错误的文件中复制了它-现在已经更新了它地图文件中的pdfsleep在哪里?你的代码在不模糊时工作吗?嗨。pdfsleep根本没有出现在mapping.txt中。这一行仍然错误:SleepReport\u Holder paramsh=null;抱歉,我从错误的文件中复制了它-现在已经更新了它地图文件中的pdfsleep在哪里?你的代码在不模糊时工作吗?嗨。pdfsleep根本没有出现在mapping.txt中。我非常希望它成为解决方案,但事实并非如此。我在我的问题中添加了一个“更新2”来详细说明我做了什么和发生了什么。我非常希望这是一个解决方案,但我没有
      -keep class co.uk.FibroApp.pdf.SleepDataActivity
      -keep class co.uk.FibroApp.pdf.SleepMainActivity