Я сделал простое приложение Android HelloWorld с помощью Xamarin Studio 4.2.3, которое ничего не делает, кроме того, что оно выводит какое-либо сообщение, если случайное число больше 0,5. Он отлично работает на Nexus 4 и Nexus 5.
Следующее, что я делаю, - извлечь .dll с кодом из app apk (из папки сборок) с помощью 7Zip. Использование .Net Reflector и Reflexil. Я изменяю одну команду, обычно команду brfalse.s, которая генерируется оператором IF в "if (rand.nextDouble() > 0.5) {doStuff()}", так что она переходит в прямо перед вызовом doStuff(), тем самым эффективно делая утверждение IF бесполезным и гарантируя, что метод всегда вызывается.
Далее я сохраняю исправленную .dll, заменяя исходную в .apk исправленной, подпишите и zipalign.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 ActivityRecord{42752a50 u0 HelloMonoLVL.HelloMonoLVL/hellomonolvl.hellomonolvl.TrialSplashScreen t238}: app died, no saved state
Поскольку это не сработало, я использовал порт С# для LVL. Создал приложение для образца LVL, развернуто и работает на телефонах. Я снова извлек .dll с кодом проверки лицензии, используя Reflexil. Я изменил код метода, ввел исправленную .dll в apk, подписал и zipaligned 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 ActivityRecord{42bc3c60 u0 de.marius.lvl/.TrialSplashScreen t239}: app died, no saved state
Кажется, не имеет никакого значения, если я использую apk, который Xamarin генерирует в режиме Release или Debug. Я попытался использовать версии apk из папки bin проекта и те, которые я вытащил из телефона с помощью adb pull.
Я новичок в Xamarin, поэтому мой подход наивен. Есть ли что-то вроде хэш-проверки, что мои исправленные DLL файлы не проходят? Я видел, что у Reflexil есть возможность удалить StrongNames, я пробовал это, но это, казалось, не имело никакого значения (но я должен признать, что я действительно не знаю, как это работает).
Возможно ли, что я пытаюсь сделать? Любая помощь очень ценится.