Как редактировать framework jar

Обновлено: 06.07.2024

Редактирование файла класса из файла JAR также может быть вызвано исправлением исполняемого файла Java (файлов Jar) без знания исходного кода. Давайте посмотрим, как отредактировать файл класса из файла JAR, используя простой способ исправления исполняемого файла Java.

Методы (метод 1 игнорируется для объяснения в этой статье, поскольку он является обычным)

  1. Декомпилируйте файл JAR> Импортируйте декомпилированные классы в IDE (Eclipse, NetBeans и т. д.)> Измените исходный код> Перекомпилировать> Перестроить/перепаковать как JAR
  2. Извлечь классы Java из JAR> Изменить байт-код Java> Проверить> Повторно упаковать файл JAR
  3. Извлечь Java классы из исполняемого файла> Изменить байт-код Java> Обновить исполняемый файл с помощью измененных классов/файлов с помощью командной строки

Первый метод, упомянутый выше, является хорошим вариантом, если у вас есть исходный код кода и знаком с компиляцией Java, концепциями объектно-ориентированного программирования, но имеет несколько упомянутых ниже сложностей

  1. Целевой файл JAR имеет зависимости от других библиотек. Вы должны быть знакомы с этими зависимостями в своем проекте.
  2. Процесс декомпиляции не является точной наукой, поэтому ожидайте исправления ошибок, прежде чем заставлять его перекомпилировать

Таким образом, метод (1) не является обязательным для использования, давайте также рассмотрим метод (2). Метод (2) быстрее, менее подвержен ошибкам и довольно прост в исполнении.

Метод 2 (извлечение классов Java из исполняемого файла> Изменение байт-кода Java> Обновление исполняемого файла с помощью измененных классов/файлов с помощью команды подсказка)

Шаги высокого уровня:

  1. Настройка среды
  2. Используйте JD-GUI, чтобы заглянуть в Файл JAR
  3. Распакуйте файл JAR
  4. Измените файл .class с помощью редактора байт-кода Java.
  5. Повторно упакуйте измененные классы в новый архив файл
  6. Проверьте его с помощью JD-GUI

1. Настройте среду

Убедитесь, что у вас установлен JDK и путь к классам настроен правильно, для проверки -> Открыть командную строку

На моем компьютере результат выглядит примерно так:

2. Используйте JD-GUI для просмотра файла JAR

Я предпочитаю JD-GUI для просмотра файла JAR, вы можете установить JD-GUI по ссылке ниже,

Просматривая файл JAR в нашем примере, мы могли видеть ниже класс в JD-GUI,


3. Распакуйте файл JAR

Создайте новую папку и скопируйте файл JAR в папку. Использование приведенной ниже команды распакует файл jar в папке.

4. Измените. class с помощью редактора байт-кода Java

Я предпочитаю редактор байт-кода Java редактировать файл .class. Редактор байт-кода Java можно загрузить по ссылке ниже,


5. Повторно упакуйте измененные классы в новый архивный файл

Перейдите в папку HelloWorld и введите следующую команду в командной строке CMD, чтобы перепаковать файл JAR.

6. Проверьте это с помощью JD-GUI

Теперь вы знаете, как просматривать JAR-файл с помощью JD-GUI. Откройте только что созданный файл HelloWorld-Custom.jar и проверьте файл класса на предмет модификации.

Теперь давайте посмотрим на метод (3), который я предпочитаю,

Метод 3 (Извлечь классы Java из исполняемого файла> Изменить байт-код Java> Обновить исполняемый файл с помощью измененных классов/файлов с помощью командной строки)

В этом методе только шаг 5 зависит от метода (2).

Шаги высокого уровня:

  1. Настройка среды
  2. Используйте JD-GUI, чтобы заглянуть в файл JAR
  3. Распакуйте файл JAR.
  4. Измените файл .class с помощью редактора байт-кода Java.
  5. Обновите измененные классы в существующем файле JAR
  6. Проверьте это с помощью JD-GUI

