Proguard与应用程序内购买“重复zip输入”错误

时间:2013-12-02 11:07:13

标签: android in-app-purchase proguard in-app-billing

我正在使用包含文件的In app billing(按照developer.android.com的步骤) InAppBillingService.aidl

正如此处所建议的那样 - > http://developer.android.com/google/play/billing/billing_best_practices.html 出于安全原因,我们需要使用Progaurd对代码进行模糊处理。

现在导出已启用proguard的签名apk会给我以下错误。

重复的zip条目[android_6861407322325970495.jar:com / android / vending / billing / IInAppBillingService $ Stub $ Proxy.class]

任何想法/建议将不胜感激。 感谢

更新 以下是完整的跟踪。

java.io.IOException: Can't write [C:\Users\<Name>\AppData\Local\Temp\android_2083818169284424504.jar] (Can't read [C:\Users\<Name>\AppData\Local\Temp\android_6558830429113811056.jar] (Duplicate zip entry [android_6558830429113811056.jar:com/android/vending/billing/IInAppBillingService$Stub$Proxy.class]))
at proguard.OutputWriter.writeOutput(OutputWriter.java:264)
at proguard.OutputWriter.execute(OutputWriter.java:160)
at proguard.ProGuard.writeOutput(ProGuard.java:372)
at proguard.ProGuard.execute(ProGuard.java:153)
at proguard.ProGuard.main(ProGuard.java:492)
Caused by: java.io.IOException: Can't read [C:\Users\<Name>\AppData\Local\Temp\android_6558830429113811056.jar] (Duplicate zip entry [android_6558830429113811056.jar:com/android/vending/billing/IInAppBillingService$Stub$Proxy.class])
at proguard.InputReader.readInput(InputReader.java:230)
at proguard.InputReader.readInput(InputReader.java:200)
at proguard.OutputWriter.writeOutput(OutputWriter.java:253)
... 4 more
Caused by: java.io.IOException: Duplicate zip entry [android_6558830429113811056.jar:com/android/vending/billing/IInAppBillingService$Stub$Proxy.class]
at proguard.io.JarWriter.getOutputStream(JarWriter.java:139)
at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:105)
at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:92)
at proguard.io.ClassRewriter.read(ClassRewriter.java:68)
at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
at proguard.io.JarReader.read(JarReader.java:65)
at proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65)
at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53)
at proguard.InputReader.readInput(InputReader.java:226)
... 6 more

4 个答案:

答案 0 :(得分:2)

也许这有助于你,

根据ProGuard文档:

  

警告:无法写入资源...重复的zip条目       您的输入jar包含多个具有相同名称的资源文件。 ProGuard继续像往常一样复制资源文件,跳过   任何以前使用名称的文件。再一次,警告可能是一个   虽然有一些问题的指示,所以建议删除   重复。一种方便的方法是在上面指定过滤器   输入罐子。没有选项可以关闭这些警告。

您的库jar中有一个重复的资源条目“IInAppBillingService $ Stub $ Proxy.class”android_6558830429113811056.jar

您可以尝试使用-outjars

  

-outjars class_path       指定输出jar(或战争,耳朵,拉链或目录)的名称。前面-injars选项的已处理输入   将被写入指定的罐子里。这允许你收集   输入jar组的内容分为相应的输出组   罐子。此外,可以过滤输出条目,如中所述   过滤器部分。每个已处理的类文件或资源文件都是   然后写入带有匹配过滤器的第一个输出条目   输出罐组。

     

您必须避免让输出文件覆盖任何输入文件。为了更好的   可读性,可以使用多个-outjars选项指定类路径条目。   如果没有任何-outjars选项,则不会写入任何罐子。

或者如果您使用的是-injars,则可以配置filter

答案 1 :(得分:0)

很可能确实存在重复的条目。可能某些库既可作为依赖项,也可作为子目录中的副本。即使没有proguard,错误也可能显示出来。

应该有中间的apk-s,你可能会试着看看最新的apk里面有什么。

我还建议尝试从命令行构建。 (OTOH,我最后一次尝试,我遇到了非信息性的错误,类似“null返回1”,也就是说,来自无人的非零错误代码知道什么组件,日志中有更多信息。 )

您也可以尝试手动删除错误消息(在窗口中选择它们(仅限叶子,而不是它们的根)并按“Del”),清理项目并重新构建它。

答案 2 :(得分:0)

如果您的ProGuard配置中有-injars bin/classes,请尝试将其删除。

答案 3 :(得分:0)

您是否尝试使用-verbose选项运行proguard?您可能能够确切地看到正在添加重复库的内容(以及何时)。