Я был весьма удивлен, узнав, что в Android по умолчанию присутствует всего лишь 15 фиксированных градаций изменения громкости от минимальной к максимальной. Прямо сказать – это очень мало. При прослушивании музыки в тихих помещениях я нередко попадал в ситуацию, когда один уровень громкости является слишком тихим, а уровень ступенью выше – слишком громким. Нужно было что-то менять.
Как оказалось, для аппаратов с root-доступом решение данной проблемы существует!
Предупреждение
- Данная инструкция подразумевает, что вы имеете root-доступ к своему аппарату.
- Для увеличения числа градаций громкости необходимо модифицировать системные файлы, поэтому при неумелых действиях вы можете сломать операционную систему вашего устройства. Прежде, чем приступать к выполнению данной инструкции, неплохой идеей будет сделать полный бэкап NAND.
- В инструкции предполагается, что вы уже умеете пользоваться adb.exe. Подробности настройки в тексте опущены.
- Описанный способ может работать не на всех аппаратах. Отдельные значения числа градаций могут приводить к нелинейным изменениям уровня громкости. Если это произошло – попробуйте выставить другое число градаций.
Необходимое ПО
- Установленный и настроенный Android SDK (требуется adb.exe);
- Java Development Kit;
- Архиватор типа WinRAR или 7-Zip;
- Текстовый редактор;
- Утилита Smali/Baksmali Manager (зеркало)
Инструкция
Получение системного файла framework.jar
Подключите ваш телефон к компьютеру в режиме USB Debugging и убедитесь, что он распознается системой при помощи команды adb devices в командной строке.
Для копирования файла framework.jar из внутренней памяти телефона в текущий каталог командной строки наберите:
adb pull /system/framework/framework.jar
Распаковка и модификация файла framework.jar
Прежде, чем изменять полученный файл framework.jar, неплохой идеей будет сделать его бэкап на случай, если что-то пойдет не так.
После этого откройте каталог, в который вы распаковали smali/baksmali, перенесите в него полученный на предыдущем шаге файл и запустите файл baksmali Manager.bat.
Нажмите 4 (select file to work), затем аналогично цифрой выберите framework.jar.
Нажмите 1 (baksmali) для распаковки выбранного файла.
Теперь в каталоге smali manager’а образовался новый каталог framework. Найдите файл framework\android\media\AudioService.smali и откройте его текстовым редактором.
Запустите поиск по следующей строке:
Landroid/media/AudioService;->MAX_STREAM_VOLUME:[I
При этом вы должны увидеть нечто подобное:
Строкой выше найденного ищем идентификатор массива, содержащего искомое число уровней громкости. В нашем примере это array_19c. Теперь запускаем поиск по найденному идентификатору, и должны найти таблицу:
В таблице нас интересуют строки 0xft 0x0t 0x0t 0x0t – именно 0xft в них отвечает за 15 уровней громкости. И, как можно заметить, f в шестнадцатеричной системе счисления – это и есть 15 в десятичной системе. Следовательно, чтобы сделать 30 различных уровней громкости – необходимо всего лишь заменить 0xft на 0x1et (30 десятичное = 1E шестнадцатеричное).
Сохраняем измененный файл с тем же именем.
Запаковка framework.jar и загрузка его в память телефона
Возвращаемся в smali manager и нажимаем цифру 2 (smali) для запаковки файлов обратно в понятную для Android структуру.
В процессе данной операции будет создан файл classes.dex. Данный файл необходимо поместить внутри архива framework.jar. Для этого открываем последний с помощью любого подходящего архиватора, после чего просто перетаскиваем classes.dex в открывшееся окошко.
Теперь осталось лишь загрузить измененный файл framework.jar обратно в память аппарата. Раздел /system, где хранился данный файл, по умолчанию смонтирован в системе Android в режиме только чтения (read-only), поэтому для начала потребуется перемонтировать его с правами записи:
adb remount
Затем для непосредственного копирования набираем:
adb push framework.jar /system/framework/framework.jar
После того, как файл окажется успешно загружен, следует убедиться, что на него оказались выставлены корректные права доступа. Используем следующий набор команд:
adb shell $ chmod 644 /system/framework/framework.jar
Можно убедиться, что напротив файла framework.jar отображается набор разрешений -rw-r--r-- при помощи команды:
$ ls -la /system/framework/
Затем необходимо перезагрузить устройство, чтобы изменения вступили в силу. Для этого можно воспользоваться командой adb reboot.
Если вы все сделали правильно, то после успешной перезагрузки в вашем аппарате будет уже 30 различных градаций уровня громкости.
Делал все по инструкции, но описанного результата не добился, 15 уровней как было, так и осталось. В чем может быть ошибка?
Поставил значение 0x64t при попытке сделать громче 17 уходит в ребут.
Возможно, что 100 уровней громкости (0x64t = 100) – это просто слишком много.
Кроме того, судя по отзывам в различных источниках, на некоторых устройствах то или иное число уровней громкости может в принципе работать неверно. Например, на многих устройствах Samsung исходное значение 15 фактически нельзя изменить – все другие варианты неработоспособны. Мне на HTC удалось успешно установить значение в 0x1Ft (30 градаций), и с ним аппарат работает корректно.
Отлично, помогло для lg nexus 4, вернули к заводским, после этого в динамике разговорном вообще не было слышно, было даже лучше если телефон перевернуть. В итоге менял значение на FF – 255, и стало нормально слышно, вернул оригинальный файл с 5. Полет нормальный)))
Все хорошо, но нет пояснения где менять значения при условиях подключения гарнитуры, а там обычно сразу все меняется, например при подключении гарнитуры стоит ограничение в 15 шагов, и делая 16 идет сброс на ноль и тишина :-)
Забыл написать нет смысла увеличивать шаги больше 49 так как при этих значениях громкость звука линейно увеличивается и плавно, при других просто дубликат точек при которых звук остается на одной прямой.
При меньших резко и график ув. громкости становится угловатый.
При распаковке файла никакого каталога не создается, а получается вот такая фигня: http://prnt.sc/nk31f7
Что не так, как испавить?
Upd.: Проблема решена, но появилась другая: вылетает ошибка “Not running as root. Try adb root at first”
как решил проблему?