Выполните все, как в методе (2), за исключением шага 5. После завершения шага 4

5. Обновите измененные классы в существующем файле JAR

Используя следующую команду в командной строке, обновленный файл .class можно заменить существующим файлом JAR. Теперь перейдите в папку, в которой доступен JAR-файл в командной строке, и введите следующую команду.

Любые файлы, уже находящиеся в архиве, имеющие то же имя пути, что и добавляемый файл, будут перезаписаны.

Теперь файл Jar будет обновлен новым файлом класса. Для получения подробной информации об обновлении файла jar вы можете обратиться к ссылке ниже:

Заключение

Кто-нибудь знает шаги для замены frameworks.jar и соответствующих библиотек на устройстве Android Marshmallow?

Моя работа заключается в том, чтобы изменить исходный код фреймворка Android Marshmallow, выполнить полную сборку, затем обновить устройство, а затем проверить результат. Это занимает около 1,2 часа каждый раз.

Это нормально, если я делаю это 1,2,3 раза, но на самом деле мне пришлось повторять его даже 100 раз, если моя модификация не работает. Но я только модифицирую только небольшой фрагмент кода в фреймворках /, поэтому я думаю, что это сэкономит мне много времени, если я смогу перестроить только фреймворки/модуль в коде Android и заменить только фреймворки/часть на устройстве.

Я знаю, как использовать mmm для восстановления только фреймворков/модулей. Но я не знаю, как заменить фреймворки/часть на устройстве, потому что просто замените frameworks.jar не работает в случае Marshmallow.

Предполагая, что вы изменяете вещи под frameworks/base/ , откуда он приходит framework.jar , шаги, которые я использую:

Если у вас уже есть полная сборка, используйте команду mm в каталоге, в котором вы изменяете какой-либо код. Это быстрее, чем mmm , поскольку он еще не компилирует зависимостей структуры.

Перейдите в каталог <aosp-root>/out/target/product/<product-name>/system/framework/ и получите элементы framework.jar и services.jar .

Перейдите в каталог <aosp-root>/out/target/product/<product-name>/system/lib/ и получите любой файл libandroid*.so .

С уже установленным устройством adb push *.jar /system/framework/.

adb push *.so /system/lib/.

Factory reset устройство и перезагрузите его.

Изменения, внесенные в вашу структуру, могут теперь работать. Если ваше целевое устройство - 64 бита, замените lib на lib64 на указанные выше адресаты.

Объяснение

Вышеуказанные шаги будут меняться в зависимости от того, что мы модифицируем в рамках AOSP. Вот краткое описание того, что входит в каждый файл:

  • framework.jar : API, доступные для приложений
  • services.jar : Реализация менеджеров и системных служб, расположенных в frameworks/base/services .
  • libandroid*.so : Библиотеки, созданные из собственного кода (C/С++), такие как .cpp файлы, расположенные в frameworks/base/core/jni .

Но, как правило, каждый Android.mk внутри фреймворков будет генерировать хотя бы один вывод, названный переменной LOCAL_MODULE , а тип модуля зависит от следующей инструкции include:

Например, папка frameworks/base/cmds генерирует библиотеку Java и исполняемый файл для каждого элемента внутри него, например команду pm обычно используется для установки приложений через ADB. В любом случае это правило: библиотеки Java переходят к /system/framework/ , общие библиотеки идут в /system/lib/ , а исполняемые файлы идут в /system/bin .

Предупреждение

Необходимое ПО

  • Установленный и настроенный Android SDK (требуется adb.exe); ;
  • Архиватор типа WinRAR или 7-Zip;
  • Текстовый редактор;
  • Утилита Smali/Baksmali Manager (зеркало)

Инструкция

Получение системного файла framework.jar

Подключите ваш телефон к компьютеру в режиме USB Debugging и убедитесь, что он распознается системой при помощи команды adb devices в командной строке.

