【问题标题】:Android - dx trouble processing - Ill-advised or mistaken usage of a core class 2012, Android 4 updateAndroid - dx 故障处理 - 不明智或错误地使用核心类 2012,Android 4 更新
【发布时间】:2012-09-15 16:58:34
【问题描述】:

当我在尝试构建我的应用程序时收到“不明智或错误地使用核心类”错误时,我搜索了 Stackoverflow,并按照一些建议使用了 ant 和 jarjar 来构建应用程序。

ant 构建在 dx 步骤失败,错误报告如下。

我在网上搜索了有关如何修复“无法强制”错误(见下文)的建议,但没有发现任何帮助。

请注意,ant 构建中的 jarjar 步骤似乎有效。当我检查 bin/repackagedclasses.jar 中 java 目录的内容时,它们是空的,所有内容都转移到等效的重命名目录 (/java)。

还请注意,我遵循的建议(使用 ant 和 jarjar)已有两年多的历史并适用于 android 2.x。有可能(可能?)使用 android 4 和相关的基础设施,它们将无法工作,只是猜测。

最后一点。我在 sdk/platform-tools 中更改了 dx 如下:

exec java $javaOpts -jar "$jarpath" "$@"
exec java $javaOpts -jar "$jarpath" --core-library "$@"

无论有没有上述更改,对 ant 构建或 Eclipse 构建都没有影响。

-dex:
      [dex] Converting compiled files and external libraries into /home/adonnini/workspace3/CommManagerN6/bin/classes.dex...
       [dx] 
       [dx] UNEXPECTED TOP-LEVEL EXCEPTION:
       [dx] com.android.dx.util.ExceptionWithContext: can't coerce string{"android.permission.ACCESS_CACHE_FILESYSTEM"} to Lcommmanager/java/lang/String;
       [dx]     at com.android.dx.util.ExceptionWithContext.withContext(ExceptionWithContext.java:46)
       [dx]     at com.android.dx.dex.cf.CfTranslator.processFields(CfTranslator.java:176)
       [dx]     at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:133)
       [dx]     at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:87)
       [dx]     at com.android.dx.command.dexer.Main.processClass(Main.java:483)
       [dx]     at com.android.dx.command.dexer.Main.processFileBytes(Main.java:455)
       [dx]     at com.android.dx.command.dexer.Main.access$400(Main.java:67)
       [dx]     at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:394)
       [dx]     at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
       [dx]     at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:131)
       [dx]     at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:109)
       [dx]     at com.android.dx.command.dexer.Main.processOne(Main.java:418)
       [dx]     at com.android.dx.command.dexer.Main.processAllFiles(Main.java:329)
       [dx]     at com.android.dx.command.dexer.Main.run(Main.java:206)
       [dx]     at com.android.dx.command.dexer.Main.main(Main.java:174)
       [dx]     at com.android.dx.command.Main.main(Main.java:91)
       [dx] Caused by: java.lang.UnsupportedOperationException: can't coerce string{"android.permission.ACCESS_CACHE_FILESYSTEM"} to Lcommmanager/java/lang/String;
       [dx]     at com.android.dx.dex.cf.CfTranslator.coerceConstant(CfTranslator.java:210)
       [dx]     at com.android.dx.dex.cf.CfTranslator.processFields(CfTranslator.java:160)
       [dx]     ... 14 more
       [dx] ...while processing ACCESS_CACHE_FILESYSTEM Lcommmanager/java/lang/String;
       [dx] ...while processing android/commmanager/Manifest$permission.class
       [dx] 
       [dx] 1 error; aborting

BUILD FAILED
/home/adonnini/workspace3/CommManagerN6/build.xml:964: The following error occurred while executing this line:
/home/adonnini/workspace3/CommManagerN6/build.xml:376: null returned: 1

【问题讨论】:

    标签: android ant dalvik dex


    【解决方案1】:

    您没有说明您传递给jarjar 的参数,但从外观上看,您可能已经告诉它更改对java.lang 中类的所有引用,改为位于您的包命名空间中。如果你这样做了,那肯定行不通,而且你得到的错误只是冰山一角。

    这里是错误的粗略翻译:某些代码被声明为采用 commmanager.java.lang.String 类的实例,但它被传递了 java.lang.String 的实例(即,任何普通字符串常量所在的类的一个实例)。这两个类之间没有继承关系,因此代码无效。

    至少,您可能希望让您的 jarjar 调用更具体地说明它正在处理的类名。

    【讨论】:

    • 你好 danfuzz,很抱歉没有包括我的 build.xml。相关的jarjar参数是
    • 你好 danfuzz。你的猜测是正确的。我试图遵循错误消息中的建议“......您拥有的最简单安全的替代方法是重新打包该代码。也就是说,将有问题的类移动到您自己的包命名空间中。这意味着它们永远不会发生冲突带有核心系统类。JarJar 是一个可以帮助您完成这项工作的工具……”。如您所见,它不起作用。我正在运行一个实验,我需要在我的包中包含 java.lang 类。有什么想法吗?
    • 有什么想法吗?好吧,您知道该错误消息如何显示“……不建议……”我很确定您在那个领域。 :)
    猜你喜欢
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2013-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多