Модификация Vivaldi для Android
-
Открываю Ящик Пандоры. Мне всё-таки удалось декомпилировать Vivaldi, немного модифицировать (пока без особого понимания, что я делаю) и собрать обратно без вылетов приложения. Инструкция не для слабонервных, советую пристегнуться.
Подготовка
- Устанавливаем Java, без неё никак.
- Скачиваем последнюю версию
apktool
, я использовал версию 2.9.3. Это утилита для декомпиляции и сборкиapk
. - Скачиваем последнюю версию
uber-apk-signer
, в моем случае это 1.3.0. Это утилита для подписи собранногоapk
-файла.
Проба пера
- Скачиваем
apk
-файл, я для примера взял последний стабильный релиз (Vivaldi.6.6.3291.22_arm64-v8a.apk). - Декомпилируем
apk
с помощью командыjava -jar .\apktool_2.9.3.jar d .\Vivaldi.6.6.3291.22_arm64-v8a.apk
. Рядом с файлом должна появиться папка с таким же названием. Там содержатся ресурсы, которые нас больше всего интересуют, если мы хотим модифицировать внешний вид без изменения функциональности, иsmali
-файлы, это такой ассемблер в миреJava
. Хотелось бы вообще не трогатьsmali
-файлы, но без этого, как увидите дальше, не обойтись. - Пока ничего не модифицируем, просто собираем обратно:
java -jar .\apktool_2.9.3.jar b .\Vivaldi.6.6.3291.22_arm64-v8a
. В папке.\Vivaldi.6.6.3291.22_arm64-v8a\dist
должен появиться свежесобранныйapk
. - Теперь нужно подписать приложение, без этого Android не даст его установить. Нашел для этого простую утилитку, с помощью которой можно сделать это простой командой:
java -jar .\uber-apk-signer-1.3.0.jar --apks .\Vivaldi.6.6.3291.22_arm64-v8a\dist\
. В директории сapk
-файлом должен появиться еще один с суффиксом-aligned-debugSigned
. - Только теперь можно пробовать установить подписанное приложение. Приложение должно успешно установиться, вы даже сможете прокликать несколько приветственных экранов, но оно крашнется через несколько секунд. Крашится оно из-за известного бага в
apktool
, автор решение пока не нашел: https://github.com/iBotPeaches/Apktool/issues/3489. И вот вроде бы конечная, но я придумал немного костыльный способ, как обойти этот баг.
Чиним Vivaldi
Во-первых, нужно диагностировать проблему, где именно происходит падение приложения, а этому поможет сам Android. В какой-то момент вы должны словить такое окошко:
Не пропускайте его, скопируйте URL журнала ошибки, и внимательно посмотрите. Например, я получаю такую ошибку: https://paste.evolution-x.org/bWTEOt. Что мы можем из нее вынести?
- Во-первых, мы видим саму ошибку:
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.content.res.ColorStateList.getDefaultColor()' on a null object reference
. Пока ничего не понятно, где-то вызываетсяgetDefaultColor()
у несуществующего объекта. - Во-вторых, мы видим, где произошла ошибка:
org.chromium.chrome.browser.toolbar.top.ToolbarPhone.o(chromium-Vivaldi.6.6.3291.22.apk-stable-532910022:238)
. А вот это уже явная подсказка, давайте посмотрим, что же лежит в строке под номером 238. Кода под рукой нет, но зато естьsmali
-файлы.
Открываем файл
.\Vivaldi.6.6.3291.22_arm64-v8a\smali\org\chromium\chrome\browser\toolbar\top\ToolbarPhone.smali
, ищем все строчки с текстом.line 238
и находим что-то очень похожее на место, где могла возникнуть ошибка:.line 237 :cond_11 :goto_0 iget-object v3, v9, LN71;->g:Landroid/content/res/ColorStateList; .line 238 .line 239 invoke-virtual {v3}, Landroid/content/res/ColorStateList;->getDefaultColor()I .line 240 .line 241 .line 242 move-result v3 .line 243 iget-object v4, v0, LN71;->g:Landroid/content/res/ColorStateList; .line 244 .line 245 invoke-virtual {v4}, Landroid/content/res/ColorStateList;->getDefaultColor()I .line 246 .line 247 .line 248 move-result v4 .line 249 if-ne v3, v4, :cond_13
Попробуем проанализировать, что тут происходит. Для регистров
v3
иv4
выполняются похожие действия, но с разными объектами: сперва в них сохраняется списокColorStateList
, а затем туда же пишется результат вызова методаgetDefaultColor()
. И если цвета вv3
иv4
не равны, происходит переход на метку:cond_13
. Я не знаю, что именно здесь происходит с точки зрения UI браузера, кроме того, что это как-то связано с панелью инструментов, так что двигаемся на ощупь. Интуиция подсказывает, что для избежания падения приложения мы можем избавиться от этих двух вызовов виртуальных методов, подменив их чем-то простым. В зависимости от того, хотите ли вы, чтобы последнее условие сработало, вместо этого кода оставляем только:cond_11 :goto_0 goto :cond_13
или просто
:cond_11 :goto_0
Собираем
apk
, подписываем, устанавливаем и, вуаля, Vivaldi работает!Модификация
Пока я еще мало экспериментировал, но давайте сделаем кое-что очень простое. Хочу, чтобы в ячейках Экспресс-панели, расположенных списком, иконки сайтов отображались на фоне белого овала. На самом деле, не очень хочу, просто на текущий момент это единственное, что у меня получилось.
- Открываем файл
.\Vivaldi.6.6.3291.22_arm64-v8a\res\drawable\speed_dial_card_background.xml
. - Заменяем
@color/speed_dial_card_background_color
на#ffffffff
и@dimen/speed_dial_corner_radius
на256dip
. - Собираем, подписываем, устанавливаем приложение и видим следующее:
Знаю, что выглядит так себе, пользоваться я конкретно этими изменениями не буду, но суть и не в этом. В начале поста я написал про Ящик Пандоры. Хочется, чтобы мои старания были не напрасны, а вместо этого присоединились люди и открыли новую веху в развитии сообщества Vivaldi: моддинг мобильного приложения.
-
-
@aminought так и недалеко и до установки расширений.
Это просто 10-летние цитаты с форума. Хотя эти цитаты за 10 лет заняли 1 строку в списке Запросов. -
-
Ладно, на тилибоне стбильно вылетает.
И всё поехало в настройках, хотя не должно по идее - там же никаких изменений я не делал, оно само.В общем, ящик ящиком, а подводных камней тут - не разгрести)
-
@sedative29rus На всякий случай уточню: запускаешь версию x86_64 или arm64? Первая у меня в эмуляторе тоже не крашилась, но на смартфон ее не установишь.
-
@sedative29rus Почему же не разгрести? Не так много проблем, на самом деле. Думаю, все решается, если потратить чуть больше времени. Одного меня на это вряд ли хватит, но если сообщество подхватит, то почему нет? Я сам вообще ни разу не Android-разработчик, а знающие люди найдутся.
-
@aminought Ага, x86_64. Я как-то автоматически его... потому что (у меня?) на арм-версиях в эмуляторах страницы крашатся по умолчанию в оригинальном вивальди.
Щас попробовал модифицированный арм. Он как-то странно, на одном и том же месте может вылететь, а может и не вылететь.
До следующих шагов не дошёл, потому что у меня нет строки про URL журнала. -
@sedative29rus Можешь в том же файле найти все упоминания
getDefaultColor
, их там 4 всего. -
-
К слову, мы тут непосредственным образом занимаемся нарушением eula, щас забанят
-
@sedative29rus Удаляй это всё подчистую и просто вставляй код из поста.
-
@aminought разобрался вроде.
Запускается, сёрфит. Но вылетает при нажатии на щит. -
@sedative29rus Не нажимай)
-