Я использую dexlib2 для программного инструментария некоторых методов в файле dex, например, если я нахожу такие инструкции:
invoke-virtual {v8, v9, v10}, Ljava/lang/Class;->getMethod(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;
Я хотел бы вставить инструкцию перед ней, и поэтому во время выполнения я могу знать точные аргументы Class.getMethod().
Однако теперь я столкнулся с некоторыми вопросами о том, как выделить регистры для использования в моей вставленной инструкции мониторинга?
Я знаю два способа, но в любом из них есть свои проблемы:
Я могу использовать DexRewriter для увеличения числа регистров этого метода (например, с .register 6 до .register 9), чтобы можно было использовать дополнительные (3) регистра. Но сначала это ограничено 16 регистрами; во-вторых, когда я увеличиваю registerCount, параметры будут переданы последним, и поэтому мне приходится переписывать все инструкции в этом методе, использующие параметры, что утомительно.
Или я могу повторно использовать регистры. Таким образом, я должен анализировать живучесть каждого регистра, в то время как dexlib2, похоже, не имеет существующего API для построения CFG и цепочки def-use, что означает, что я должен написать его сам. Кроме того, я сомневаюсь, что таким образом я смогу получить достаточно доступных регистров.
Я правильно понимаю эту проблему? существуют ли какие-либо существующие инструменты/алгоритмы для этого? Или какой-нибудь совет, что я могу сделать это лучше?
Спасибо.