Проблемы AOT-компиляции
AOT-компиляция преобразует Java-код в нативный код, значительно повышая скорость выполнения Java-программ. Она косвенно достигает цели защиты Java-кода путём его преобразования в машинный код.
Для Java-программ, особенно основанных на различных фреймворках, AOT-компиляция представляет серьёзную проблему из-за наличия множества динамических функций. В то же время, для компромисса с динамичностью, скомпилированный бинарный файл может по-прежнему содержать большой объём информации о файлах классов. В следующей статье представлен проект, который сканирует скомпилированные бинарные файлы для получения информации о классах. https://protector4j.com/ru/articles/extract-java-classes-information-from-aot/
Даже если бинарная программа не содержит информации о файлах классов, её логика выполнения сохраняется в том же виде. Единственное отличие в том, что представление изменилось с байт-кода на машинный код, без какой-либо специальной защиты. Если кто-то понимает механизм компиляции и выполнения, он по-прежнему может восстановить читаемый код методами обратной разработки. Следующая статья описывает такой проект. https://protector4j.com/ru/articles/graalvm-nativeimage-reverse-engineering/
Заключение
Настройка AOT-компиляции сложна, трудоёмкость компиляции высока, а вероятность сбоя компиляции велика. Даже в случае успешной компиляции логика кода лишь меняется с представления байт-кода на представление машинного кода. Его внутренняя операционная логика сохраняется без какой-либо специальной защиты. Если кто-то понимает собственный механизм компиляции и выполнения, он по-прежнему может восстановить читаемый код методами обратной разработки.