Android na Jollce - bezczelne haki

Android na Sailfish OS ;-)

Dzisiaj znowu o telefonie firmy Jolla i ich systemie Sailfish OS. Wiele osób się mnie to pytało - co to i po co? Nie wiem czy ten artykuł rozwieje te wątpliwości, ale trochę wyjaśni jeśli dodam, że hackowalność telefonu ma dla mnie duże znaczenie :-). W wypadku tego telefonu jest to też hackowalność fizyczna... Ale o tym innym razem. Teraz wróćmy do Androida, czyli systemu, który jest zainstalowany na Jollce.

Android czy Sailfish?

Tytułem wstępu wyjaśniam dla niezorientowanych - Android oraz Sailfish. Na telefonie Jolla zainstalowane są oba systemy. Podstawowym jest Sailfish, ale - głównie ze względu na niewielką liczbę aplikacji - czasem używa się Android. Przejścia są jednak bardzo płynne - można np. otworzyć aplikację do maili z Androida. Podobnie linki z Android domyślnie otwierane są przeglądarce na Sailfishu. Można także łatwo przełączać się między Androidem i aplikacjami z Sailfisha. Z punktu widzenia użytkownika jest to praktycznie przeźroczyste. Jedynie przycisk wstecz zdradza, że jest się na Androidzie.

Zaznaczam, że poniższy artykuł raczej nie jest do przeczytania na raz. To bardziej taka ściąga z przydatnych poleceń i rozwiązań. Jest to zresztą kopia mojej ściągi, którą trzymałem w Evernote.

Pliki Androida

  • /opt/alien/system - główne pliki systemu.
  • /opt/alien/system/app - aplikacje systemowe.
  • /opt/alien/system/fonts - pre-instalowane fonty (pliki TTF).
  • /data/app - aplikacje zainstalowane przez użytkownika.
  • /data/sdcard - wirtualna karta SD dla aplikacji Androida. Coś w rodzaju domowego folderu.

Polecenia Android

W kwestii łączenia z telefonem przez PuTTy lub WinSCP odsyłam do artykułu Krogulca. Poniższe polecenia można wykonać zarówno przez Terminal dostępny w telefonie, jak i zdalnie przez PuTTy (czyli przez SSH).

Uruchamianie aplikacji

Składnia:

apkd-launcher /ścieżka/do/pliku.apk id.aplikacji/pełna.nazwa.Aktywności

W związku z tym, że pełna nazwa aktywności (widoku) zwykle ma identyczny początek jak id aplikacji, to można użyć krótszej formy:

apkd-launcher /ścieżka/do/pliku.apk id.aplikacji/.Aktywność

Przykład dla Firefoksa (wersja pełna i skrócona):

# pełna nazwa
apkd-launcher /data/app/org.mozilla.firefox.apk org.mozilla.firefox/org.mozilla.firefox.App
# w skrócie
apkd-launcher /data/app/org.mozilla.firefox.apk org.mozilla.firefox/.App

Nazwy identyfikatorów aplikacji czasem trudno wymyślić (Dolphin ma mobi.mgeek.TunnyBrowser). Dla aplikacji dostępnych w Google Play wystarczy jednak spojrzeć na adres URL (przykład).

Polecenia uruchamiane z SailfishOS

  • Statystyki maszyny wirtualnej Androida: /opt/alien/system/bin/vmstat
  • Logcat (log systemu): /opt/alien/system/bin/logcat
  • Wykonanie innych poleceń wymaga skonfigurowania ADB.

Jeśli nie wiesz co to jest LogCat - zajrzyj do artykułu o programowaniu w Androidzie.

Uruchamianie ADB na Jollce

ADB to program używany do zarządzania aplikacjami na Androidzie. Umożliwia także wykonywanie poleceń (otwierania Androidowego shella) oraz zdalne łączenie i instalowania aplikacji. Dzięki temu można kompilować i otwierać aplikacje bezpośrednio z Netbeansa do Jolli.

