Как получить исходный код из апк?
apk:smali -> java opcodes -> java decompiler == некоторый профитnative -> assembler == тупикресурсы
но если вопрос уже на этапе "как это распаковать", то всё тлен и тупик.
Байт-код DEX (Java) отлично дизассемблируется с помощью apktool (backsmali), полученный ассемблер smali на 100% соответствует байт-коду, поэтому можно внести изменения, собрать обратно и будет работать, большинство приложений написаны только на Java, также apktool извлекает ресурсы, манифест, XML и т.д.
Для упрощения анализа или если нужен именно код на Java используются разные декомпиляторы, но они далеко не идеальны, поэтому если надо собрать, то придется кучу ошибок исправить и долго отлаживать, лучше несколько разных декомпиляторов применить, для полноты картины проблемных методов.
Если приложение имеет библиотеки NDK (lib***.so), скомпилированный в машинный код, то используйте IDA Pro и toolchain из Android NDK, дизассемблирование и декомпиляция (Hex-Rays в IDA Pro) точно возможны, отладка без исходников тоже, вот сохранять изменения мне пока не приходилось, но и в этом помогут IDA Pro и утилиты из того же toolchain, во всяком случае они облегчат задачу даже если редактировать будете HEX-редактором, например они выдадут вам смещения (адреса) функций в файле, и вообще весь этот GNU toolchain (чья Windows-реализация известна также как MinGW_, помимо того что компилирует, еще и предоставляет нехилый функционал для дизассемблированния того, что компилирует :)