【问题标题】:Can a library I use in my Android app .apk collide with that library used in another app?我在我的 Android 应用程序 .apk 中使用的库会与在另一个应用程序中使用的库发生冲突吗?
【发布时间】:2011-02-08 20:41:06
【问题描述】:

我将 jets3t 链接到一个测试应用程序并获得了我在安装过程中还没有看到的 logcat ..

02-08 12:21:11.825: DEBUG/PackageParser(1086): Scanning package: /data/app/vmdl28891.tmp
02-08 12:21:12.059: DEBUG/PackageManager(1086): Scanning package org.jets3t
02-08 12:21:12.075: INFO/PackageManager(1086): /data/app/org.jets3t-1.apk changed; unpacking
02-08 12:21:12.082: DEBUG/installd(1009): DexInv: --- BEGIN '/data/app/org.jets3t-1.apk' ---
02-08 12:21:12.481: DEBUG/dalvikvm(26867): creating instr width table
02-08 12:21:12.715: DEBUG/dalvikvm(26867): DexOpt: 'Lorg/apache/commons/codec/Decoder;' has an earlier definition; blocking out
02-08 12:21:12.715: DEBUG/dalvikvm(26867): DexOpt: 'Lorg/apache/commons/codec/BinaryDecoder;' has an earlier definition; blocking out
02-08 12:21:12.715: DEBUG/dalvikvm(26867): DexOpt: 'Lorg/apache/commons/codec/Encoder;' has an earlier definition; blocking out
02-08 12:21:12.715: DEBUG/dalvikvm(26867): DexOpt: 'Lorg/apache/commons/codec/BinaryEncoder;' has an earlier definition; blocking out
... many more ...
'Lorg/apache/commons/logging/impl/WeakHashtable$Entry;': multiple definitions
02-08 12:21:12.973: DEBUG/dalvikvm(26867): DexOpt: not verifying 'Lorg/apache/commons/logging/impl/WeakHashtable$Referenced;': multiple definitions
02-08 12:21:12.973: DEBUG/dalvikvm(26867): DexOpt: not verifying 'Lorg/apache/commons/logging/impl/WeakHashtable$WeakKey;': multiple definitions
02-08 12:21:12.973: DEBUG/dalvikvm(26867): DexOpt: not verifying 'Lorg/apache/commons/logging/impl/WeakHashtable;': multiple definitions
02-08 12:21:13.168: INFO/dalvikvm(26867): DexOpt: not resolving ambiguous class 'Lorg/apache/commons/logging/LogFactory;'
... many more ...
02-08 12:21:13.364: INFO/dalvikvm(26867): DexOpt: not resolving ambiguous class 'Lorg/apache/commons/logging/LogFactory;'
02-08 12:21:13.387: DEBUG/libgps(1086): GpsInterface_inject_location( 37.378289, -122.059655, 897.000 )
02-08 12:21:13.387: DEBUG/dalvikvm(26867): DexOpt: load 111ms, verify 540ms, opt 21ms
02-08 12:21:13.543: DEBUG/installd(1009): DexInv: --- END '/data/app/org.jets3t-1.apk' (success) ---
02-08 12:21:13.551: INFO/ActivityManager(1086): Force stopping package org.jets3t uid=10084
02-08 12:21:13.559: DEBUG/PackageManager(1086):   Activities: org.jets3t.MainActivity
02-08 12:21:13.832: INFO/installd(1009): move /data/dalvik-cache/data@app@org.jets3t-1.apk@classes.dex -> /data/dalvik-cache/data@app@org.jets3t-1.apk@classes.dex
02-08 12:21:13.832: DEBUG/PackageManager(1086): New package installed in /data/app/org.jets3t-1.apk

我正在阅读它作为共享库覆盖。如果是,我想知道这是否是我做错了什么的结果?如果我覆盖,其他应用程序崩溃的可能性有多大?当然,任何正确创建的库都将向后兼容.. 我猜 Android 包管理器不会用旧变体替换包?

加上“多重定义”? “不解决模棱两可的类”?

哦,是的.. 到目前为止,测试应用似乎运行良好 :)

谢谢。我想我需要阅读 pkg 安装、加载和链接 lol。

【问题讨论】:

  • 有人推荐在哪里阅读 pkg 安装、加载和链接? JetS3t 要求我包含它提供的 commons-codec、commons-httpclient、commons-logging 和 log4j jar。存根?为什么?

标签: android installation apk


【解决方案1】:

我认为,您真正损坏安全设备上的另一个应用程序的唯一方法是更换它所依赖的 .apk。

在我看来,您更像是在安装一个 .apk,其中包含与该设备的平台库中的一些重复的类。新的重复项将被忽略。这并不少见,因为平台中有各种极具吸引力的“私有”功能,它们在 sdk 中没有“标题”(抱歉,术语错误,但传达了这个想法)。这使得在不包括存根以满足编译器(或使用反射在运行时查找真实类)的情况下很难编写。在安装时,这些存根会被忽略并显示警告消息。

这不一定是好的做法,但只要设备上的私有功能继续按预期工作,它就会正常工作 - 即,它可能会在操作系统升级或程序安装在不同设备上时中断.出于这个原因,Android 人员非常坚持告诉您不要使用私有功能。

尽管它们仍然有效,但仍保留在交付代码中的错误/警告消息也不是很好的做法,不幸的是,它确实是 android 堆栈本身特有的东西。

【讨论】:

  • 谢谢克里斯!但我显然需要更多地了解这个空间。 jets3t 包包括众所周知的 jar,例如 log4j,我希望它已经可用并且几乎在任何地方都可见。为什么包会包含并指定使用此类 jar?
  • 它可能需要未在 sdk 中公开的内部/附加部分
  • 任何对此感兴趣的人可能会发现 netmite.com/android/mydroid/dalvik/docs/dexopt.html 很有用... ack,鉴于代码有效,我想我现在不能花更多时间在这上面。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
相关资源
最近更新 更多