Highlighter
понедельник, 27 февраля 2012 г.
вторник, 7 февраля 2012 г.
Редактирование прошивки android под linux
Писал для 4pda.ru для телефона Samsung GT-I9001 Galaxy S Plus, может, кому будет полезно.
Данное руководство предполагает, что читающий обладает базовыми навыками использования linux (использование консоли, получение прав рута, установка программ, создание/редактирование системных файлов)
Зависимости и UDEV
Сначала нужно установить sun-jdk. Стоит отметить, что оракл недавно менял лицензию, поэтому в основном репозитории его может не быть. Для ubuntu достаточно установить sun-java6-jdk, но, если планирутся пересобирать ядро, то нужно будет установить дополнительные зависимости.
Для 32/64 битной ubuntu нужно выполнить следующее:
Дополнительно, если у вас 64 бита, нужно установить 32х битные библиотеки
Теперь, чтобы у обычных пользователей были права на использование adb, нужно создать соответствующее правило udev
После этого жмём Ctrl+D, чтобы выйти из рутовской сессии.
Создаём своё ядро
Качаем гугловский sdk. Для этого идём на http://developer.android.com/sdk/index.html и качаем версию под linux http://dl.google.com/android/android-sdk_r16-linux.tgz
После этого распаковываем файл
Идём в папку android-sdk-linux/tools и запускаем файл android
И устанавливаем Android SDK Platform tools
После этого появится папка android-sdk-linux/platform-tools, где и находится adb. Для удобства, есть смысл добавить эту папку в PATH, чтобы иметь быстрый доступ к adb (замените путь на свой).
Теперь можно подключать телефон в режиме отладки USB (Настройки - приложения - разработка - включить отладку USB) к компьютеру.
По команде adb devices должен показаться ваш телефон.
Теперь возьмём с телефона текущий конфиг ядра.
Теперь распаковываем его при помощи gunzip и переименовываем в .config (стоит обратить внимание, что файл, начинающийся с точки - скрытый)
Идём на http://opensource.samsung.com и качаем исходники ядра, либо пользуемся git для получения. После этого распаковываем скачанный архив и копируем туда наш файл .config.
Теперь нам нужен тулчейн для сборки под arm. Для ubuntu можно скачать отсюда, затем распаковать.
В gentoo можно воспользоваться командой crossdev --target arm-none-linux-gnueabi.
Открываем Makefile и ищем там переменную CROSS_COMPILE и заменяем значение на тот путь, где находится наш распакованный (или установленный тулчейн). У меня этот путь
Теперь обычным make -jX, где X - число процессоров(ядер)+1 собираем ядро. Если собралось, то Вы — молодец. Можно накладывать патчи и что-то менять в ядре.
После сборки ядро находится Kernel/arch/arm/boot/zImage.
Модификация прошивки.
Сначала при помощи CWM нужно сделать бэкап прошивки.
После этого идём на https://github.com/dsixda/Android-Kitchen/archives/master и качаем кухню. Samsung GT-I9001 поддерживается с версии 0.182.
Качаем, распаковываем.
Копируем файлы, полученные при бэкапе из CWM в папку original_update.
Запускаем кухню
Выбор осуществляется вводом цифр/букв, которые написаны в начале строки.
Устанавливаем рабочий каталог, добавляем busybox. Затем жмём 0 и заходим в advanced options — тут можно сделать деодекс прошивки. Это нужно для того, чтобы можно было изменять файлы прошивки. Также стоит включить поддержку /etc/init.d.
После всего этого можно заняться кастомизацией интерфейса. Это делается очень просто - идём на http://uot.dakra.lt/kitchen/, выбираем, что нам нужно сделать и через некоторое время получаем готовую прошивку. Единственное, на что стоит обратить внимание — в пункте File Upload нужно выбрать:
update-binary — Type Galaxy
Upload system files — заливаем framework-res.apk, SystemUI.apk, twframework-res.apk.
После этого жмём submit и ждём, когда модификации будут готовы.
На выходе мы получаем zip-файл, который можно прошить через CWM. Но можно вынуть файлы из архива и скопировать их в нашу распакованную прошивку. Она находится в папке WORKING_число_число.
Установка нового ядра
Выбираем 20 - Tools for boot image (unpack/re-pack/etc.), затем распаковываем boot.img. У нас появится папка BOOT-EXTRACTED, где находится ядро и распакованный рамдиск, где можно подредактировать загрузочные скрипты и параметры. Делаем Build boot.img from BOOT-EXTRACTED folder (for working folder) и после этого можно собирать прошивку.
В результате у нас готов подписанный архив, который можно ставить из recovery.
Примечание 1. У меня нету под руками ubuntu, поэтому с именами пакетов мог ошибиться. Все остальные действия не сильно зависят от используемого linux.
Данное руководство предполагает, что читающий обладает базовыми навыками использования linux (использование консоли, получение прав рута, установка программ, создание/редактирование системных файлов)
Зависимости и UDEV
Сначала нужно установить sun-jdk. Стоит отметить, что оракл недавно менял лицензию, поэтому в основном репозитории его может не быть. Для ubuntu достаточно установить sun-java6-jdk, но, если планирутся пересобирать ядро, то нужно будет установить дополнительные зависимости.
Для 32/64 битной ubuntu нужно выполнить следующее:
sudo -s
apt-get install git-core gnupg sun-java6-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev
Дополнительно, если у вас 64 бита, нужно установить 32х битные библиотеки
ia32-libs lib32z1-dev lib32ncurses5-dev gcc-multilib g++-multilib
Теперь, чтобы у обычных пользователей были права на использование adb, нужно создать соответствующее правило udev
echo 'SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"' > /etc/udev/rules.d/90-adb.rulesПосле этого жмём Ctrl+D, чтобы выйти из рутовской сессии.
Создаём своё ядро
Качаем гугловский sdk. Для этого идём на http://developer.android.com/sdk/index.html и качаем версию под linux http://dl.google.com/android/android-sdk_r16-linux.tgz
После этого распаковываем файл
tar xzf android-sdk*
Идём в папку android-sdk-linux/tools и запускаем файл android
./android
И устанавливаем Android SDK Platform tools
После этого появится папка android-sdk-linux/platform-tools, где и находится adb. Для удобства, есть смысл добавить эту папку в PATH, чтобы иметь быстрый доступ к adb (замените путь на свой).
echo 'PATH="/home/shtsh/phone/android-sdk-linux/platform-tools:${PATH}"' >> ~/.bashrcТеперь можно подключать телефон в режиме отладки USB (Настройки - приложения - разработка - включить отладку USB) к компьютеру.
По команде adb devices должен показаться ваш телефон.
Теперь возьмём с телефона текущий конфиг ядра.
adb pull /proc/config.gz
Теперь распаковываем его при помощи gunzip и переименовываем в .config (стоит обратить внимание, что файл, начинающийся с точки - скрытый)
Идём на http://opensource.samsung.com и качаем исходники ядра, либо пользуемся git для получения. После этого распаковываем скачанный архив и копируем туда наш файл .config.
Теперь нам нужен тулчейн для сборки под arm. Для ubuntu можно скачать отсюда, затем распаковать.
В gentoo можно воспользоваться командой crossdev --target arm-none-linux-gnueabi.
Открываем Makefile и ищем там переменную CROSS_COMPILE и заменяем значение на тот путь, где находится наш распакованный (или установленный тулчейн). У меня этот путь
CROSS_COMPILE ?= /usr/bin/arm-none-linux-gnueabi-
Теперь обычным make -jX, где X - число процессоров(ядер)+1 собираем ядро. Если собралось, то Вы — молодец. Можно накладывать патчи и что-то менять в ядре.
После сборки ядро находится Kernel/arch/arm/boot/zImage.
Модификация прошивки.
Сначала при помощи CWM нужно сделать бэкап прошивки.
После этого идём на https://github.com/dsixda/Android-Kitchen/archives/master и качаем кухню. Samsung GT-I9001 поддерживается с версии 0.182.
Качаем, распаковываем.
Копируем файлы, полученные при бэкапе из CWM в папку original_update.
Запускаем кухню
./menu
Выбор осуществляется вводом цифр/букв, которые написаны в начале строки.
Устанавливаем рабочий каталог, добавляем busybox. Затем жмём 0 и заходим в advanced options — тут можно сделать деодекс прошивки. Это нужно для того, чтобы можно было изменять файлы прошивки. Также стоит включить поддержку /etc/init.d.
После всего этого можно заняться кастомизацией интерфейса. Это делается очень просто - идём на http://uot.dakra.lt/kitchen/, выбираем, что нам нужно сделать и через некоторое время получаем готовую прошивку. Единственное, на что стоит обратить внимание — в пункте File Upload нужно выбрать:
update-binary — Type Galaxy
Upload system files — заливаем framework-res.apk, SystemUI.apk, twframework-res.apk.
После этого жмём submit и ждём, когда модификации будут готовы.
На выходе мы получаем zip-файл, который можно прошить через CWM. Но можно вынуть файлы из архива и скопировать их в нашу распакованную прошивку. Она находится в папке WORKING_число_число.
Установка нового ядра
Выбираем 20 - Tools for boot image (unpack/re-pack/etc.), затем распаковываем boot.img. У нас появится папка BOOT-EXTRACTED, где находится ядро и распакованный рамдиск, где можно подредактировать загрузочные скрипты и параметры. Делаем Build boot.img from BOOT-EXTRACTED folder (for working folder) и после этого можно собирать прошивку.
В результате у нас готов подписанный архив, который можно ставить из recovery.
Примечание 1. У меня нету под руками ubuntu, поэтому с именами пакетов мог ошибиться. Все остальные действия не сильно зависят от используемого linux.
среда, 1 февраля 2012 г.
Настройка прокрутки для трэкпоинта
Вот список устройств ввода.
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ DualPoint Stick id=12 [slave pointer (2)]
⎜ ↳ AlpsPS/2 ALPS DualPoint TouchPad id=13 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Power Button id=8 [slave keyboard (3)]
↳ Sleep Button id=9 [slave keyboard (3)]
↳ Laptop_Integrated_Webcam_2M id=10 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=11 [slave keyboard (3)]
Соответственно, DualPoint Stick - трекпоинт. Ему нужно включить эмуляцию прокрутки.Вот насройки xorg.
/etc/X11/xorg.conf.d/20-synaptics.conf
Section "InputClass"
Identifier "synaptics-all"
Driver "synaptics"
MatchProduct "AlpsPS/2 ALPS DualPoint TouchPad"
MatchIsTouchpad "on"
Option "TapButton1" "1"
Option "TapButton2" "2"
Option "TapButton3" "3"
Option "VertEdgeScroll" "on"
Option "HorizEdgeScroll" "on"
EndSection
Section "InputClass"
Identifier "Trackpoint Wheel Emulation"
MatchProduct "DualPoint Stick"
MatchDevicePath "/dev/input/event*"
Option "EmulateWheel" "true"
Option "EmulateWheelButton" "2"
Option "Emulate3Buttons" "false"
Option "XAxisMapping" "6 7"
Option "YAxisMapping" "4 5"
EndSection
Теперь при средней кнопке + трэкпоинт происходит прокрутка.
При подготовке использовались материалы с арчевики
вторник, 31 января 2012 г.
XBMC и shutdown. Гнева пост.
Недавно возникла такая ситуация: в xbmc пропала возможность выключать компьютер (остался лишь suspend). Сие меня крайне опечалило и заставило искать решение проблемы. Наиболее распространённым было решение добавить политику для policykit.
/etc/polkit-1/localauthority/50-local.d/custom-actions.pkla
Однако это не помогло.
Каково было моё удивление, когда для решения этой проблемы потребовалось убрать ck-launch-session для запуска. То есть опять пришлось огребать проблемы из-за этого долбанного нестабильного consolekit. То бишь теперь всё запускается из слима командой:
/etc/slim.conf
Год назад при выходе 0.4.2 пришлось извращаться, так теперь опять ковыряться и искать причину.
Господа разработчики основных линуховских подсистем, почему вы так регулярно всё ломаете?!
/etc/polkit-1/localauthority/50-local.d/custom-actions.pkla
[Actions for me] Identity=unix-user:1000 Action=org.freedesktop.upower.*;org.freedesktop.consolekit.system.*;org.freedesktop.udisks.* ResultAny=yes ResultInactive=no ResultActive=yesЕстественно, вместо 1000 нужен uid или логин пользователя, от чьего имени работает xbmc.
Однако это не помогло.
Каково было моё удивление, когда для решения этой проблемы потребовалось убрать ck-launch-session для запуска. То есть опять пришлось огребать проблемы из-за этого долбанного нестабильного consolekit. То бишь теперь всё запускается из слима командой:
/etc/slim.conf
login_cmd exec dbus-launch /bin/bash -login ~/.xinitrc %session > ~/.xsession-errors 2>&1
Год назад при выходе 0.4.2 пришлось извращаться, так теперь опять ковыряться и искать причину.
Господа разработчики основных линуховских подсистем, почему вы так регулярно всё ломаете?!
пятница, 27 января 2012 г.
Выводим список обновлений в gentoo при логине
Давным-давно я наваял скромненький скрипт, который дёргается по крону и проверяет, чего обновилось в системе.
Стоит отметить, что это писалось ещё во времена, когда был крайне медленный интернет и на этот скрипт возлагалась задача автоматически закачивать файлы для сборки. Когда интернет стал быстрым, закачку я выкосил, а что получилось - смотрите
/usr/local/sbin/update-system-check
Этот скрипт умеет проверять обновления и посылать уведомления через notify-send, что можно что-то обновить. Для этого используется другой скрипт, написанный на perl (в будущем планирую переделать всё под perl).
/usr/local/bin/parse.pl
Теперь осталось засунуть вызов parse.pl в .bashrc. Так же можно использовать cat /var/log/updates. Только смотрите - у меня логи пишутся для группы log (я об этом раньше писал), поэтому, возможно, придётся немножко подправить.
Ну, и для обновления системы я использую следующий скрипт:
Стоит отметить, что это писалось ещё во времена, когда был крайне медленный интернет и на этот скрипт возлагалась задача автоматически закачивать файлы для сборки. Когда интернет стал быстрым, закачку я выкосил, а что получилось - смотрите
/usr/local/sbin/update-system-check
#!/bin/bash
LOG_FILE=/var/log/updates
PID_FILE=/var/run/updates.pid
LANG=ru_RU.UTF-8
STRING_FILE_EXIST="Процесс уже запущен. Выход"
STRING_FILE_ALONE="Процесс был некорректно завершён. Перезапуск обновления"
STRING_GOOD="Обновление"
#для того, чтобы работал notify-send
USER="shtsh"
#Создаём лог-файл, если его нету
[ -e $LOG_FILE ] || touch $LOG_FILE && chmod 640 $LOG_FILE && chown root.log $LOG_FILE
#Пишем в PID-файл, качаем файлы и удаляем PID-файл
check_update(){
ps aux | grep "bash /usr/local/sbin/update-system-check" | grep -v "grep" | awk {'print $2'} > $PID_FILE
eix-sync > /dev/null
eix-remote fetch > /dev/null
emerge -qupDN @world >> $LOG_FILE
TMP=`grep ebuild $LOG_FILE`
if [ "x$TMP" != x"" ]
then
# Тут извращаемся и пользователю $USER выводим при помощи notify-send, что обновилось. Так как используется DBUS, то нужно поизвращаться.
# Так как я использую KDE, то грепаем процессы по kdeinit для получения параметров DBUS
PID=$(pgrep -u $USER kdeinit)
DBUS_SESSION_BUS_ADDRESS=$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$PID/environ | sed 's/DBUS_SESSION_BUS_ADDRESS=//' )
sudo -u $USER DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS bash -c "notify-send $STRING_GOOD \"`/usr/local/bin/parse.pl html`\""
fi
rm -f $PID_FILE
}
if [ -e $PID_FILE ]
# PID-файл есть, проверяем на корректность завершения операции.
then
process_count=`ps aux | grep "bash /usr/local/sbin/update-system-check" | grep -v "grep" | wc -l`
if (( $process_count > 2 ))
then
# Всё хорошо, другой процесс работает
echo `date +"%D %A %H:%M"` $STRING_FILE_EXIST >> $LOG_FILE
exit 1
else
# Это единственный процесс, обновляем
echo `date +"%D %A %H:%M"` $STRING_FILE_ALONE > $LOG_FILE
check_update
fi
else
#Файла нету, просто обновляемся
echo `date +"%D %A %H:%M"` $STRING_GOOD > $LOG_FILE
check_update
fi
Этот скрипт умеет проверять обновления и посылать уведомления через notify-send, что можно что-то обновить. Для этого используется другой скрипт, написанный на perl (в будущем планирую переделать всё под perl).
/usr/local/bin/parse.pl
#!/usr/bin/perl -w
use strict;
# проверяем аргументы, которые должны быть равны plain или html
# По-умолчанию выводим как plain text
my $output_type="plain";
if (defined(@ARGV)) {
if (("$ARGV[0]" ne "html") and ("$ARGV[0]" ne "plain")) {
print "\nUSAGE:\n $0 plain \t for plain text output\n $0 html\t for HTML output\n\n";
die;
}
$output_type=$ARGV[0];
}
open(LOG_FILE,'<','/var/log/updates');
# Выводим список обновлений
while(<LOG_FILE>) {
/ebuild/;
if ("$output_type" eq "html") {
print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/;
} else {
print $1,"/",$2," ",$4," → ",$3,"\n" if /([\w]+\-[\w]+)\/([\w]+)-([\w\.-]+)\s\[([\w\.-]+)\]/;
}
}
Этот скрипт умеет парсить файл, где записано, что обновилось и выводить в HTML для libnotify или plain text.Теперь осталось засунуть вызов parse.pl в .bashrc. Так же можно использовать cat /var/log/updates. Только смотрите - у меня логи пишутся для группы log (я об этом раньше писал), поэтому, возможно, придётся немножко подправить.
Ну, и для обновления системы я использую следующий скрипт:
#!/bin/bash LOG_FILE=/var/log/updates emerge -auDN @world && [ -e $LOG_FILE ] && echo "" > $LOG_FILE revdep-rebuild > /dev/nullНу, и нужно добавить в /etc/crontab что-то, похожее на это:
5 */3 * * * root /usr/local/sbin/update-system-checkКаждые 3 часа будут проверяться обновления.
P.S. Парсер лох. Сейчас буду пытаться исправить.
понедельник, 23 января 2012 г.
Загружаемся с флешки через grub
Пришлось как-то недавно повозиться с ноутбуком, у которого dvd-rom уже начал глючить, а поддержки загрузки с usb флешки или внешнего dvd-rom нету.
Заодно захотелось сделать заявление: "Дорогая Toshiba, я никогда не буду покупать твою продукцию из-за кривых bios и ужасной поддержки linux."
Так вот. На этот ноутбук нужно было поставить арч, а при чтении с диска возникали ошибки. Поэтому пришлось гуглить. И знаете, нагуглилась очень классная штука - plop boot manager.
Plop - менеджер загрузки, который способен грузится почти откуда угодно. Нас же интересует его возможности по загрузке из grub.
Сначала качаем его с официального сайта. Затем находим в архиве файл plpbt.bin и кидаем его в /boot.
После этого добавим запись в меню.
GRUB
Создаём файл /etc/grub.d/20_plop
Затем делаем update-grub и у нас появляется нужный пункт меню, через который можно зайти в Plop.
Конечно, он умеет загружаться не только через grub, но и с дискеты, с виндового загрузчика, по сети.
Более подробно можно почитать на сайте разработчиков.
Заодно захотелось сделать заявление: "Дорогая Toshiba, я никогда не буду покупать твою продукцию из-за кривых bios и ужасной поддержки linux."
Так вот. На этот ноутбук нужно было поставить арч, а при чтении с диска возникали ошибки. Поэтому пришлось гуглить. И знаете, нагуглилась очень классная штука - plop boot manager.
Plop - менеджер загрузки, который способен грузится почти откуда угодно. Нас же интересует его возможности по загрузке из grub.
Сначала качаем его с официального сайта. Затем находим в архиве файл plpbt.bin и кидаем его в /boot.
После этого добавим запись в меню.
GRUB
title Plop Boot Manager root (hd0,0) kernel /boot/plpbt.binGRUB2
Создаём файл /etc/grub.d/20_plop
#!/bin/sh
set -e
prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
# older versions of grub2 do not have this yet (LP: #459080)
if [ ! -e ${libdir}/grub/grub-mkconfig_lib ]; then
echo "no grub-mkconfig_lib, exiting"
exit 0
fi
. ${libdir}/grub/grub-mkconfig_lib
# We can't cope with loop-mounted devices here.
case ${GRUB_DEVICE_BOOT} in
/dev/loop/*|/dev/loop[0-9])
exit 0
;;
esac
if test -e /boot/plpbt.bin ; then
USBBOOTPATH=$( make_system_path_relative_to_its_root "/boot/plpbt.bin" )
echo "Found plpbt.bin image: $USBBOOTPATH" >&2
cat << EOF
menuentry "Plop Boot Manager" {
linux16 $USBBOOTPATH
}
EOF
fi
Взято тутЗатем делаем update-grub и у нас появляется нужный пункт меню, через который можно зайти в Plop.
Конечно, он умеет загружаться не только через grub, но и с дискеты, с виндового загрузчика, по сети.
Более подробно можно почитать на сайте разработчиков.
воскресенье, 22 января 2012 г.
Собираем xbmc под gentoo ~amd64
Есть такой очень удобный и красивый медиа-центр xbmc.
Из стандартного репозитория gentoo он уже собираться не хочет, поэтому я перешёл на версию 9999. Однако и он собираться не захотел! Пришлось гуглить. Решение нашлось на гентушном форуме.
Проблема оказалась, что xbmc пока не поддерживает libpng 1.5.
Из стандартного репозитория gentoo он уже собираться не хочет, поэтому я перешёл на версию 9999. Однако и он собираться не захотел! Пришлось гуглить. Решение нашлось на гентушном форуме.
Проблема оказалась, что xbmc пока не поддерживает libpng 1.5.
mkdir -p /etc/portage/patches/media-tv/xbmc/ cd /etc/portage/patches/media-tv/xbmc/ wget http://trac.xbmc.org/raw-attachment/ticket/12001/xbmc-9999-libpng-1.5-fix-plt-trn-get.patch wget http://trac.xbmc.org/raw-attachment/ticket/12001/xbmc-9999-libpng-1.5.patch mv xbmc-9999-libpng-1.5.patch xbmc-9999-a-libpng-1.5.patchСтоит отметить папку /etc/portage/patches. Из неё патчи будут накладывать автоматически при сборке.
Подписаться на:
Сообщения (Atom)