Domyślnie jednak ADB jest nieaktywny na Jolli, a w każdym razie nie można go normalnie używać. Procedura aktywacji nie jest specjalnie skomplikowana, ale jak zawsze - jeśli wykonujesz polecenia w terminalu, to możesz trwale uszkodzić urządzenie. Ściślej rzecz biorąc - możesz usunąć plik, bez którego system nie będzie się w stanie uruchomić.

UWAGA! Po odblokowaniu ADB każda osoba w Twojej sieci będzie mogła zainstalować aplikacje na Twoim telefonie! Włącz zaporę sieciową w swojej Jollce!

Krok 1. Opcje Androida

Dodaj poniższe do /opt/alien/system/build.prop (jako root, najlepiej przez WinSCP):

persist.service.adb.enable=1
service.adb.tcp.port=5555

Krok 2. Zrestartuj Androida

Wykonaj polecenia:

systemctl restart aliendalvik.service
/opt/alien/system/bin/adb kill-server

Krok 3. Zrestartuj Sailfisha

Zrestartować możesz np. z terminala (polecenie reboot).

Używanie ADB

Po restarcie Jollki możesz normalnie uruchamiać polecenia ADB. Więcej informacji o ADB znajdziesz na stronie Google. Wydaje mi się, że wszystkie powinny działać.

Przykładowe polecenia

  • Lista aktywnych urządzeń (powinno się pojawić jedno): /opt/alien/system/bin/adb devices
  • Otwarcie shella Androida (dla pierwszego aktywnego urządzenia): /opt/alien/system/bin/adb -e shell

Łączenie z ADB przez WiFi

Dla programistów ciekawą sprawą na pewno będzie możliwość testowania aplikacji przez Netbeansa (albo Eclipse jeśli wolisz). Zazwyczaj wymagane jest do tego połączenie przez USB, ale w tym wypadku nie jest to problem.

Na swoim PC wystarczy, że uruchomisz coś takiego:

"c:\Program Files (x86)\Android\android-sdk\platform-tools\adb.exe" connect 192.168.1.123

gdzie 192.168.1.123 to adres IP twojej Jolli. Ten adres jest widoczny np. w ustawieniach trybu dewelopera.

Domyślna przeglądarka z Androida

Jak wspominałem połączenie między Androidem i Sailfishem jest dosyć płynne. Jedną z możliwości jest powiązanie typów plików (MIME) z określonym poleceniem. W tym wypadku jest jednak pewien haczyk - póki co, żeby uruchomić aplikację z parametrem, musisz włączyć ADB (patrz wyżej).

Utworzenie pliku desktop

  1. Uruchom WinSCP (lub coś podobnego).
  2. Otwórz folder: /usr/share/applications.
  3. Otwórz plik: sailfish-browser.desktop.
  4. Utwórz nowy plik: otwieracz-ulubionej-przegladarki.desktop. Nazwa nie musi być identyczna ;-).
  5. Skopiuj opcję MimeType z pliku "sailfish-browser.desktop" do "otwieracz-ulubionej-przegladarki.desktop".
  6. Dodaj "#" przed opcją MimeType w pliku "sailfish-browser.desktop".
  7. Zapisz oba pliki :-).
  8. Uruchom polecenie (jako root!): update-desktop-database.

Plik swój plik "desktop" możesz uzyskać kopiując jeden z istniejących plików. Najważniejsza jest opcja Exec oraz dodanie opcji NoDisplay=true. To drugie spowoduje, że nasz plik desktop nie będzie widoczny na pulpicie.

W wypadku plikacji z Androida Exec powinien mieć formę Exec=/opt/alien/system/bin/adb -e shell am start -a android.intent.action.VIEW -n id.aplikacji/.Aktywność -d ' %U'. Pamiętaj o dodaniu spacji przed "%U". Bez tego polecenie nie zadziała.

Przykładowe wersje pliku desktop

Zamiast "otwieracz-ulubionej-przegladarki.desktop" możesz oczywiście wpisać coś innego ;-). Poniżej przykładowe (działające) wersje plików desktop dla przeglądarek Dolphin i Firefox. Rzecz jasna tylko jedna może być domyślna.

otwieracz-delfinka.desktop

