From f1b2785129b64a140764483901530f40716e53f5 Mon Sep 17 00:00:00 2001 From: Bill Yi Date: Wed, 30 Mar 2016 22:15:27 -0700 Subject: Import translations. DO NOT MERGE Change-Id: Id992a2cff5d431b5862f7c27f3823dbffe52f5c7 Auto-generated-cl: translation import --- tools/recovery_l10n/res/values-af/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-am/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ar/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-az-rAZ/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-b+sr+Latn/strings.xml | 10 ++++++++++ tools/recovery_l10n/res/values-be-rBY/strings.xml | 10 ++++++++++ tools/recovery_l10n/res/values-bg/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-bn-rBD/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-bs-rBA/strings.xml | 10 ++++++++++ tools/recovery_l10n/res/values-ca/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-cs/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-da/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-de/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-el/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-en-rAU/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-en-rGB/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-en-rIN/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-es-rUS/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-es/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-et-rEE/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-eu-rES/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-fa/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-fi/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-fr-rCA/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-fr/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-gl-rES/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-gu-rIN/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-hi/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-hr/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-hu/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-hy-rAM/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-in/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-is-rIS/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-it/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-iw/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ja/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ka-rGE/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-kk-rKZ/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-km-rKH/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-kn-rIN/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ko/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ky-rKG/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-lo-rLA/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-lt/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-lv/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-mk-rMK/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ml-rIN/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-mn-rMN/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-mr-rIN/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ms-rMY/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-my-rMM/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-nb/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ne-rNP/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-nl/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-pa-rIN/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-pl/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-pt-rBR/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-pt-rPT/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-pt/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ro/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ru/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-si-rLK/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-sk/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-sl/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-sq-rAL/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-sr/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-sv/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-sw/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ta-rIN/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-te-rIN/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-th/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-tl/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-tr/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-uk/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-ur-rPK/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-uz-rUZ/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-vi/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-zh-rCN/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-zh-rHK/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-zh-rTW/strings.xml | 10 ++++++---- tools/recovery_l10n/res/values-zu/strings.xml | 10 ++++++---- 81 files changed, 498 insertions(+), 312 deletions(-) create mode 100644 tools/recovery_l10n/res/values-b+sr+Latn/strings.xml create mode 100644 tools/recovery_l10n/res/values-be-rBY/strings.xml create mode 100644 tools/recovery_l10n/res/values-bs-rBA/strings.xml diff --git a/tools/recovery_l10n/res/values-af/strings.xml b/tools/recovery_l10n/res/values-af/strings.xml index d5264184a..1d7fb534f 100644 --- a/tools/recovery_l10n/res/values-af/strings.xml +++ b/tools/recovery_l10n/res/values-af/strings.xml @@ -1,8 +1,10 @@ - "Installeer tans stelselopdatering..." - "Vee tans uit..." - "Geen bevel." - "Fout!" + "Installeer tans stelselopdatering …" + "Vee tans uit …" + "Geen opdrag nie." + "Fout!" + + diff --git a/tools/recovery_l10n/res/values-am/strings.xml b/tools/recovery_l10n/res/values-am/strings.xml index cddb099bc..f654d6964 100644 --- a/tools/recovery_l10n/res/values-am/strings.xml +++ b/tools/recovery_l10n/res/values-am/strings.xml @@ -1,8 +1,10 @@ - "የስርዓት ዝማኔ በመጫን ላይ…" - "በመደምሰስ ላይ…" - "ምንም ትዕዛዝ የለም።" - "ስህተት!" + "የስርዓት ዝማኔን በመጫን ላይ…" + "በመደምሰስ ላይ…" + "ምንም ትዕዛዝ የለም።" + "ስህተት!" + + diff --git a/tools/recovery_l10n/res/values-ar/strings.xml b/tools/recovery_l10n/res/values-ar/strings.xml index d06b96644..29ebe5f72 100644 --- a/tools/recovery_l10n/res/values-ar/strings.xml +++ b/tools/recovery_l10n/res/values-ar/strings.xml @@ -1,8 +1,10 @@ - "جارٍ تثبيت تحديث النظام…" - "جارٍ المسح…" - "ليس هناك أي أمر." - "خطأ!" + "جارٍ تثبيت تحديث النظام…" + "جارٍ محو البيانات…" + "ليس هناك أي أمر." + "حدث خطأ!" + + diff --git a/tools/recovery_l10n/res/values-az-rAZ/strings.xml b/tools/recovery_l10n/res/values-az-rAZ/strings.xml index 3435573dc..810d0535f 100644 --- a/tools/recovery_l10n/res/values-az-rAZ/strings.xml +++ b/tools/recovery_l10n/res/values-az-rAZ/strings.xml @@ -1,8 +1,10 @@ - "Sistem güncəlləməsi quraşdırılır..." - "Silinir..." - "Əmr yoxdur." - "Xəta!" + "Sistem güncəlləməsi quraşdırılır..." + "Silinir..." + "Əmr yoxdur." + "Xəta!" + + diff --git a/tools/recovery_l10n/res/values-b+sr+Latn/strings.xml b/tools/recovery_l10n/res/values-b+sr+Latn/strings.xml new file mode 100644 index 000000000..30ba53891 --- /dev/null +++ b/tools/recovery_l10n/res/values-b+sr+Latn/strings.xml @@ -0,0 +1,10 @@ + + + "Ažuriranje sistema se instalira..." + "Briše se..." + "Nema komande." + "Greška!" + + + diff --git a/tools/recovery_l10n/res/values-be-rBY/strings.xml b/tools/recovery_l10n/res/values-be-rBY/strings.xml new file mode 100644 index 000000000..dcbaaa3de --- /dev/null +++ b/tools/recovery_l10n/res/values-be-rBY/strings.xml @@ -0,0 +1,10 @@ + + + "Усталёўка абнаўлення сістэмы…" + "Выдаленне..." + "Няма каманды." + "Памылка!" + + + diff --git a/tools/recovery_l10n/res/values-bg/strings.xml b/tools/recovery_l10n/res/values-bg/strings.xml index 004f3b93e..ff480b37a 100644 --- a/tools/recovery_l10n/res/values-bg/strings.xml +++ b/tools/recovery_l10n/res/values-bg/strings.xml @@ -1,8 +1,10 @@ - "Системната актуализация се инсталира…" - "Изтрива се…" - "Без команда." - "Грешка!" + "Системната актуализация се инсталира…" + "Изтрива се…" + "Без команда." + "Грешка!" + + diff --git a/tools/recovery_l10n/res/values-bn-rBD/strings.xml b/tools/recovery_l10n/res/values-bn-rBD/strings.xml index 4d2e590f4..f46c84d7b 100644 --- a/tools/recovery_l10n/res/values-bn-rBD/strings.xml +++ b/tools/recovery_l10n/res/values-bn-rBD/strings.xml @@ -1,8 +1,10 @@ - "সিস্টেম আপডেট ইনস্টল করা হচ্ছে…" - "মোছা হচ্ছে…" - "কোনো নির্দেশ নেই।" - "ত্রুটি!" + "সিস্টেম আপডেট ইনস্টল করা হচ্ছে…" + "মোছা হচ্ছে…" + "কোনো আদেশ নেই।" + "ত্রুটি!" + + diff --git a/tools/recovery_l10n/res/values-bs-rBA/strings.xml b/tools/recovery_l10n/res/values-bs-rBA/strings.xml new file mode 100644 index 000000000..e64e1440c --- /dev/null +++ b/tools/recovery_l10n/res/values-bs-rBA/strings.xml @@ -0,0 +1,10 @@ + + + "Sistem se ažurira…" + "Briše se…" + "Nema komande." + "Greška!" + + + diff --git a/tools/recovery_l10n/res/values-ca/strings.xml b/tools/recovery_l10n/res/values-ca/strings.xml index 5d7b652c5..d0a0d85fb 100644 --- a/tools/recovery_l10n/res/values-ca/strings.xml +++ b/tools/recovery_l10n/res/values-ca/strings.xml @@ -1,8 +1,10 @@ - "S\'està instal·lant l\'actualització del sistema..." - "S\'està esborrant..." - "Cap ordre." - "Error!" + "S\'està instal·lant l\'actualització del sistema…" + "S\'està esborrant…" + "No hi ha cap ordre." + "S\'ha produït un error" + + diff --git a/tools/recovery_l10n/res/values-cs/strings.xml b/tools/recovery_l10n/res/values-cs/strings.xml index 771235d04..04113bb7c 100644 --- a/tools/recovery_l10n/res/values-cs/strings.xml +++ b/tools/recovery_l10n/res/values-cs/strings.xml @@ -1,8 +1,10 @@ - "Instalace aktualizace systému..." - "Mazání…" - "Žádný příkaz." - "Chyba!" + "Instalace aktualizace systému…" + "Mazání…" + "Žádný příkaz." + "Chyba!" + + diff --git a/tools/recovery_l10n/res/values-da/strings.xml b/tools/recovery_l10n/res/values-da/strings.xml index c28a76fbd..90a4eb7f8 100644 --- a/tools/recovery_l10n/res/values-da/strings.xml +++ b/tools/recovery_l10n/res/values-da/strings.xml @@ -1,8 +1,10 @@ - "Systemopdateringen installeres…" - "Sletter…" - "Ingen kommando." - "Fejl!" + "Installerer systemopdateringen…" + "Sletter…" + "Ingen kommando." + "Fejl!" + + diff --git a/tools/recovery_l10n/res/values-de/strings.xml b/tools/recovery_l10n/res/values-de/strings.xml index 02d259059..e38b2e3f8 100644 --- a/tools/recovery_l10n/res/values-de/strings.xml +++ b/tools/recovery_l10n/res/values-de/strings.xml @@ -1,8 +1,10 @@ - "Systemupdate wird installiert…" - "Wird gelöscht…" - "Kein Befehl" - "Fehler" + "Systemupdate wird installiert…" + "Wird gelöscht…" + "Kein Befehl." + "Fehler" + + diff --git a/tools/recovery_l10n/res/values-el/strings.xml b/tools/recovery_l10n/res/values-el/strings.xml index aa2626b4b..6cc6355e4 100644 --- a/tools/recovery_l10n/res/values-el/strings.xml +++ b/tools/recovery_l10n/res/values-el/strings.xml @@ -1,8 +1,10 @@ - "Εγκατάσταση ενημέρωσης συστήματος…" - "Διαγραφή…" - "Καμία εντολή." - "Σφάλμα!" + "Εγκατάσταση ενημέρωσης συστήματος…" + "Διαγραφή…" + "Καμία εντολή." + "Σφάλμα!" + + diff --git a/tools/recovery_l10n/res/values-en-rAU/strings.xml b/tools/recovery_l10n/res/values-en-rAU/strings.xml index b70d678c1..97a6efdf6 100644 --- a/tools/recovery_l10n/res/values-en-rAU/strings.xml +++ b/tools/recovery_l10n/res/values-en-rAU/strings.xml @@ -1,8 +1,10 @@ - "Installing system update…" - "Erasing…" - "No command." - "Error!" + "Installing system update…" + "Wiping…" + "No command." + "Error!" + + diff --git a/tools/recovery_l10n/res/values-en-rGB/strings.xml b/tools/recovery_l10n/res/values-en-rGB/strings.xml index b70d678c1..97a6efdf6 100644 --- a/tools/recovery_l10n/res/values-en-rGB/strings.xml +++ b/tools/recovery_l10n/res/values-en-rGB/strings.xml @@ -1,8 +1,10 @@ - "Installing system update…" - "Erasing…" - "No command." - "Error!" + "Installing system update…" + "Wiping…" + "No command." + "Error!" + + diff --git a/tools/recovery_l10n/res/values-en-rIN/strings.xml b/tools/recovery_l10n/res/values-en-rIN/strings.xml index b70d678c1..97a6efdf6 100644 --- a/tools/recovery_l10n/res/values-en-rIN/strings.xml +++ b/tools/recovery_l10n/res/values-en-rIN/strings.xml @@ -1,8 +1,10 @@ - "Installing system update…" - "Erasing…" - "No command." - "Error!" + "Installing system update…" + "Wiping…" + "No command." + "Error!" + + diff --git a/tools/recovery_l10n/res/values-es-rUS/strings.xml b/tools/recovery_l10n/res/values-es-rUS/strings.xml index 256272ac7..7c50f25df 100644 --- a/tools/recovery_l10n/res/values-es-rUS/strings.xml +++ b/tools/recovery_l10n/res/values-es-rUS/strings.xml @@ -1,8 +1,10 @@ - "Instalando actualización del sistema…" - "Borrando…" - "Ningún comando" - "Error" + "Instalando actualización del sistema…" + "Borrando…" + "Ningún comando" + "Error" + + diff --git a/tools/recovery_l10n/res/values-es/strings.xml b/tools/recovery_l10n/res/values-es/strings.xml index 323f05505..5f116ca2b 100644 --- a/tools/recovery_l10n/res/values-es/strings.xml +++ b/tools/recovery_l10n/res/values-es/strings.xml @@ -1,8 +1,10 @@ - "Instalando actualización del sistema…" - "Borrando…" - "Sin comandos" - "Error" + "Instalando actualización del sistema…" + "Borrando…" + "Sin comandos" + "Error" + + diff --git a/tools/recovery_l10n/res/values-et-rEE/strings.xml b/tools/recovery_l10n/res/values-et-rEE/strings.xml index 407a53d67..52bef8a57 100644 --- a/tools/recovery_l10n/res/values-et-rEE/strings.xml +++ b/tools/recovery_l10n/res/values-et-rEE/strings.xml @@ -1,8 +1,10 @@ - "Süsteemivärskenduste installimine ..." - "Kustutamine ..." - "Käsk puudub." - "Viga!" + "Süsteemivärskenduste installimine …" + "Kustutamine …" + "Käsk puudub." + "Viga!" + + diff --git a/tools/recovery_l10n/res/values-eu-rES/strings.xml b/tools/recovery_l10n/res/values-eu-rES/strings.xml index 08d9c0672..895ade199 100644 --- a/tools/recovery_l10n/res/values-eu-rES/strings.xml +++ b/tools/recovery_l10n/res/values-eu-rES/strings.xml @@ -1,8 +1,10 @@ - "Sistemaren eguneratzea instalatzen…" - "Ezabatzen…" - "Ez dago agindurik." - "Errorea!" + "Sistemaren eguneratzea instalatzen…" + "Ezabatzen…" + "Ez dago agindurik." + "Errorea" + + diff --git a/tools/recovery_l10n/res/values-fa/strings.xml b/tools/recovery_l10n/res/values-fa/strings.xml index dd002face..b97474bad 100644 --- a/tools/recovery_l10n/res/values-fa/strings.xml +++ b/tools/recovery_l10n/res/values-fa/strings.xml @@ -1,8 +1,10 @@ - "در حال نصب به‌روزرسانی سیستم ..." - "پاک کردن..." - "فرمانی موجود نیست." - "خطا!" + "در حال نصب به‌روزرسانی سیستم ..." + "پاک کردن..." + "فرمانی موجود نیست." + "خطا!" + + diff --git a/tools/recovery_l10n/res/values-fi/strings.xml b/tools/recovery_l10n/res/values-fi/strings.xml index b77417a98..8d2dc1cde 100644 --- a/tools/recovery_l10n/res/values-fi/strings.xml +++ b/tools/recovery_l10n/res/values-fi/strings.xml @@ -1,8 +1,10 @@ - "Asennetaan järjestelmäpäivitystä..." - "Tyhjennetään..." - "Ei komentoa." - "Virhe!" + "Asennetaan järjestelmäpäivitystä…" + "Tyhjennetään…" + "Ei komentoa" + "Virhe!" + + diff --git a/tools/recovery_l10n/res/values-fr-rCA/strings.xml b/tools/recovery_l10n/res/values-fr-rCA/strings.xml index f2a85d86a..1047287bc 100644 --- a/tools/recovery_l10n/res/values-fr-rCA/strings.xml +++ b/tools/recovery_l10n/res/values-fr-rCA/strings.xml @@ -1,8 +1,10 @@ - "Installation de la mise à jour du système en cours…" - "Effacement en cours…" - "Aucune commande." - "Erreur!" + "Installation de la mise à jour système en cours..." + "Suppression en cours..." + "Aucune commande." + "Erreur!" + + diff --git a/tools/recovery_l10n/res/values-fr/strings.xml b/tools/recovery_l10n/res/values-fr/strings.xml index cdb4a2668..b618b5cc0 100644 --- a/tools/recovery_l10n/res/values-fr/strings.xml +++ b/tools/recovery_l10n/res/values-fr/strings.xml @@ -1,8 +1,10 @@ - "Installation de la mise à jour du système en cours…" - "Effacement en cours…" - "Aucune commande." - "Erreur !" + "Installation de la mise à jour du système…" + "Effacement…" + "Aucune commande." + "Erreur !" + + diff --git a/tools/recovery_l10n/res/values-gl-rES/strings.xml b/tools/recovery_l10n/res/values-gl-rES/strings.xml index 7546fbda4..17f26cb7f 100644 --- a/tools/recovery_l10n/res/values-gl-rES/strings.xml +++ b/tools/recovery_l10n/res/values-gl-rES/strings.xml @@ -1,8 +1,10 @@ - "Instalando actualización do sistema..." - "Borrando..." - "Ningún comando" - "Erro" + "Instalando actualización do sistema..." + "Borrando..." + "Non hai ningún comando." + "Produciuse un erro" + + diff --git a/tools/recovery_l10n/res/values-gu-rIN/strings.xml b/tools/recovery_l10n/res/values-gu-rIN/strings.xml index a364b523c..8600678ea 100644 --- a/tools/recovery_l10n/res/values-gu-rIN/strings.xml +++ b/tools/recovery_l10n/res/values-gu-rIN/strings.xml @@ -1,8 +1,10 @@ - "સિસ્ટમ અપડેટ ઇન્સ્ટોલ કરી રહ્યાં છે…" - "કાઢી નાખી રહ્યાં છે…" - "કોઈ આદેશ નથી." - "ભૂલ!" + "સિસ્ટમ અપડેટ ઇન્સ્ટૉલ કરી રહ્યાં છે…" + "કાઢી નાખી રહ્યાં છે…" + "કોઈ આદેશ નથી." + "ભૂલ!" + + diff --git a/tools/recovery_l10n/res/values-hi/strings.xml b/tools/recovery_l10n/res/values-hi/strings.xml index a470d12b6..319ea6b79 100644 --- a/tools/recovery_l10n/res/values-hi/strings.xml +++ b/tools/recovery_l10n/res/values-hi/strings.xml @@ -1,8 +1,10 @@ - "सिस्टम के बारे में नई जानकारी मिल रही है…" - "मिटा रहा है…" - "कोई आदेश नहीं." - "त्रुटि!" + "सिस्टम अपडेट इंस्टॉल किया जा रहा है…" + "मिटा रहा है…" + "कोई आदेश नहीं." + "त्रुटि!" + + diff --git a/tools/recovery_l10n/res/values-hr/strings.xml b/tools/recovery_l10n/res/values-hr/strings.xml index 56225c015..b5d704031 100644 --- a/tools/recovery_l10n/res/values-hr/strings.xml +++ b/tools/recovery_l10n/res/values-hr/strings.xml @@ -1,8 +1,10 @@ - "Instaliranje ažuriranja sustava…" - "Brisanje…" - "Nema naredbe." - "Pogreška!" + "Instaliranje ažuriranja sustava…" + "Brisanje…" + "Nema naredbe." + "Pogreška!" + + diff --git a/tools/recovery_l10n/res/values-hu/strings.xml b/tools/recovery_l10n/res/values-hu/strings.xml index a64f50176..189095321 100644 --- a/tools/recovery_l10n/res/values-hu/strings.xml +++ b/tools/recovery_l10n/res/values-hu/strings.xml @@ -1,8 +1,10 @@ - "Rendszerfrissítés telepítése..." - "Törlés..." - "Nincs parancs." - "Hiba!" + "Rendszerfrissítés telepítése…" + "Törlés…" + "Nincs parancs." + "Hiba" + + diff --git a/tools/recovery_l10n/res/values-hy-rAM/strings.xml b/tools/recovery_l10n/res/values-hy-rAM/strings.xml index 7babe80c8..0ae1b11a0 100644 --- a/tools/recovery_l10n/res/values-hy-rAM/strings.xml +++ b/tools/recovery_l10n/res/values-hy-rAM/strings.xml @@ -1,8 +1,10 @@ - "Համակարգի թարմացման տեղադրում…" - "Ջնջում…" - "Հրամանը տրված չէ:" - "Սխալ" + "Համակարգի թարմացման տեղադրում…" + "Ջնջում…" + "Հրամանը տրված չէ:" + "Սխալ" + + diff --git a/tools/recovery_l10n/res/values-in/strings.xml b/tools/recovery_l10n/res/values-in/strings.xml index 93f9c2876..94f972070 100644 --- a/tools/recovery_l10n/res/values-in/strings.xml +++ b/tools/recovery_l10n/res/values-in/strings.xml @@ -1,8 +1,10 @@ - "Memasang pembaruan sistem…" - "Menghapus..." - "Tidak ada perintah." - "Kesalahan!" + "Memasang pemutakhiran sistem…" + "Menghapus..." + "Tidak ada perintah." + "Error!" + + diff --git a/tools/recovery_l10n/res/values-is-rIS/strings.xml b/tools/recovery_l10n/res/values-is-rIS/strings.xml index 926e85132..b29ed14fd 100644 --- a/tools/recovery_l10n/res/values-is-rIS/strings.xml +++ b/tools/recovery_l10n/res/values-is-rIS/strings.xml @@ -1,8 +1,10 @@ - "Setur upp kerfisuppfærslu…" - "Þurrkar út…" - "Engin skipun." - "Villa!" + "Setur upp kerfisuppfærslu…" + "Þurrkar út…" + "Engin skipun." + "Villa!" + + diff --git a/tools/recovery_l10n/res/values-it/strings.xml b/tools/recovery_l10n/res/values-it/strings.xml index 9defe36bd..64e77f20f 100644 --- a/tools/recovery_l10n/res/values-it/strings.xml +++ b/tools/recovery_l10n/res/values-it/strings.xml @@ -1,8 +1,10 @@ - "Installazione aggiornamento di sistema…" - "Cancellazione…" - "Nessun comando." - "Errore!" + "Installazione dell\'aggiornamento di sistema…" + "Cancellazione…" + "Nessun comando." + "Errore!" + + diff --git a/tools/recovery_l10n/res/values-iw/strings.xml b/tools/recovery_l10n/res/values-iw/strings.xml index e43bb20a9..775416c9b 100644 --- a/tools/recovery_l10n/res/values-iw/strings.xml +++ b/tools/recovery_l10n/res/values-iw/strings.xml @@ -1,8 +1,10 @@ - "מתקין עדכון מערכת…" - "מוחק…" - "אין פקודה." - "שגיאה!" + "מתקין עדכון מערכת…" + "מוחק…" + "אין פקודה." + "שגיאה!" + + diff --git a/tools/recovery_l10n/res/values-ja/strings.xml b/tools/recovery_l10n/res/values-ja/strings.xml index da0fa623a..7beb841c2 100644 --- a/tools/recovery_l10n/res/values-ja/strings.xml +++ b/tools/recovery_l10n/res/values-ja/strings.xml @@ -1,8 +1,10 @@ - "システムアップデートをインストールしています…" - "消去しています…" - "コマンドが指定されていません。" - "エラーです" + "システム アップデートをインストールしています…" + "消去しています…" + "コマンドが指定されていません。" + "エラーが発生しました。" + + diff --git a/tools/recovery_l10n/res/values-ka-rGE/strings.xml b/tools/recovery_l10n/res/values-ka-rGE/strings.xml index 2d27c1799..df775b710 100644 --- a/tools/recovery_l10n/res/values-ka-rGE/strings.xml +++ b/tools/recovery_l10n/res/values-ka-rGE/strings.xml @@ -1,8 +1,10 @@ - "სისტემის განახლების დაყენება…" - "მიმდინარეობს წაშლა…" - "ბრძანება არ არის." - "შეცდომა!" + "მიმდინარეობს სისტემის განახლების ინსტალაცია…" + "მიმდინარეობს ამოშლა…" + "ბრძანება არ არის." + "წარმოიქმნა შეცდომა!" + + diff --git a/tools/recovery_l10n/res/values-kk-rKZ/strings.xml b/tools/recovery_l10n/res/values-kk-rKZ/strings.xml index 3ca05b9eb..917eacfb8 100644 --- a/tools/recovery_l10n/res/values-kk-rKZ/strings.xml +++ b/tools/recovery_l10n/res/values-kk-rKZ/strings.xml @@ -1,8 +1,10 @@ - "Жүйе жаңартуларын орнатуда…" - "Өшіруде..." - "Пәрмен берілген жоқ." - "Қате!" + "Жүйе жаңартулары орнатылуда…" + "Өшіруде..." + "Пәрмен берілген жоқ." + "Қате!" + + diff --git a/tools/recovery_l10n/res/values-km-rKH/strings.xml b/tools/recovery_l10n/res/values-km-rKH/strings.xml index 0c1c272e0..ecbceff93 100644 --- a/tools/recovery_l10n/res/values-km-rKH/strings.xml +++ b/tools/recovery_l10n/res/values-km-rKH/strings.xml @@ -1,8 +1,10 @@ - "កំពុង​ដំឡើង​បច្ចុប្បន្នភាព​ប្រព័ន្ធ…" - "កំពុង​លុប…" - "គ្មាន​ពាក្យ​បញ្ជា។" - "កំហុស!" + "កំពុងអាប់ដេតប្រព័ន្ធ…" + "កំពុងលុប…" + "គ្មានពាក្យបញ្ជាទេ" + "កំហុស!" + + diff --git a/tools/recovery_l10n/res/values-kn-rIN/strings.xml b/tools/recovery_l10n/res/values-kn-rIN/strings.xml index be25d7a9d..a020bbf78 100644 --- a/tools/recovery_l10n/res/values-kn-rIN/strings.xml +++ b/tools/recovery_l10n/res/values-kn-rIN/strings.xml @@ -1,8 +1,10 @@ - "ಸಿಸ್ಟಂ ನವೀಕರಣವನ್ನು ಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ…" - "ಅಳಿಸಲಾಗುತ್ತಿದೆ…" - "ಯಾವುದೇ ಆದೇಶವಿಲ್ಲ." - "ದೋಷ!" + "ಸಿಸ್ಟಂ ನವೀಕರಣವನ್ನು ಸ್ಥಾಪಿಸಲಾಗುತ್ತಿದೆ…" + "ಅಳಿಸಲಾಗುತ್ತಿದೆ…ಯಾವಾಗಲೂ" + "ಯಾವುದೇ ಆದೇಶವಿಲ್ಲ." + "ದೋಷ!" + + diff --git a/tools/recovery_l10n/res/values-ko/strings.xml b/tools/recovery_l10n/res/values-ko/strings.xml index e46a87606..94dd405fa 100644 --- a/tools/recovery_l10n/res/values-ko/strings.xml +++ b/tools/recovery_l10n/res/values-ko/strings.xml @@ -1,8 +1,10 @@ - "시스템 업데이트 설치 중…" - "지우는 중…" - "명령어가 없습니다." - "오류!" + "시스템 업데이트 설치 중…" + "지우는 중…" + "명령어가 없습니다." + "오류!" + + diff --git a/tools/recovery_l10n/res/values-ky-rKG/strings.xml b/tools/recovery_l10n/res/values-ky-rKG/strings.xml index e2ced27a4..6e658e0c5 100644 --- a/tools/recovery_l10n/res/values-ky-rKG/strings.xml +++ b/tools/recovery_l10n/res/values-ky-rKG/strings.xml @@ -1,8 +1,10 @@ - "Системдик жаңыртууларды орнотуу…" - "Өчүрүлүүдө…" - "Буйрук берилген жок." - "Ката!" + "Тутум жаңыртуусу орнотулууда…" + "Тазаланууда…" + "Буйрук берилген жок." + "Ката!" + + diff --git a/tools/recovery_l10n/res/values-lo-rLA/strings.xml b/tools/recovery_l10n/res/values-lo-rLA/strings.xml index 5880cca75..41b5a7f3a 100644 --- a/tools/recovery_l10n/res/values-lo-rLA/strings.xml +++ b/tools/recovery_l10n/res/values-lo-rLA/strings.xml @@ -1,8 +1,10 @@ - "ກຳລັງຕິດຕັ້ງການອັບເດດລະບົບ..." - "ກຳລັງລຶບ..." - "ບໍ່ມີຄຳສັ່ງ." - "ຜິດພາດ!" + "ກຳລັງຕິດຕັ້ງການອັບເດດລະບົບ..." + "ກຳລັງລຶບ..." + "ບໍ່ມີຄຳສັ່ງ." + "ຜິດພາດ!" + + diff --git a/tools/recovery_l10n/res/values-lt/strings.xml b/tools/recovery_l10n/res/values-lt/strings.xml index 957ac7557..b5c61f6f1 100644 --- a/tools/recovery_l10n/res/values-lt/strings.xml +++ b/tools/recovery_l10n/res/values-lt/strings.xml @@ -1,8 +1,10 @@ - "Diegiamas sistemos naujinys…" - "Ištrinama…" - "Nėra komandos." - "Klaida!" + "Diegiamas sistemos naujinys…" + "Ištrinama…" + "Nėra jokių komandų." + "Klaida!" + + diff --git a/tools/recovery_l10n/res/values-lv/strings.xml b/tools/recovery_l10n/res/values-lv/strings.xml index c5d5b93a6..14f091d25 100644 --- a/tools/recovery_l10n/res/values-lv/strings.xml +++ b/tools/recovery_l10n/res/values-lv/strings.xml @@ -1,8 +1,10 @@ - "Notiek sistēmas atjauninājuma instalēšana..." - "Notiek dzēšana..." - "Nav nevienas komandas." - "Kļūda!" + "Notiek sistēmas atjauninājuma instalēšana…" + "Notiek dzēšana…" + "Nav nevienas komandas." + "Kļūda!" + + diff --git a/tools/recovery_l10n/res/values-mk-rMK/strings.xml b/tools/recovery_l10n/res/values-mk-rMK/strings.xml index d91a67cac..5189f5fce 100644 --- a/tools/recovery_l10n/res/values-mk-rMK/strings.xml +++ b/tools/recovery_l10n/res/values-mk-rMK/strings.xml @@ -1,8 +1,10 @@ - "Се инсталира ажурирање на системот..." - "Се брише..." - "Нема наредба." - "Грешка!" + "Се инсталира ажурирање на системот…" + "Се брише…" + "Нема наредба." + "Грешка!" + + diff --git a/tools/recovery_l10n/res/values-ml-rIN/strings.xml b/tools/recovery_l10n/res/values-ml-rIN/strings.xml index 38ebcd120..fd68bd568 100644 --- a/tools/recovery_l10n/res/values-ml-rIN/strings.xml +++ b/tools/recovery_l10n/res/values-ml-rIN/strings.xml @@ -1,8 +1,10 @@ - "സിസ്റ്റം അപ്‌ഡേറ്റ് ഇൻസ്റ്റാളുചെയ്യുന്നു…" - "മായ്‌ക്കുന്നു…" - "കമാൻഡ് ഒന്നുമില്ല." - "പിശക്!" + "സിസ്റ്റം അപ്‌ഡേറ്റ് ഇൻസ്റ്റാളുചെയ്യുന്നു…" + "മായ്‌ക്കുന്നു…" + "കമാൻഡ് ഒന്നുമില്ല." + "പിശക്!" + + diff --git a/tools/recovery_l10n/res/values-mn-rMN/strings.xml b/tools/recovery_l10n/res/values-mn-rMN/strings.xml index 463cafeaf..219dce2ae 100644 --- a/tools/recovery_l10n/res/values-mn-rMN/strings.xml +++ b/tools/recovery_l10n/res/values-mn-rMN/strings.xml @@ -1,8 +1,10 @@ - "Системийн шинэчлэлтийг суулгаж байна…" - "Арилгаж байна…" - "Команд байхгүй." - "Алдаа!" + "Системийн шинэчлэлтийг суулгаж байна…" + "Арилгаж байна…" + "Тушаал байхгүй." + "Алдаа!" + + diff --git a/tools/recovery_l10n/res/values-mr-rIN/strings.xml b/tools/recovery_l10n/res/values-mr-rIN/strings.xml index 25c5d0c57..4515d51ea 100644 --- a/tools/recovery_l10n/res/values-mr-rIN/strings.xml +++ b/tools/recovery_l10n/res/values-mr-rIN/strings.xml @@ -1,8 +1,10 @@ - "सिस्टम अद्यतन स्थापित करीत आहे..." - "मिटवित आहे…" - "कोणताही आदेश नाही." - "त्रुटी!" + "सिस्टम अद्यतन स्थापित करीत आहे..." + "मिटवित आहे…" + "कोणताही आदेश नाही." + "त्रुटी!" + + diff --git a/tools/recovery_l10n/res/values-ms-rMY/strings.xml b/tools/recovery_l10n/res/values-ms-rMY/strings.xml index f5635910e..cac6e7075 100644 --- a/tools/recovery_l10n/res/values-ms-rMY/strings.xml +++ b/tools/recovery_l10n/res/values-ms-rMY/strings.xml @@ -1,8 +1,10 @@ - "Memasang kemas kini sistem..." - "Memadam..." - "Tiada arahan." - "Ralat!" + "Memasang kemas kini sistem…" + "Memadam…" + "Tiada perintah." + "Ralat!" + + diff --git a/tools/recovery_l10n/res/values-my-rMM/strings.xml b/tools/recovery_l10n/res/values-my-rMM/strings.xml index 4091b1923..cfe31f1e9 100644 --- a/tools/recovery_l10n/res/values-my-rMM/strings.xml +++ b/tools/recovery_l10n/res/values-my-rMM/strings.xml @@ -1,8 +1,10 @@ - "စနစ်အား အဆင့်မြှင့်ခြင်း လုပ်ဆောင်နေသည်…" - "ဖျက်နေသည် ..." - "ညွှန်ကြားချက်မပေးထားပါ" - "မှားနေပါသည်!" + "စနစ်အပ်ဒိတ်အား ထည့်သွင်းနေသည်…" + "ဖျက်နေသည်…" + "ညွှန်ကြားချက်မပေးထားပါ" + "ချွတ်ယွင်းနေသည်။" + + diff --git a/tools/recovery_l10n/res/values-nb/strings.xml b/tools/recovery_l10n/res/values-nb/strings.xml index 4e89ad7c8..2abd4daac 100644 --- a/tools/recovery_l10n/res/values-nb/strings.xml +++ b/tools/recovery_l10n/res/values-nb/strings.xml @@ -1,8 +1,10 @@ - "Installerer systemoppdateringen ..." - "Sletter ..." - "Ingen kommando." - "Feil!" + "Installerer systemoppdateringen …" + "Tømmer …" + "Ingen kommando." + "Feil!" + + diff --git a/tools/recovery_l10n/res/values-ne-rNP/strings.xml b/tools/recovery_l10n/res/values-ne-rNP/strings.xml index 835f275b4..d6959b1f0 100644 --- a/tools/recovery_l10n/res/values-ne-rNP/strings.xml +++ b/tools/recovery_l10n/res/values-ne-rNP/strings.xml @@ -1,8 +1,10 @@ - "प्रणाली अद्यावधिक स्थापना गर्दै..." - "मेटाइदै..." - "कुनै आदेश छैन।" - "त्रुटि!" + "प्रणाली सम्बन्धी अद्यावधिकलाई स्थापना गर्दै..." + "मेटाउँदै…" + "कुनै आदेश छैन।" + "त्रुटि!" + + diff --git a/tools/recovery_l10n/res/values-nl/strings.xml b/tools/recovery_l10n/res/values-nl/strings.xml index be80a6b5c..9065aadd9 100644 --- a/tools/recovery_l10n/res/values-nl/strings.xml +++ b/tools/recovery_l10n/res/values-nl/strings.xml @@ -1,8 +1,10 @@ - "Systeemupdate installeren…" - "Wissen…" - "Geen opdracht." - "Fout!" + "Systeemupdate installeren…" + "Wissen…" + "Geen opdracht." + "Fout!" + + diff --git a/tools/recovery_l10n/res/values-pa-rIN/strings.xml b/tools/recovery_l10n/res/values-pa-rIN/strings.xml index 39ef32f55..6b127a36d 100644 --- a/tools/recovery_l10n/res/values-pa-rIN/strings.xml +++ b/tools/recovery_l10n/res/values-pa-rIN/strings.xml @@ -1,8 +1,10 @@ - "ਸਿਸਟਮ ਅਪਡੇਟ ਇੰਸਟੌਲ ਕਰ ਰਿਹਾ ਹੈ…" - "ਹਟਾ ਰਿਹਾ ਹੈ…" - "ਕੋਈ ਕਮਾਂਡ ਨਹੀਂ।" - "ਅਸ਼ੁੱਧੀ!" + "ਸਿਸਟਮ ਅੱਪਡੇਟ ਸਥਾਪਤ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…" + "ਸਾਫ਼ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ…" + "ਕੋਈ ਕਮਾਂਡ ਨਹੀਂ।" + "ਗੜਬੜ!" + + diff --git a/tools/recovery_l10n/res/values-pl/strings.xml b/tools/recovery_l10n/res/values-pl/strings.xml index b1e5b7b66..38838b2f6 100644 --- a/tools/recovery_l10n/res/values-pl/strings.xml +++ b/tools/recovery_l10n/res/values-pl/strings.xml @@ -1,8 +1,10 @@ - "Instaluję aktualizację systemu…" - "Usuwam…" - "Brak polecenia." - "Błąd" + "Instaluję aktualizację systemu…" + "Kasuję…" + "Brak polecenia." + "Błąd" + + diff --git a/tools/recovery_l10n/res/values-pt-rBR/strings.xml b/tools/recovery_l10n/res/values-pt-rBR/strings.xml index 3cc57234e..6577c802a 100644 --- a/tools/recovery_l10n/res/values-pt-rBR/strings.xml +++ b/tools/recovery_l10n/res/values-pt-rBR/strings.xml @@ -1,8 +1,10 @@ - "Instalando atualização do sistema..." - "Apagando..." - "Nenhum comando." - "Erro!" + "Instalando atualização do sistema..." + "Apagando..." + "Nenhum comando." + "Erro!" + + diff --git a/tools/recovery_l10n/res/values-pt-rPT/strings.xml b/tools/recovery_l10n/res/values-pt-rPT/strings.xml index 7d6bc18a9..ead7baa8e 100644 --- a/tools/recovery_l10n/res/values-pt-rPT/strings.xml +++ b/tools/recovery_l10n/res/values-pt-rPT/strings.xml @@ -1,8 +1,10 @@ - "A instalar a atualização do sistema..." - "A apagar…" - "Nenhum comando." - "Erro!" + "A instalar uma atualização do sistema..." + "A apagar…" + "Nenhum comando." + "Erro!" + + diff --git a/tools/recovery_l10n/res/values-pt/strings.xml b/tools/recovery_l10n/res/values-pt/strings.xml index 3cc57234e..6577c802a 100644 --- a/tools/recovery_l10n/res/values-pt/strings.xml +++ b/tools/recovery_l10n/res/values-pt/strings.xml @@ -1,8 +1,10 @@ - "Instalando atualização do sistema..." - "Apagando..." - "Nenhum comando." - "Erro!" + "Instalando atualização do sistema..." + "Apagando..." + "Nenhum comando." + "Erro!" + + diff --git a/tools/recovery_l10n/res/values-ro/strings.xml b/tools/recovery_l10n/res/values-ro/strings.xml index ad924da08..51633271a 100644 --- a/tools/recovery_l10n/res/values-ro/strings.xml +++ b/tools/recovery_l10n/res/values-ro/strings.xml @@ -1,8 +1,10 @@ - "Se instalează actualizarea de sistem…" - "Se efectuează ștergerea…" - "Nicio comandă." - "Eroare!" + "Se instalează actualizarea de sistem…" + "Se șterge…" + "Nicio comandă." + "Eroare!" + + diff --git a/tools/recovery_l10n/res/values-ru/strings.xml b/tools/recovery_l10n/res/values-ru/strings.xml index de0da4004..99421b100 100644 --- a/tools/recovery_l10n/res/values-ru/strings.xml +++ b/tools/recovery_l10n/res/values-ru/strings.xml @@ -1,8 +1,10 @@ - "Установка обновления системы…" - "Удаление…" - "Команды нет" - "Ошибка" + "Установка обновления системы…" + "Удаление…" + "Команды нет" + "Ошибка" + + diff --git a/tools/recovery_l10n/res/values-si-rLK/strings.xml b/tools/recovery_l10n/res/values-si-rLK/strings.xml index e717a9762..581d20768 100644 --- a/tools/recovery_l10n/res/values-si-rLK/strings.xml +++ b/tools/recovery_l10n/res/values-si-rLK/strings.xml @@ -1,8 +1,10 @@ - "පද්ධති යාවත්කාල ස්ථාපනය කරමින්…" - "මකමින්...." - "විධානයක් නොමැත." - "දෝෂය!" + "පද්ධති යාවත්කාල ස්ථාපනය කරමින්…" + "මකමින්...." + "විධානයක් නොමැත." + "දෝෂය!" + + diff --git a/tools/recovery_l10n/res/values-sk/strings.xml b/tools/recovery_l10n/res/values-sk/strings.xml index cae6bce7c..d741151bf 100644 --- a/tools/recovery_l10n/res/values-sk/strings.xml +++ b/tools/recovery_l10n/res/values-sk/strings.xml @@ -1,8 +1,10 @@ - "Inštalácia aktualizácie systému..." - "Prebieha mazanie..." - "Žiadny príkaz." - "Chyba!" + "Prebieha inštalácia aktualizácie systému..." + "Prebieha mazanie..." + "Žiadny príkaz." + "Chyba!" + + diff --git a/tools/recovery_l10n/res/values-sl/strings.xml b/tools/recovery_l10n/res/values-sl/strings.xml index 3f8d46fe6..75b71e172 100644 --- a/tools/recovery_l10n/res/values-sl/strings.xml +++ b/tools/recovery_l10n/res/values-sl/strings.xml @@ -1,8 +1,10 @@ - "Namestitev posodobitve sistema ..." - "Brisanje ..." - "Ni ukaza" - "Napaka" + "Namestitev posodobitve sistema ..." + "Brisanje ..." + "Ni ukaza." + "Napaka" + + diff --git a/tools/recovery_l10n/res/values-sq-rAL/strings.xml b/tools/recovery_l10n/res/values-sq-rAL/strings.xml index 29f8ef592..c574ebff4 100644 --- a/tools/recovery_l10n/res/values-sq-rAL/strings.xml +++ b/tools/recovery_l10n/res/values-sq-rAL/strings.xml @@ -1,8 +1,10 @@ - "Po instalon përditësimin e sistemit..." - "Po spastron..." - "Nuk ka komanda." - "Gabim!" + "Po instalon përditësimin e sistemit..." + "Po spastron..." + "Nuk ka komanda." + "Gabim!" + + diff --git a/tools/recovery_l10n/res/values-sr/strings.xml b/tools/recovery_l10n/res/values-sr/strings.xml index 955326053..df1847226 100644 --- a/tools/recovery_l10n/res/values-sr/strings.xml +++ b/tools/recovery_l10n/res/values-sr/strings.xml @@ -1,8 +1,10 @@ - "Инсталирање ажурирања система..." - "Брисање..." - "Нема команде." - "Грешка!" + "Ажурирање система се инсталира..." + "Брише се..." + "Нема команде." + "Грешка!" + + diff --git a/tools/recovery_l10n/res/values-sv/strings.xml b/tools/recovery_l10n/res/values-sv/strings.xml index f875d3008..7cb76df7d 100644 --- a/tools/recovery_l10n/res/values-sv/strings.xml +++ b/tools/recovery_l10n/res/values-sv/strings.xml @@ -1,8 +1,10 @@ - "Installerar systemuppdatering ..." - "Tar bort ..." - "Inget kommando." - "Fel!" + "Installerar systemuppdatering …" + "Rensar …" + "Inget kommando." + "Fel!" + + diff --git a/tools/recovery_l10n/res/values-sw/strings.xml b/tools/recovery_l10n/res/values-sw/strings.xml index 1a5304649..01e97b62d 100644 --- a/tools/recovery_l10n/res/values-sw/strings.xml +++ b/tools/recovery_l10n/res/values-sw/strings.xml @@ -1,8 +1,10 @@ - "Inasakinisha sasisho la mfumo…" - "Inafuta…" - "Hakuna amri." - "Hitilafu!" + "Inasakinisha sasisho la mfumo…" + "Inafuta…" + "Hakuna amri." + "Hitilafu fulani imetokea!" + + diff --git a/tools/recovery_l10n/res/values-ta-rIN/strings.xml b/tools/recovery_l10n/res/values-ta-rIN/strings.xml index f6f3e0e6a..ee8162453 100644 --- a/tools/recovery_l10n/res/values-ta-rIN/strings.xml +++ b/tools/recovery_l10n/res/values-ta-rIN/strings.xml @@ -1,8 +1,10 @@ - "முறைமை புதுப்பிப்பை நிறுவுகிறது…" - "அழிக்கிறது…" - "கட்டளை இல்லை." - "பிழை!" + "முறைமைப் புதுப்பிப்பை நிறுவுகிறது…" + "அழிக்கிறது…" + "கட்டளை இல்லை." + "பிழை!" + + diff --git a/tools/recovery_l10n/res/values-te-rIN/strings.xml b/tools/recovery_l10n/res/values-te-rIN/strings.xml index 6d0d17af5..fb9d04dcb 100644 --- a/tools/recovery_l10n/res/values-te-rIN/strings.xml +++ b/tools/recovery_l10n/res/values-te-rIN/strings.xml @@ -1,8 +1,10 @@ - "సిస్టమ్ నవీకరణను ఇన్‍స్టాల్ చేస్తోంది…" - "ఎరేజ్ చేస్తోంది…" - "ఆదేశం లేదు." - "లోపం!" + "సిస్టమ్ నవీకరణను ఇన్‍స్టాల్ చేస్తోంది…" + "డేటాను తొలగిస్తోంది…" + "ఆదేశం లేదు." + "లోపం సంభవించింది!" + + diff --git a/tools/recovery_l10n/res/values-th/strings.xml b/tools/recovery_l10n/res/values-th/strings.xml index bcdfa2b25..49b4c1138 100644 --- a/tools/recovery_l10n/res/values-th/strings.xml +++ b/tools/recovery_l10n/res/values-th/strings.xml @@ -1,8 +1,10 @@ - "กำลังติดตั้งการอัปเดตระบบ…" - "กำลังลบ…" - "ไม่มีคำสั่ง" - "ข้อผิดพลาด!" + "กำลังติดตั้งการอัปเดตระบบ…" + "กำลังลบ…" + "ไม่มีคำสั่ง" + "ข้อผิดพลาด!" + + diff --git a/tools/recovery_l10n/res/values-tl/strings.xml b/tools/recovery_l10n/res/values-tl/strings.xml index be2ba264c..da8c58087 100644 --- a/tools/recovery_l10n/res/values-tl/strings.xml +++ b/tools/recovery_l10n/res/values-tl/strings.xml @@ -1,8 +1,10 @@ - "Ini-install ang update sa system…" - "Binubura…" - "Walang command." - "Error!" + "Ini-install ang update sa system…" + "Binubura…" + "Walang command." + "Error!" + + diff --git a/tools/recovery_l10n/res/values-tr/strings.xml b/tools/recovery_l10n/res/values-tr/strings.xml index 8629029ca..d7ea934f5 100644 --- a/tools/recovery_l10n/res/values-tr/strings.xml +++ b/tools/recovery_l10n/res/values-tr/strings.xml @@ -1,8 +1,10 @@ - "Sistem güncellemesi yükleniyor…" - "Siliniyor…" - "Komut yok." - "Hata!" + "Sistem güncellemesi yükleniyor…" + "Siliniyor…" + "Komut yok." + "Hata!" + + diff --git a/tools/recovery_l10n/res/values-uk/strings.xml b/tools/recovery_l10n/res/values-uk/strings.xml index 762c06ff3..f6bc78608 100644 --- a/tools/recovery_l10n/res/values-uk/strings.xml +++ b/tools/recovery_l10n/res/values-uk/strings.xml @@ -1,8 +1,10 @@ - "Встановлення оновлення системи…" - "Стирання…" - "Немає команди." - "Помилка!" + "Установлюється оновлення системи…" + "Стирання…" + "Немає команди." + "Помилка!" + + diff --git a/tools/recovery_l10n/res/values-ur-rPK/strings.xml b/tools/recovery_l10n/res/values-ur-rPK/strings.xml index dc6eb6aa1..6997371cf 100644 --- a/tools/recovery_l10n/res/values-ur-rPK/strings.xml +++ b/tools/recovery_l10n/res/values-ur-rPK/strings.xml @@ -1,8 +1,10 @@ - "سسٹم اپ ڈیٹ انسٹال ہو رہا ہے…" - "صاف کر رہا ہے…" - "کوئی کمانڈ نہیں ہے۔" - "خرابی!" + "سسٹم اپ ڈیٹ انسٹال ہو رہی ہے…" + "مٹایا جا رہا ہے…" + "کوئی کمانڈ نہیں ہے۔" + "خرابی!" + + diff --git a/tools/recovery_l10n/res/values-uz-rUZ/strings.xml b/tools/recovery_l10n/res/values-uz-rUZ/strings.xml index 287448418..c9a0a5e15 100644 --- a/tools/recovery_l10n/res/values-uz-rUZ/strings.xml +++ b/tools/recovery_l10n/res/values-uz-rUZ/strings.xml @@ -1,8 +1,10 @@ - "Tizim yangilanishi o‘rnatilmoqda…" - "Tozalanmoqda…" - "Buyruq yo‘q." - "Xato!" + "Tizim yangilanishi o‘rnatilmoqda…" + "Tozalanmoqda…" + "Buyruq yo‘q." + "Xato!" + + diff --git a/tools/recovery_l10n/res/values-vi/strings.xml b/tools/recovery_l10n/res/values-vi/strings.xml index ab4005b7f..193da7058 100644 --- a/tools/recovery_l10n/res/values-vi/strings.xml +++ b/tools/recovery_l10n/res/values-vi/strings.xml @@ -1,8 +1,10 @@ - "Đang cài đặt bản cập nhật hệ thống…" - "Đang xóa…" - "Không có lệnh nào." - "Lỗi!" + "Đang cài đặt bản cập nhật hệ thống…" + "Đang xóa…" + "Không có lệnh nào." + "Lỗi!" + + diff --git a/tools/recovery_l10n/res/values-zh-rCN/strings.xml b/tools/recovery_l10n/res/values-zh-rCN/strings.xml index 2e1a6f57f..3fe5b755c 100644 --- a/tools/recovery_l10n/res/values-zh-rCN/strings.xml +++ b/tools/recovery_l10n/res/values-zh-rCN/strings.xml @@ -1,8 +1,10 @@ - "正在安装系统更新…" - "正在清除…" - "无命令。" - "出错了!" + "正在安装系统更新…" + "正在清空…" + "无命令。" + "出错了!" + + diff --git a/tools/recovery_l10n/res/values-zh-rHK/strings.xml b/tools/recovery_l10n/res/values-zh-rHK/strings.xml index f615c7a29..0355d3e7a 100644 --- a/tools/recovery_l10n/res/values-zh-rHK/strings.xml +++ b/tools/recovery_l10n/res/values-zh-rHK/strings.xml @@ -1,8 +1,10 @@ - "正在安裝系統更新…" - "正在清除…" - "沒有指令。" - "錯誤!" + "正在安裝系統更新…" + "正在清除…" + "沒有指令。" + "錯誤!" + + diff --git a/tools/recovery_l10n/res/values-zh-rTW/strings.xml b/tools/recovery_l10n/res/values-zh-rTW/strings.xml index f3f6a2c21..5d7268d0f 100644 --- a/tools/recovery_l10n/res/values-zh-rTW/strings.xml +++ b/tools/recovery_l10n/res/values-zh-rTW/strings.xml @@ -1,8 +1,10 @@ - "正在安裝系統更新…" - "清除中..." - "沒有指令。" - "錯誤!" + "正在安裝系統更新…" + "清除中…" + "沒有指令。" + "發生錯誤!" + + diff --git a/tools/recovery_l10n/res/values-zu/strings.xml b/tools/recovery_l10n/res/values-zu/strings.xml index 1f904a203..d5c7ea804 100644 --- a/tools/recovery_l10n/res/values-zu/strings.xml +++ b/tools/recovery_l10n/res/values-zu/strings.xml @@ -1,8 +1,10 @@ - "Ifaka isibuyekezo sesistimu…" - "Iyasula…" - "Awukho umyalo." - "Iphutha!" + "Ifaka isibuyekezo sesistimu…" + "Iyasula…" + "Awukho umyalo." + "Iphutha!" + + -- cgit v1.2.3 From 13aca598f8e93548fef36d87136e85ce8c9d18de Mon Sep 17 00:00:00 2001 From: Mark Salyzyn Date: Wed, 9 Mar 2016 14:58:16 -0800 Subject: recovery: use __android_log_pmsg_file_write for log files (cherry-pick from commit a4f701af93a5a739f34823cde0c493dfbc63537a) - Add call to __android_log_pmsg_file_write for recovery logging. - Add call to refresh pmsg if we reboot back into recovery and then allow overwrite of those logs. - Add a new one-time executable recovery-refresh that refreshes pmsg in post-fs phase of init. We rely on pmsg eventually scrolling off to age the content after recovery-persist has done its job. - Add a new one-time executable recovery-persist that transfers from pmsg to /data/misc/recovery/ directory if /cache is not mounted in post-fs-data phase of init. - Build and appropriately trigger the above two as required if BOARD_CACHEIMAGE_PARTITION_SIZE is undefined. - Add some simple unit tests NB: Test failure is expected on systems that do not deliver either the recovery-persist or recovery-refresh executables, e.g. systems with /cache. Tests also require a timely reboot sequence of test to truly verify, tests provide guidance on stderr to direct. Bug: 27176738 Change-Id: I17bb95980234984f6b2087fd5941b0a3126b706b --- Android.mk | 24 ++++++ recovery-persist.cpp | 200 +++++++++++++++++++++++++++++++++++++++++++ recovery-persist.rc | 3 + recovery-refresh.cpp | 128 +++++++++++++++++++++++++++ recovery-refresh.rc | 2 + recovery.cpp | 109 ++++++++++++++++++++--- tests/Android.mk | 2 + tests/unit/recovery_test.cpp | 92 ++++++++++++++++++++ 8 files changed, 548 insertions(+), 12 deletions(-) create mode 100644 recovery-persist.cpp create mode 100644 recovery-persist.rc create mode 100644 recovery-refresh.cpp create mode 100644 recovery-refresh.rc create mode 100644 tests/unit/recovery_test.cpp diff --git a/Android.mk b/Android.mk index 5b488ca6d..6c3ce5642 100644 --- a/Android.mk +++ b/Android.mk @@ -101,6 +101,30 @@ else LOCAL_STATIC_LIBRARIES += $(TARGET_RECOVERY_UI_LIB) endif +ifeq ($(BOARD_CACHEIMAGE_PARTITION_SIZE),) +LOCAL_REQUIRED_MODULES := recovery-persist recovery-refresh +endif + +include $(BUILD_EXECUTABLE) + +# recovery-persist (system partition dynamic executable run after /data mounts) +# =============================== +include $(CLEAR_VARS) +LOCAL_SRC_FILES := recovery-persist.cpp +LOCAL_MODULE := recovery-persist +LOCAL_SHARED_LIBRARIES := liblog libbase +LOCAL_CFLAGS := -Werror +LOCAL_INIT_RC := recovery-persist.rc +include $(BUILD_EXECUTABLE) + +# recovery-refresh (system partition dynamic executable run at init) +# =============================== +include $(CLEAR_VARS) +LOCAL_SRC_FILES := recovery-refresh.cpp +LOCAL_MODULE := recovery-refresh +LOCAL_SHARED_LIBRARIES := liblog +LOCAL_CFLAGS := -Werror +LOCAL_INIT_RC := recovery-refresh.rc include $(BUILD_EXECUTABLE) # All the APIs for testing diff --git a/recovery-persist.cpp b/recovery-persist.cpp new file mode 100644 index 000000000..8587e9a66 --- /dev/null +++ b/recovery-persist.cpp @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "recovery-persist" + +// +// Strictly to deal with reboot into system after OTA after /data +// mounts to pull the last pmsg file data and place it +// into /data/misc/recovery/ directory, rotating it in. +// +// Usage: recovery-persist [--force-persist] +// +// On systems without /cache mount, all file content representing in the +// recovery/ directory stored in /sys/fs/pstore/pmsg-ramoops-0 in logger +// format that reside in the LOG_ID_SYSTEM buffer at ANDROID_LOG_INFO +// priority or higher is transfered to the /data/misc/recovery/ directory. +// The content is matched and rotated in as need be. +// +// --force-persist ignore /cache mount, always rotate in the contents. +// + +#include +#include +#include +#include +#include + +#include + +#include /* Android Log Priority Tags */ +#include +#include +#include /* Android Log packet format */ +#include /* private pmsg functions */ + +static const char *LAST_LOG_FILE = "/data/misc/recovery/last_log"; +static const char *LAST_PMSG_FILE = "/sys/fs/pstore/pmsg-ramoops-0"; +static const char *LAST_KMSG_FILE = "/data/misc/recovery/last_kmsg"; +static const char *LAST_CONSOLE_FILE = "/sys/fs/pstore/console-ramoops-0"; + +static const int KEEP_LOG_COUNT = 10; + +// close a file, log an error if the error indicator is set +static void check_and_fclose(FILE *fp, const char *name) { + fflush(fp); + if (ferror(fp)) SLOGE("%s %s", name, strerror(errno)); + fclose(fp); +} + +static void copy_file(const char* source, const char* destination) { + FILE* dest_fp = fopen(destination, "w"); + if (dest_fp == nullptr) { + SLOGE("%s %s", destination, strerror(errno)); + } else { + FILE* source_fp = fopen(source, "r"); + if (source_fp != nullptr) { + char buf[4096]; + size_t bytes; + while ((bytes = fread(buf, 1, sizeof(buf), source_fp)) != 0) { + fwrite(buf, 1, bytes, dest_fp); + } + check_and_fclose(source_fp, source); + } + check_and_fclose(dest_fp, destination); + } +} + +static bool rotated = false; + +// Rename last_log -> last_log.1 -> last_log.2 -> ... -> last_log.$max. +// Similarly rename last_kmsg -> last_kmsg.1 -> ... -> last_kmsg.$max. +// Overwrite any existing last_log.$max and last_kmsg.$max. +static void rotate_logs(int max) { + // Logs should only be rotated once. + + if (rotated) { + return; + } + rotated = true; + + for (int i = max-1; i >= 0; --i) { + std::string old_log(LAST_LOG_FILE); + if (i > 0) { + old_log += "." + std::to_string(i); + } + std::string new_log(LAST_LOG_FILE); + new_log += "." + std::to_string(i+1); + + // Ignore errors if old_log doesn't exist. + rename(old_log.c_str(), new_log.c_str()); + + std::string old_kmsg(LAST_KMSG_FILE); + if (i > 0) { + old_kmsg += "." + std::to_string(i); + } + std::string new_kmsg(LAST_KMSG_FILE); + new_kmsg += "." + std::to_string(i+1); + + rename(old_kmsg.c_str(), new_kmsg.c_str()); + } +} + +ssize_t logsave( + log_id_t /* logId */, + char /* prio */, + const char *filename, + const char *buf, size_t len, + void * /* arg */) { + + std::string destination("/data/misc/"); + destination += filename; + + std::string buffer(buf, len); + + { + std::string content; + android::base::ReadFileToString(destination, &content); + + if (buffer.compare(content) == 0) { + return len; + } + } + + // ToDo: Any others that match? Are we pulling in multiple + // already-rotated files? Algorithm thus far is KISS: one file, + // one rotation allowed. + + rotate_logs(KEEP_LOG_COUNT); + + return android::base::WriteStringToFile(buffer, destination.c_str()); +} + +int main(int argc, char **argv) { + + /* Is /cache a mount?, we have been delivered where we are not wanted */ + /* + * Following code halves the size of the executable as compared to: + * + * load_volume_table(); + * has_cache = volume_for_path(CACHE_ROOT) != nullptr; + */ + bool has_cache = false; + static const char mounts_file[] = "/proc/mounts"; + FILE *fp = fopen(mounts_file, "r"); + if (!fp) { + SLOGV("%s %s", mounts_file, strerror(errno)); + } else { + char *line = NULL; + size_t len = 0; + ssize_t read; + while ((read = getline(&line, &len, fp)) != -1) { + if (strstr(line, " /cache ")) { + has_cache = true; + break; + } + } + free(line); + fclose(fp); + } + + if (has_cache) { + /* + * TBD: Future location to move content from + * /cache/recovery to /data/misc/recovery/ + */ + /* if --force-persist flag, then transfer pmsg data anyways */ + if ((argc <= 1) || !argv[1] || strcmp(argv[1], "--force-persist")) { + return 0; + } + } + + /* Is there something in pmsg? */ + if (access(LAST_PMSG_FILE, R_OK)) { + return 0; + } + + // Take last pmsg file contents and send it off to the logsave + __android_log_pmsg_file_read( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, "recovery/", logsave, NULL); + + /* Is there a last console log too? */ + if (rotated && !access(LAST_CONSOLE_FILE, R_OK)) { + copy_file(LAST_CONSOLE_FILE, LAST_KMSG_FILE); + } + + return 0; +} diff --git a/recovery-persist.rc b/recovery-persist.rc new file mode 100644 index 000000000..6761627d5 --- /dev/null +++ b/recovery-persist.rc @@ -0,0 +1,3 @@ +on post-fs-data + mkdir /data/misc/recovery 0770 system log + exec - system log -- /system/bin/recovery-persist diff --git a/recovery-refresh.cpp b/recovery-refresh.cpp new file mode 100644 index 000000000..70adc70ee --- /dev/null +++ b/recovery-refresh.cpp @@ -0,0 +1,128 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "recovery-refresh" + +// +// Strictly to deal with reboot into system after OTA, then +// reboot while in system before boot complete landing us back +// into recovery to continue with any mitigations with retained +// log history. This simply refreshes the pmsg files from +// the last pmsg file contents. +// +// Usage: +// recovery-refresh [--force-rotate|--rotate] +// +// All file content representing in the recovery/ directory stored in +// /sys/fs/pstore/pmsg-ramoops-0 in logger format that reside in the +// LOG_ID_SYSTEM buffer at ANDROID_LOG_INFO priority or higher is +// refreshed into /dev/pmsg0. This ensures that an unexpected reboot +// before recovery-persist is run will still contain the associated +// pmsg Android Logger content. +// +// --force-rotate recovery/last_kmsg and recovery.last_log files are +// rotated with . suffixes upwards. +// --rotate rotated only if rocovery/last_msg or recovery/last_log +// exist, otherwise perform 1:1 refresh. +// + +#include + +#include + +#include /* Android Log Priority Tags */ +#include /* Android Log packet format */ +#include /* private pmsg functions */ + +static const char LAST_KMSG_FILE[] = "recovery/last_kmsg"; +static const char LAST_LOG_FILE[] = "recovery/last_log"; + +static ssize_t logbasename( + log_id_t /* logId */, + char /* prio */, + const char *filename, + const char * /* buf */, size_t len, + void *arg) { + if (strstr(LAST_KMSG_FILE, filename) || + strstr(LAST_LOG_FILE, filename)) { + bool *doRotate = reinterpret_cast(arg); + *doRotate = true; + } + return len; +} + +static ssize_t logrotate( + log_id_t logId, + char prio, + const char *filename, + const char *buf, size_t len, + void *arg) { + bool *doRotate = reinterpret_cast(arg); + if (!*doRotate) { + return __android_log_pmsg_file_write(logId, prio, filename, buf, len); + } + + std::string name(filename); + size_t dot = name.find_last_of("."); + std::string sub = name.substr(0, dot); + + if (!strstr(LAST_KMSG_FILE, sub.c_str()) && + !strstr(LAST_LOG_FILE, sub.c_str())) { + return __android_log_pmsg_file_write(logId, prio, filename, buf, len); + } + + // filename rotation + if (dot == std::string::npos) { + name += ".1"; + } else { + std::string number = name.substr(dot + 1); + if (!isdigit(number.data()[0])) { + name += ".1"; + } else { + unsigned long long i = std::stoull(number); + name = sub + "." + std::to_string(i + 1); + } + } + + return __android_log_pmsg_file_write(logId, prio, name.c_str(), buf, len); +} + +int main(int argc, char **argv) { + static const char filter[] = "recovery/"; + static const char force_rotate_flag[] = "--force-rotate"; + static const char rotate_flag[] = "--rotate"; + ssize_t ret; + bool doRotate = false; + + // Take last pmsg contents and rewrite it to the current pmsg session. + if ((argc <= 1) || !argv[1] || + (((doRotate = strcmp(argv[1], rotate_flag))) && + strcmp(argv[1], force_rotate_flag))) { + doRotate = false; + } else if (!doRotate) { + // Do we need to rotate? + __android_log_pmsg_file_read( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, filter, + logbasename, &doRotate); + } + + // Take action to refresh pmsg contents + ret = __android_log_pmsg_file_read( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, filter, + logrotate, &doRotate); + + return (ret < 0) ? ret : 0; +} diff --git a/recovery-refresh.rc b/recovery-refresh.rc new file mode 100644 index 000000000..14b05cca4 --- /dev/null +++ b/recovery-refresh.rc @@ -0,0 +1,2 @@ +on post-fs + exec - system log -- /system/bin/recovery-refresh diff --git a/recovery.cpp b/recovery.cpp index 7620f1a00..508cd62ee 100644 --- a/recovery.cpp +++ b/recovery.cpp @@ -35,11 +35,14 @@ #include #include +#include /* Android Log Priority Tags */ #include #include #include #include #include +#include /* Android Log packet format */ +#include /* private pmsg functions */ #include @@ -381,6 +384,18 @@ static void save_kernel_log(const char* destination) { android::base::WriteStringToFile(buffer, destination); } +// write content to the current pmsg session. +static ssize_t __pmsg_write(const char *filename, const char *buf, size_t len) { + return __android_log_pmsg_file_write(LOG_ID_SYSTEM, ANDROID_LOG_INFO, + filename, buf, len); +} + +static void copy_log_file_to_pmsg(const char* source, const char* destination) { + std::string content; + android::base::ReadFileToString(source, &content); + __pmsg_write(destination, content.c_str(), content.length()); +} + // How much of the temp log we have copied to the copy in cache. static long tmplog_offset = 0; @@ -440,11 +455,6 @@ static void rotate_logs(int max) { } static void copy_logs() { - // We can do nothing for now if there's no /cache partition. - if (!has_cache) { - return; - } - // We only rotate and record the log of the current session if there are // actual attempts to modify the flash, such as wipes, installs from BCB // or menu selections. This is to avoid unnecessary rotation (and @@ -453,6 +463,15 @@ static void copy_logs() { return; } + // Always write to pmsg, this allows the OTA logs to be caught in logcat -L + copy_log_file_to_pmsg(TEMPORARY_LOG_FILE, LAST_LOG_FILE); + copy_log_file_to_pmsg(TEMPORARY_INSTALL_FILE, LAST_INSTALL_FILE); + + // We can do nothing for now if there's no /cache partition. + if (!has_cache) { + return; + } + rotate_logs(KEEP_LOG_COUNT); // Copy logs to cache so the system can find out what happened. @@ -489,13 +508,17 @@ finish_recovery(const char *send_intent) { // Save the locale to cache, so if recovery is next started up // without a --locale argument (eg, directly from the bootloader) // it will use the last-known locale. - if (locale != NULL && has_cache) { - LOGI("Saving locale \"%s\"\n", locale); - FILE* fp = fopen_path(LOCALE_FILE, "w"); - fwrite(locale, 1, strlen(locale), fp); - fflush(fp); - fsync(fileno(fp)); - check_and_fclose(fp, LOCALE_FILE); + if (locale != NULL) { + size_t len = strlen(locale); + __pmsg_write(LOCALE_FILE, locale, len); + if (has_cache) { + LOGI("Saving locale \"%s\"\n", locale); + FILE* fp = fopen_path(LOCALE_FILE, "w"); + fwrite(locale, 1, len, fp); + fflush(fp); + fsync(fileno(fp)); + check_and_fclose(fp, LOCALE_FILE); + } } copy_logs(); @@ -1188,7 +1211,69 @@ static void set_retry_bootloader_message(int retry_count, int argc, char** argv) set_bootloader_message(&boot); } +static ssize_t logbasename( + log_id_t /* logId */, + char /* prio */, + const char *filename, + const char * /* buf */, size_t len, + void *arg) { + if (strstr(LAST_KMSG_FILE, filename) || + strstr(LAST_LOG_FILE, filename)) { + bool *doRotate = reinterpret_cast(arg); + *doRotate = true; + } + return len; +} + +static ssize_t logrotate( + log_id_t logId, + char prio, + const char *filename, + const char *buf, size_t len, + void *arg) { + bool *doRotate = reinterpret_cast(arg); + if (!*doRotate) { + return __android_log_pmsg_file_write(logId, prio, filename, buf, len); + } + + std::string name(filename); + size_t dot = name.find_last_of("."); + std::string sub = name.substr(0, dot); + + if (!strstr(LAST_KMSG_FILE, sub.c_str()) && + !strstr(LAST_LOG_FILE, sub.c_str())) { + return __android_log_pmsg_file_write(logId, prio, filename, buf, len); + } + + // filename rotation + if (dot == std::string::npos) { + name += ".1"; + } else { + std::string number = name.substr(dot + 1); + if (!isdigit(number.data()[0])) { + name += ".1"; + } else { + unsigned long long i = std::stoull(number); + name = sub + "." + std::to_string(i + 1); + } + } + + return __android_log_pmsg_file_write(logId, prio, name.c_str(), buf, len); +} + int main(int argc, char **argv) { + // Take last pmsg contents and rewrite it to the current pmsg session. + static const char filter[] = "recovery/"; + // Do we need to rotate? + bool doRotate = false; + __android_log_pmsg_file_read( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, filter, + logbasename, &doRotate); + // Take action to refresh pmsg contents + __android_log_pmsg_file_read( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, filter, + logrotate, &doRotate); + // If this binary is started with the single argument "--adbd", // instead of being the normal recovery binary, it turns into kind // of a stripped-down version of adbd that only supports the diff --git a/tests/Android.mk b/tests/Android.mk index 9d83c9a49..eac3581ae 100644 --- a/tests/Android.mk +++ b/tests/Android.mk @@ -23,7 +23,9 @@ LOCAL_MODULE := recovery_unit_test LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk LOCAL_STATIC_LIBRARIES := libverifier LOCAL_SRC_FILES := unit/asn1_decoder_test.cpp +LOCAL_SRC_FILES += unit/recovery_test.cpp LOCAL_C_INCLUDES := bootable/recovery +LOCAL_SHARED_LIBRARIES := liblog include $(BUILD_NATIVE_TEST) # Component tests diff --git a/tests/unit/recovery_test.cpp b/tests/unit/recovery_test.cpp new file mode 100644 index 000000000..f397f258e --- /dev/null +++ b/tests/unit/recovery_test.cpp @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include + +#include +#include +#include +#include + +static const char myFilename[] = "/data/misc/recovery/inject.txt"; +static const char myContent[] = "Hello World\nWelcome to my recovery\n"; + +// Failure is expected on systems that do not deliver either the +// recovery-persist or recovery-refresh executables. Tests also require +// a reboot sequence of test to truly verify. + +static ssize_t __pmsg_fn(log_id_t logId, char prio, const char *filename, + const char *buf, size_t len, void *arg) { + EXPECT_EQ(LOG_ID_SYSTEM, logId); + EXPECT_EQ(ANDROID_LOG_INFO, prio); + EXPECT_EQ(0, NULL == strstr(myFilename,filename)); + EXPECT_EQ(0, strcmp(myContent, buf)); + EXPECT_EQ(sizeof(myContent), len); + EXPECT_EQ(0, NULL != arg); + return len; +} + +// recovery.refresh - May fail. Requires recovery.inject, two reboots, +// then expect success after second reboot. +TEST(recovery, refresh) { + EXPECT_EQ(0, access("/system/bin/recovery-refresh", F_OK)); + + ssize_t ret = __android_log_pmsg_file_read( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, "recovery/", __pmsg_fn, NULL); + if (ret == -ENOENT) { + EXPECT_LT(0, __android_log_pmsg_file_write( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, + myFilename, myContent, sizeof(myContent))); + fprintf(stderr, "injected test data, " + "requires two intervening reboots " + "to check for replication\n"); + } + EXPECT_EQ((ssize_t)sizeof(myContent), ret); +} + +// recovery.persist - Requires recovery.inject, then a reboot, then +// expect success after for this test on that boot. +TEST(recovery, persist) { + EXPECT_EQ(0, access("/system/bin/recovery-persist", F_OK)); + + ssize_t ret = __android_log_pmsg_file_read( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, "recovery/", __pmsg_fn, NULL); + if (ret == -ENOENT) { + EXPECT_LT(0, __android_log_pmsg_file_write( + LOG_ID_SYSTEM, ANDROID_LOG_INFO, + myFilename, myContent, sizeof(myContent))); + fprintf(stderr, "injected test data, " + "requires intervening reboot " + "to check for storage\n"); + } + + int fd = open(myFilename, O_RDONLY); + EXPECT_LE(0, fd); + + char buf[sizeof(myContent) + 32]; + ret = read(fd, buf, sizeof(buf)); + close(fd); + EXPECT_EQ(ret, (ssize_t)sizeof(myContent)); + EXPECT_EQ(0, strcmp(myContent, buf)); + if (fd >= 0) { + fprintf(stderr, "Removing persistent test data, " + "check if reconstructed on reboot\n"); + } + EXPECT_EQ(0, unlink(myFilename)); +} -- cgit v1.2.3