为啥 MonoDroid 找不到我的程序集?
Posted
技术标签:
【中文标题】为啥 MonoDroid 找不到我的程序集?【英文标题】:Why can't MonoDroid find my assemblies?为什么 MonoDroid 找不到我的程序集? 【发布时间】:2014-04-27 01:02:23 【问题描述】:我使用 Xamarin Studio 4.2.3 制作了一个简单的 android HelloWorld 应用程序,它除了在随机数大于 0.5 时打印出一些消息外,什么都不做。它在 Nexus 4 和 Nexus 5 上运行良好。
接下来我要做的是使用 7Zip 从应用程序的 apk(来自程序集文件夹)中提取带有代码的 .dll。使用 .Net Reflector 和 Reflexil 我正在修改一条指令,通常是由“if(rand.nextDouble()>0.5)doStuff()”中的 IF 语句生成的 brfalse.s,使其分支到指令就在对 doStuff() 的调用之前,从而有效地使 IF 语句无用并确保始终调用该方法。
接下来我将保存修补后的 .dll,将 .apk 中的原始文件替换为修补后的文件,对 .apk 进行签名和压缩对齐,最后使用 adb 安装它。
当我在手机上启动应用程序时,它直接崩溃,LogCat 显示以下内容:
03-20 10:12:08.709: I/ActivityManager(764): Start proc HelloMonoLVL.HelloMonoLVL for activity HelloMonoLVL.HelloMonoLVL/hellomonolvl.hellomonolvl.TrialSplashScreen: pid=23099 uid=10128 gids=50128
03-20 10:12:08.729: D/dalvikvm(23099): Trying to load lib /data/app-lib/HelloMonoLVL.HelloMonoLVL-1/libmonodroid.so 0x427154a0
03-20 10:12:08.729: D/dalvikvm(23099): Added shared lib /data/app-lib/HelloMonoLVL.HelloMonoLVL-1/libmonodroid.so 0x427154a0
03-20 10:12:08.739: W/libc(23099): WARNING: generic atexit() called from legacy shared library
03-20 10:12:08.759: W/monodroid-gc(23099): GREF GC Threshold: 46800
03-20 10:12:08.769: A/monodroid-assembly(23099): Coult not load assembly 'HelloMonoLVL' during startup registration.
03-20 10:12:08.769: A/monodroid-assembly(23099): This might be due to an invalid debug instalation.
03-20 10:12:08.769: A/monodroid-assembly(23099): A common cause is to 'adb install' the app directly instead of doing from the IDE.
03-20 10:12:08.789: I/ActivityManager(764): Process HelloMonoLVL.HelloMonoLVL (pid 23099) has died.
03-20 10:12:08.789: W/ActivityManager(764): Force removing ActivityRecord42752a50 u0 HelloMonoLVL.HelloMonoLVL/hellomonolvl.hellomonolvl.TrialSplashScreen t238: app died, no saved state
由于这不起作用,我使用了 LVL 的 C# 端口。构建 LVL 示例应用程序,部署并在手机上运行。我再次使用许可证验证码提取 .dll,使用 Reflexil 我更改了方法的代码,将修补的 .dll 注入 apk,对 apk 进行签名和压缩对齐。同样它不起作用,但在启动时崩溃,我现在得到:
03-20 10:21:19.049: D/dalvikvm(23507): Trying to load lib /data/app-lib/de.marius.lvl-1/libmonodroid.so 0x42711448
03-20 10:21:19.049: D/dalvikvm(23507): Added shared lib /data/app-lib/de.marius.lvl-1/libmonodroid.so 0x42711448
03-20 10:21:19.069: A/MonoDroid(23507): No assemblies found in '/data/data/de.marius.lvl/files/.__override__' or '/storage/emulated/0/Android/data/de.marius.lvl/files/.__override__'. Assuming this is part of Fast Deployment. Exiting...
03-20 10:21:19.079: I/ActivityManager(764): Process de.marius.lvl (pid 23507) has died.
03-20 10:21:19.079: W/ActivityManager(764): Force removing ActivityRecord42bc3c60 u0 de.marius.lvl/.TrialSplashScreen t239: app died, no saved state
如果我使用 Xamarin 在发布模式或调试模式下生成的 apk,这似乎没有任何区别。我尝试使用项目 bin 文件夹中的 apk 版本和我使用 adb pull 从手机中提取的版本。
我是 Xamarin 的新手,所以我的方法可能很幼稚。有没有像我修补的 .dll 没有通过的哈希检查?我看到 Reflexil 有一个删除 StrongNames 的选项,我试过了,但似乎没有任何区别(但我必须承认我真的不知道它们是如何工作的)。
有没有可能我正在尝试做的事情? 非常感谢任何帮助。
【问题讨论】:
我注意到使用块引用会弄乱 LogCat 输出。我似乎无法修复它。 要使文本块显示为pre
,您需要将其缩进4个空格。为防止代码高亮,请在开头添加<!-- language: lang-none -->
。
我在这个问题上花了几个小时。通过使用十六进制编辑器手动编辑 DLL 并对 UTF-16 字符串进行非常小的更改,我已经排除了反汇编程序的错误。下一步是对 libmonodroid.so 进行反汇编和搜索,因为它不是开源的。对于 x86 版本 (md5 e9788cfc7bbf0b5f5bef31a84604792c),错误字符串位于偏移量 0x15808 (.rodata),所以我希望我能弄清楚发生了什么。
【参考方案1】:
卸载项目中安装的所有包,包括 Android 支持库(如 Android.Support.v4 支持库)并清理解决方案。
然后再次重新安装所有必需的软件包和支持库并重新构建您的解决方案。它可以帮助您整理查询。
【讨论】:
以上是关于为啥 MonoDroid 找不到我的程序集?的主要内容,如果未能解决你的问题,请参考以下文章