Ответ 1
Я анализировал Xiaomi Redmi Note 3, который позволяет использовать приложения с несколькими экземплярами для WhatsApp. То, что он делает, довольно просто, он создает другой профиль пользователя в рамках, чтобы различать их.
u0_a171 1832 631 1094576 91608 SyS_epoll_ 0000000000 S com.whatsapp
u999_a171 8571 631 1037396 65024 SyS_epoll_ 0000000000 S com.whatsapp
Параллельное пространство делало что-то еще более интересное. Прежде чем углубляться в детали, давайте проанализируем вывод ps
u0_a45 2915 249 1120668 61264 SyS_epoll_ b6ca7010 S com.lbe.parallel.intl
u0_a45 6876 249 1081464 40588 SyS_epoll_ b6ca7010 S com.google.android.gms.persistent
u0_a45 6945 249 995016 19828 SyS_epoll_ b6ca7010 S com.google.process.gapps
u0_a45 11296 1 1220488 22760 futex_wait b6c7a8b0 S com.google.android.gms
u0_a45 12303 249 1064788 59680 SyS_epoll_ b6ca7010 S com.freecharge.android
u0_a100 12786 249 699476 45096 jbd2_log_w b6ca6fe8 D com.freecharge.android
Здесь я использовал Parallel Space для создания другой учетной записи для FreeCharge. Таким образом, в основном, если мы наблюдаем последние два процесса, один из них размещается в параллельном идентификаторе процесса, а другое приложение в своем собственном идентификаторе процесса.
Обратное проектирование Parallel Space с использованием apktool
и dex2jar
к следующим результатам.
Parallel Space объявляет 100 прокси-операций, 100 прокси-сервисов и 100 прокси-провайдеров. Они используются для размещения приложения, которое должно быть клонировано. Следовательно, клонированное приложение будет находиться в том же пространстве процессов, что и Parallel Space. Также у него были заглушки для Android Framework от ActivityManager, ServiceManager, AccountManager, LocationManager и многих других. По сути, когда приложение компилируется, оно создает те же классы, что и в framework.jar, который поставляется с устройствами Android. Используя эту заглушку Proxy и отражение Java, она создает и размещает приложение в своем собственном пространстве процессов. Для этого он просто перехватывает вызовы Activity Manager и собирает новую информацию, которая затем пересылается в платформу.
Он также создает новую структуру каталогов для хранения информации о приложении в своей папке /data/data/для размещения клонированных данных приложения.
Детали огромны, разработчик Parallel Space использовал обширные знания из исходного кода AOSP, чтобы усилить поведение, а также усилил использование классов Java с помощью Reflection и Proxies.
Обновить:
Только что нашел версию с открытым исходным кодом Parallel space на GitHub. Это работает точно по тем же принципам. Ссылка ниже.