[Desktop Entry]
Exec=/opt/alien/system/bin/adb -e shell am start -a android.intent.action.VIEW -n mobi.mgeek.TunnyBrowser/.BrowserActivity -d ' %U'
Name=Dolphin HTTP handler (opener)
Type=Application
MimeType=text/html;x-maemo-urischeme/http;x-maemo-urischeme/https;
X-Nemo-Application-Type=no-invoker
X-Nemo-Single-Instance=no
X-apkd-apkfile=/data/app/mobi.mgeek.tunnybrowser.apk
NoDisplay=true

otwieracz-foksa.desktop

[Desktop Entry]
Exec=/opt/alien/system/bin/adb -e shell am start -a android.intent.action.VIEW -n org.mozilla.firefox/.App -d ' %U'
Name=Firefox HTTP handler (opener)
Type=Application
MimeType=text/html;x-maemo-urischeme/http;x-maemo-urischeme/https;
X-Nemo-Application-Type=no-invoker
X-Nemo-Single-Instance=no
X-apkd-apkfile=/data/app/org.mozilla.firefox.apk
NoDisplay=true

Instalowanie aplikacji niedostępnych w Yandex.store

Domyślnie aplikacje można instalować ze sklepu Yandex oraz Jolli. W sklepie Yandex jest ich bardzo dużo, w sklepie Jolli parę na krzyż.

Co działa?

  • Aplikacje muszą być kompatybilne z Android 4.1.2 (czyli prawie wszystkie).
  • Aplikacje wymagające usługi Google Wallet nie będą działać. Przy czym nie będzie problemu jeśli tzw. in-app-purches jest opcjonalny.
  • Normalnie nie działa logowanie w aplikacjach Google (np. do YouTube), ponieważ jest powiązane z usługą logowania Google. Istnieje obejście tego problemu - podobno wystarczy zainstalować Google Play.

Przenoszenie aplikacji

  1. Na swoim Androidzie zainstaluj aplikację "Apk Share & Backup" (lub podobną).
  2. Wyślij sobie plik APK poprzez Bluetooth.
  3. Wejdź w Ustawienia -> System -> Transfery.
  4. Kliknij na przesłany plik APK (powinien pojawić się komunikat o zainstalowaniu nowej aplikacji).

Niektóre aplikacje zależą jedna od drugiej - np."YouTube Downloader" wykorzystuje aplikację YouTube (chociaż akurat tej pierwszej nie polecam :-).

Aktualizacja ręcznie instalowanych aplikacji Androida

Aktualizacja aplikacji instalowanych ręcznie nie działa (przynajmniej na razie). Można co prawda usunąć i ponownie dodać aplikację, ale to może spowodować utratę danych (jeśli są zapisywane na urządzeniu).

Istnieje jednak sposób na obejście problemu:

  1. Włącz ADB (patrz wyżej).
  2. Zaloguj się jako root (najlepiej przez WinSCP lub coś w tym stylu).
  3. Otwórz folder: /usr/share/applications.
  4. Otwórz plik: apkd-mime-handler.desktop.
  5. Dodaj "#" przed opcją Exec.
  6. Dodaj nową opcję: Exec=/opt/alien/system/bin/adb install -r %F.
  7. Zapisz :-).

Cały plik po zmianach powinien wyglądać tak:

[Desktop Entry]
Type=Application
Name=Install APK files
#Exec=/usr/bin/apkd-install %F
Exec=/opt/alien/system/bin/adb install -r %F
MimeType=application/vnd.android.package-archive;
NoDisplay=true

Zaznaczam jednak, że to działa trochę dziwnie... Przy pierwszym kliknięciu na APK w okienku transferów nie pokazuje się nic (jeśli się przejdzie do listy aplikacji, to widać jednie, że znika ikonka apki). Po drugim kliknięciu apka zostanie ponownie zainstalowana, a dane użytkownika (Twoje dane), powinny pozostać nietknięte. Tak przynajmniej wynika z moich testów. Innych efektów na razie nie zauważyłem.

Rzecz jasna zamiast nadpisywać zachowanie systemu można także wykonać poniższe polecenie w terminalu (może być jako użytkownik "nemo"):

/opt/alien/system/bin/adb install -r /ścieżka/do/twojej/zaktualizowanej/aplikacji.apk