Chcete si nahrávat své vlastní telefonní hovory a to i automaticky a bez otravných notifikací. Jde to. Potřebujete mít root přístup přes ADB. Jak jej získat lze zjistit na mnoha místech. Návod píšu pro Linux, ale pod Windows jsou programy obdobné.
Obecný postup: 1. stáhnete si z telefonu originální balík Dialer.apk, 2. upravíte jej a 3. nahrajete zpět do telefonu.
Přihlásíte se do telefonu přes "adb shell" popřípadě "adb root", abyste se podívali kde máte originální balíček pro volání Dialer.apk:
# find / -name Dialer.apk
Mně jej našlo v místě "/system/priv-app/Dialer/Dialer.apk" Protože disk /systém má zakázaný zápis, aby si jej uživatelé nezničili, je třeba oblast /systém přemontovat a zápis povolit příkazem
# mount /system -o remount,rw
Pozor, nyyní si můžete celý telefon vesele zničit.
Nejprve přejmenujeme originální balík, abychom o něj nepřišli a protože by zároveň systém odmítl jeho budoucí aktualizaci bez originálního podpisu. Pokud by se cokoliv zvrtlo a upravený balík později nenaběhl, vždy můžete tento přejmenovaný balík přejmenovat na zpět a budete mít telefon jako na počátku.
# mv /system/priv-app/Dialer/Dialer.apk /system/priv-app/Dialer/DialerOrig.apk
Nyní se z telefonu odhlásíte pomocí CTRL-D a stáhnete si balík do počítače:
$ adb pull /system/priv-app/Dialer/DialerOrig.apk
APK balík je obyčejný zip, ale my potřebujeme dekodovat i javascripty do jakéhosi asembleru, který lze editovat a to uděláme nastrojem apktool. Nainstalujeme si jej příkazem
$ sudo apt install apktool
a pak balík dekódujeme příkazem
$ apktool d DialerOrig.apk
vytvoří se nám adresář DialerOrig se zdrojovými soubory. Nyní si najdeme ve kterém xml souboru je vypnuto nahrání v řetězci call_recording_enabled
# grep -R call_recording_enabled DialerOrig |grep xml
V mém případě se jedná o soubor DialerOrig/res/values/bools.xml a nahrávání zapnejeme tak, že na daném řádku změníme false na true tak aby řádek vypadal:
<bool name="call_recording_enabled">true</bool>
Nechcete-li ale notifkaci natvrdo vypnout, tuto část přeskočte. Radoval jsem se z toho dva dny, než mi začalo lézt na nervy neustálé notifikace ukládaných nahraných souborů. V telefonu notifikace nešly vypnout a tak jsem pátral a zjistil, že klíčový řetěze je call_recording_notification_with_label_title. Najdete si adresu na kterou ukazuje a zakomentujete řádky, které jsou zodpovědné za notifikaci
$ grep -R call_recording_notification_with_no_label_title DialerOrig
ukáže se hromada řádek s jazýkovými mutacemi a pak řádky, které budou obsahovat žádanou adresu. V mém případě např. 7f1100d9
....
DialerOrig/smali_classes6/android/support/v7/viewpager/R$string.smali:.field public static final call_recording_notification_with_no_label_title:I = 0x7f1100d9
Nyní se pokusíme najít, kde je adresa využitá a to pokud možno mimo ony tuny deklarací. Po příkazu:
$ grep -R 0x7f1100d8 DialerOrig|grep -v "field public"
se my ukázaly pouhé dva řádky z nichž jen jeden s asemblerovou koncovkou .smali, což byl žádoucí soubor. V mém případě se jednalo o soubor:
DialerOrig/smali_classes13/com/android/incallui/call/CallRecorder.smal
Ten si otevřete a najděte řádek s příslušnou adresou 0x7f1100d8 a zakomentujete mříží volání funkce jejíž adresu jsme našli - tedy v mém případě jsem zkusil zakomentovat dva řádky:
const v4, 0x7f1100d8
new-array v5, v3, [Ljava/lang/Object;
iget-object v7, v0, Lcom/android/dialer/callrecord/CallRecording;->phoneNumber:Ljava/lang/String;
aput-object v7, v5, v6
# invoke-virtual {v2, v4, v5}, Landroid/content/res/Resources;->getString(I[Ljava/lang/Object;)Ljava/lang/String;
# move-result-object
Tím se podařilo vypnout veškeré notifikace o uloženém nahrávání.
Nyní je třeba upravený balík opět přeložit do apk a to příkazem:
$ apktool b DialerOrig
Je normální, že nově zkompilovaný balík uložený v adresáři DialerOrig/dist/DialerOrig.apk je asi poloviční velikosti než originální.
Aby šel balík nahrát do telefonu je nutné je podepsat. K tomu potřebujete certifkační autoritu, kterou lze vyrobit příkazem:
$ keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
a následně balík podepíšete:
$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore DialerOrig/dist/DialerOrig.apk alias_name
a zbývá poslední krok, nahrát balík do telefonu. Je vhodné před nahráním v telefonu ukončit aplikaci Dialer, přes "Vynucení ukončení" nebo jednoduše restartujete telefon a balík nainstalujete pomocí příkazu:
$ adb install DialerOrig/dist/DialerOrig.apk
Pokud se cokoliv pokazí. Stačí nový balík z telefonu odinstalovat. Přes ADB přemontovat opět /systém partition jako zapisovatelnou, soubor /system/priv-app/Dialer/DialerOrig.apk přejmenovat na původní a telefon restartovat.
Poznámka na konec. Nahrávání svých vlastních hovorů je v některých zemích, jako třeba Německo, zakázáno. To, ve kterých zemích je nahrávání telefonem znemožněno je definováno v souboru res/xml/call_record_states.xml. U nás je díky Bohu legální si nahrávat sám sebe, protože člověk nikdy neví, kdy se mu to může hodit jako důkaz.
Doufám, že návod někomu pomůže.