Для копирования файла framework.jar из внутренней памяти телефона в текущий каталог командной строки наберите:

Распаковка и модификация файла framework.jar

Прежде, чем изменять полученный файл framework.jar, неплохой идеей будет сделать его бэкап на случай, если что-то пойдет не так.

После этого откройте каталог, в который вы распаковали smali/baksmali, перенесите в него полученный на предыдущем шаге файл и запустите файл baksmali Manager.bat.

Нажмите 4 (select file to work), затем аналогично цифрой выберите framework.jar.

Нажмите 1 (baksmali) для распаковки выбранного файла.

Запустите поиск по следующей строке:
Landroid/media/AudioService;->MAX_STREAM_VOLUME:[I
При этом вы должны увидеть нечто подобное:


Строкой выше найденного ищем идентификатор массива, содержащего искомое число уровней громкости. В нашем примере это array_19c. Теперь запускаем поиск по найденному идентификатору, и должны найти таблицу:


Запаковка framework.jar и загрузка его в память телефона

Возвращаемся в smali manager и нажимаем цифру 2 (smali) для запаковки файлов обратно в понятную для Android структуру.

В процессе данной операции будет создан файл classes.dex. Данный файл необходимо поместить внутри архива framework.jar. Для этого открываем последний с помощью любого подходящего архиватора, после чего просто перетаскиваем classes.dex в открывшееся окошко.

Теперь осталось лишь загрузить измененный файл framework.jar обратно в память аппарата. Раздел /system, где хранился данный файл, по умолчанию смонтирован в системе Android в режиме только чтения (read-only), поэтому для начала потребуется перемонтировать его с правами записи:

Затем для непосредственного копирования набираем:

После того, как файл окажется успешно загружен, следует убедиться, что на него оказались выставлены корректные права доступа. Используем следующий набор команд:

Можно убедиться, что напротив файла framework.jar отображается набор разрешений -rw-r--r-- при помощи команды:

Затем необходимо перезагрузить устройство, чтобы изменения вступили в силу. Для этого можно воспользоваться командой adb reboot.

Если вы все сделали правильно, то после успешной перезагрузки в вашем аппарате будет уже 30 различных градаций уровня громкости.

Обычно удобно объединять множество файлов классов Java в один архивный файл.

В этом уроке мы рассмотрим все тонкости работы с jar – или J ava AR chive – файлами на Java.

В частности, мы возьмем простое приложение и рассмотрим различные способы его упаковки и запуска в виде jar. Мы также ответим на некоторые любопытные вопросы, такие как как легко прочитать файл манифеста jar по пути.

2. Настройка программы Java

Прежде чем мы сможем создать запускаемый jar-файл, наше приложение должно иметь класс с основным методом . Этот класс обеспечивает нашу точку входа в приложение:

3. Команда Jar

Теперь, когда мы все настроили, давайте скомпилируем наш код и создадим наш jar-файл.

Мы можем сделать это с помощью javac из командной строки:

Команда javac создает JarExample.class в каталоге com/baeldung/jar . Теперь мы можем упаковать это в файл jar.

3.1. Использование параметров по умолчанию

Чтобы создать файл jar, мы будем использовать кувшин команда.

Чтобы использовать команду jar для создания файла jar, нам нужно использовать опцию c , чтобы указать, что мы создаем файл, и опцию f , чтобы указать файл:

3.2. Установка основного класса

Полезно, чтобы манифест файла jar включал основной класс.

Манифест-это специальный файл в банке, расположенный в каталоге META-INF и названный MANIFEST.MF . Файл манифеста содержит специальную метаинформацию о файлах в файле jar.

Некоторые примеры того, для чего мы можем использовать файл манифеста, включают установку точки входа, установку информации о версии и настройку пути к классу.

Используя опцию e , мы можем указать нашу точку входа, и команда jar добавит ее в сгенерированный файл манифеста.

Давайте запустим jar с указанной точкой входа:

3.3. Обновление содержания

Допустим, мы внесли изменения в один из наших классов и перекомпилировали его. Теперь нам нужно обновить наш jar-файл.

Давайте используем команду jar с параметром u для обновления ее содержимого:

3.4. Настройка файла манифеста

В некоторых случаях нам может потребоваться больше контроля над тем, что входит в наш файл манифеста. Команда jar предоставляет функциональные возможности для предоставления нашей собственной информации о манифесте.

Давайте добавим частичный файл манифеста с именем example_manifest.txt чтобы ваше приложение установило нашу точку входа:

Информация о манифесте, которую мы предоставляем, будет добавлена к тому, что генерирует команда jar, так что это единственная строка, которая нам нужна в файле.

Важно, чтобы мы заканчивали наш файл манифеста символом |/newline . Без новой строки наш файл манифеста будет молча проигнорирован.

С этой настройкой давайте снова создадим нашу банку, используя нашу информацию о манифесте и опцию m :

3.5. Подробный Вывод

Если нам нужна дополнительная информация из команды jar , мы можем просто добавить опцию v для verbose.

Давайте запустим нашу команду jar с параметром v :

4. Использование Maven

4.1. Конфигурация по Умолчанию

Мы также можем использовать Maven для создания нашей банки. Поскольку Maven предпочитает условность конфигурации, мы можем просто запустить пакет для создания нашего jar-файла.

По умолчанию наш jar-файл будет добавлен в папку target в нашем проекте.

4.2. Указание основного класса

Мы также можем настроить Maven для указания основного класса и создания исполняемого jar-файла .

5. Использование Пружинного Ботинка

5.1. Использование Maven и Defaults

Если мы используем Spring Boot с Maven, мы должны сначала подтвердить, что наш параметр упаковки установлен в jar , а не war в нашем pom.xml файл.

Как только мы узнаем, что это настроено, мы можем запустить пакет цель:

5.2. Установка точки входа

Установка нашего основного класса-это то, где мы находим различия между созданием jar с обычным Java-приложением и fat jar для приложения Spring Boot . В приложении Spring Boot основной класс на самом деле является org.springframework.boot.loader.Ярлаунчер .

Хотя наш пример не является приложением Spring Boot, мы могли бы легко настроить его как консольное приложение Spring Boot .

Наш основной класс должен быть указан как начальный класс:

Мы также можем использовать Gradle для создания Spring Boot fat jar .

6. Запуск банки

6.1. Вывод основного класса

Поскольку мы пошли дальше и убедились, что наш основной класс указан в манифесте, мы можем использовать опцию -jar команды java для запуска нашего приложения без указания основного класса:

6.2. Указание основного класса

Мы также можем указать основной класс, когда мы запускаем наше приложение. Мы можем использовать опцию -cp , чтобы убедиться, что наш jar-файл находится в пути к классу, а затем предоставить ваш основной класс в формате package.className :

Использование разделителей путей вместо формата пакета также работает:

6.3. Перечисление содержимого банки

Мы можем использовать команду jar для перечисления содержимого нашего файла jar:

6.4. Просмотр файла манифеста

Поскольку может быть важно знать, что находится в нашем файле MANIFEST.MF , давайте рассмотрим быстрый и простой способ заглянуть в содержимое, не выходя из командной строки.

Давайте воспользуемся командой unzip с параметром-p:

7. Заключение

В этом уроке мы настроим простое Java-приложение с классом main .

Затем мы рассмотрели три способа создания jar-файлов: с помощью команды jar , с помощью Maven и с помощью приложения Maven Spring Boot.

После того, как мы создали наши jar-файлы, мы вернулись в командную строку и запустили их с выведенным и заданным основным классом.

Мы также узнали, как отображать содержимое файла и как отображать содержимое одного файла в банке.

Читайте также: