summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRicardo Cerqueira <cyanogenmod@cerqueira.org>2013-12-06 02:24:25 +0000
committerRicardo Cerqueira <cyanogenmod@cerqueira.org>2013-12-06 02:24:25 +0000
commit0f1f0d4f56931fe55cdb44db68e78af810e5374c (patch)
treead3fc589a8fe97e89b4f5aa9d4d4ef105c798b0a
parent722b8de9c0c05883e1b4416b54375398bf57addf (diff)
parente3e6b8b7ea7fd29c8fbf538fd6030e289cb7ca89 (diff)
downloadandroid_packages_apps_PackageInstaller-0f1f0d4f56931fe55cdb44db68e78af810e5374c.zip
android_packages_apps_PackageInstaller-0f1f0d4f56931fe55cdb44db68e78af810e5374c.tar.gz
android_packages_apps_PackageInstaller-0f1f0d4f56931fe55cdb44db68e78af810e5374c.tar.bz2
Merge tag 'android-4.4.1_r1' into HEAD
Android 4.4.1 Release 1
-rw-r--r--res/values-ar/strings.xml2
-rw-r--r--res/values-da/strings.xml4
-rw-r--r--res/values-fa/strings.xml2
-rw-r--r--res/values-hi/strings.xml34
-rw-r--r--res/values-iw/strings.xml2
-rw-r--r--src/com/android/packageinstaller/EventLogTags.logtags2
-rwxr-xr-xsrc/com/android/packageinstaller/InstallAppProgress.java1
-rw-r--r--src/com/android/packageinstaller/InstallFlowAnalytics.java124
-rw-r--r--src/com/android/packageinstaller/PackageInstallerActivity.java4
9 files changed, 141 insertions, 34 deletions
diff --git a/res/values-ar/strings.xml b/res/values-ar/strings.xml
index 6697f50..86dfbf5 100644
--- a/res/values-ar/strings.xml
+++ b/res/values-ar/strings.xml
@@ -34,7 +34,7 @@
<string name="install_failed" msgid="6579998651498970899">"التطبيق ليس مثبتًا."</string>
<string name="install_failed_invalid_apk" msgid="1287935707565682604">"يبدو أن الحزمة تالفة."</string>
<string name="install_failed_inconsistent_certificates" msgid="1517751954440692054">"هناك حزمة حالية ذات توقيع متضارب، تم تثبيتها من قبل بالاسم نفسه."</string>
- <string name="install_failed_older_sdk" msgid="7947925824732917665">"تعمل الحزمة فقط على إصدارات أحدث من Android."</string>
+ <string name="install_failed_older_sdk" msgid="7947925824732917665">"‏تعمل الحزمة فقط على إصدارات أحدث من Android."</string>
<string name="install_failed_cpu_abi_incompatible" product="tablet" msgid="7098684468842750800">"هذا التطبيق ليس متوافقًا مع جهازك اللوحي."</string>
<string name="install_failed_cpu_abi_incompatible" product="default" msgid="4433316303249711331">"لا يتوافق هذا التطبيق مع هاتفك."</string>
<string name="install_failed_file_not_found" msgid="1958430133396322619">"تم حذف الحزمة المحددة قبل اكتمال عملية التثبيت."</string>
diff --git a/res/values-da/strings.xml b/res/values-da/strings.xml
index 9d74a3b..a43bcf0 100644
--- a/res/values-da/strings.xml
+++ b/res/values-da/strings.xml
@@ -27,8 +27,8 @@
<string name="install_done" msgid="3682715442154357097">"Appen er installeret."</string>
<string name="install_confirm_question" msgid="7295206719219043890">"Vil du installere denne applikation? Den får adgang til:"</string>
<string name="install_confirm_question_no_perms" msgid="5918305641302873520">"Vil du installere denne applikation? Den kræver ingen særlig adgang."</string>
- <string name="install_confirm_question_update" msgid="4624159567361487964">"Vil du installere en opdatering til den eksisterende applikation? Dine eksisterende data mistes ikke. Den opdaterede applikation får adgang til:"</string>
- <string name="install_confirm_question_update_system" msgid="1302330093676416336">"Vil du installere en opdatering til den indbyggede applikation? Dine eksisterende data mistes ikke. Den opdaterede applikation får adgang til:"</string>
+ <string name="install_confirm_question_update" msgid="4624159567361487964">"Vil du installere en opdatering til den eksisterende app? Du mister ikke dine eksisterende data. Den opdaterede app kan gøre følgende:"</string>
+ <string name="install_confirm_question_update_system" msgid="1302330093676416336">"Vil du installere en opdatering til den indbyggede app? Du mister ikke dine eksisterende data. Den opdaterede app kan gøre følgende:"</string>
<string name="install_confirm_question_update_no_perms" msgid="4885928136844618944">"Vil du installere en opdatering til denne eksisterende applikation? Dine eksisterende data vil ikke gå tabt. Det kræver ikke nogen særlig adgang."</string>
<string name="install_confirm_question_update_system_no_perms" msgid="7676593512694724374">"Vil du installere en opdatering til denne indbyggede applikation? Dine eksisterende data vil ikke gå tabt. Det kræver ikke nogen særlig adgang."</string>
<string name="install_failed" msgid="6579998651498970899">"Appen blev ikke installeret."</string>
diff --git a/res/values-fa/strings.xml b/res/values-fa/strings.xml
index 5bd2e53..53fd7d8 100644
--- a/res/values-fa/strings.xml
+++ b/res/values-fa/strings.xml
@@ -34,7 +34,7 @@
<string name="install_failed" msgid="6579998651498970899">"برنامه نصب نشد."</string>
<string name="install_failed_invalid_apk" msgid="1287935707565682604">"این بسته به نظر می‌رسد خراب است."</string>
<string name="install_failed_inconsistent_certificates" msgid="1517751954440692054">"بسته فعلی با همین نام اما با امضای مختلف قبلاً نصب شده است."</string>
- <string name="install_failed_older_sdk" msgid="7947925824732917665">"این بسته فقط در نسخه‌های جدیدتر Android کار می‌کند."</string>
+ <string name="install_failed_older_sdk" msgid="7947925824732917665">"‏این بسته فقط در نسخه‌های جدیدتر Android کار می‌کند."</string>
<string name="install_failed_cpu_abi_incompatible" product="tablet" msgid="7098684468842750800">"این برنامه با رایانهٔ لوحی شما سازگار نیست."</string>
<string name="install_failed_cpu_abi_incompatible" product="default" msgid="4433316303249711331">"این برنامه با تلفن شما سازگار نیست."</string>
<string name="install_failed_file_not_found" msgid="1958430133396322619">"بسته مشخص شده قبل از تکمیل نصب حذف شده است."</string>
diff --git a/res/values-hi/strings.xml b/res/values-hi/strings.xml
index db3b364..ccffa03 100644
--- a/res/values-hi/strings.xml
+++ b/res/values-hi/strings.xml
@@ -20,23 +20,23 @@
<string name="next" msgid="3057143178373252333">"अगला"</string>
<string name="install" msgid="5896438203900042068">"इंस्‍टॉल करें"</string>
<string name="done" msgid="3889387558374211719">"पूर्ण"</string>
- <string name="security_settings_desc" msgid="2706691034244052604">"इस एप्स को यह करने दें:"</string>
+ <string name="security_settings_desc" msgid="2706691034244052604">"इस ऐप्स को यह करने दें:"</string>
<string name="cancel" msgid="8360346460165114585">"रद्द करें"</string>
<string name="unknown" msgid="4742479012767208045">"अज्ञात"</string>
<string name="installing" msgid="8613631001631998372">"इंस्‍टॉल कर रहा है…"</string>
- <string name="install_done" msgid="3682715442154357097">"एप्स इंस्‍टॉल हो गया."</string>
+ <string name="install_done" msgid="3682715442154357097">"ऐप्स इंस्‍टॉल हो गया."</string>
<string name="install_confirm_question" msgid="7295206719219043890">"क्‍या आप इस ऐप्स को इंस्‍टॉल करना चाहते हैं? इससे यहां पर पहुंच प्राप्त होगी:"</string>
<string name="install_confirm_question_no_perms" msgid="5918305641302873520">"क्‍या आप इस ऐप्स को इंस्‍टॉल करना चाहते हैं? इसके लिए किसी विशेष पहुंच की आवश्‍यकता नहीं है."</string>
<string name="install_confirm_question_update" msgid="4624159567361487964">"क्‍या आप इस मौजूदा एप के बारे में नई जानकारी इंस्‍टॉल करना चाहते हैं? आपका मौजूदा डेटा गुम नहीं होगा. नई जानकारी वाले एप से आपको इन पर पहुंच प्राप्त होगी:"</string>
<string name="install_confirm_question_update_system" msgid="1302330093676416336">"क्‍या आप इस अंतर्निहित एप के बारे में नई जानकारी इंस्‍टॉल करना चाहते हैं? आपका मौजूदा डेटा गुम नहीं होगा. नई जानकारी वाले ऐप्स से आपको इन पर पहुंच प्राप्त होगी:"</string>
- <string name="install_confirm_question_update_no_perms" msgid="4885928136844618944">"क्या आप इस मौजूदा एप्स में नई जानकारी इंस्टॉल करना चाहते हैं? आपका मौजूदा डेटा बना रहेगा. इसे किसी विशेष पहुंच की आवश्यकता नहीं होती."</string>
+ <string name="install_confirm_question_update_no_perms" msgid="4885928136844618944">"क्या आप इस मौजूदा ऐप्स में नई जानकारी इंस्टॉल करना चाहते हैं? आपका मौजूदा डेटा बना रहेगा. इसे किसी विशेष पहुंच की आवश्यकता नहीं होती."</string>
<string name="install_confirm_question_update_system_no_perms" msgid="7676593512694724374">"क्या आप इस अंतर्निहित एप में नई जानकारी इंस्टॉल करना चाहते हैं? आपका मौजूदा डेटा बना रहेगा. इसे किसी विशेष पहुंच की आवश्यकता नहीं होती."</string>
- <string name="install_failed" msgid="6579998651498970899">"एप्स इंस्‍टॉल नहीं हुआ."</string>
+ <string name="install_failed" msgid="6579998651498970899">"ऐप्स इंस्‍टॉल नहीं हुआ."</string>
<string name="install_failed_invalid_apk" msgid="1287935707565682604">"पैकेज दूषित दिखाई देता है."</string>
<string name="install_failed_inconsistent_certificates" msgid="1517751954440692054">"विरोधी हस्‍ताक्षर वाला समान नाम का एक मौजूदा पैकेज पहले से इंस्‍टॉल किया हुआ है."</string>
<string name="install_failed_older_sdk" msgid="7947925824732917665">"पैकेज केवल Android के नवीनतम संस्‍करणों पर कार्य करता है."</string>
- <string name="install_failed_cpu_abi_incompatible" product="tablet" msgid="7098684468842750800">"यह एप्स आपके टेबलेट के संगत नहीं है."</string>
- <string name="install_failed_cpu_abi_incompatible" product="default" msgid="4433316303249711331">"यह एप्स आपके फ़ोन के संगत नहीं है."</string>
+ <string name="install_failed_cpu_abi_incompatible" product="tablet" msgid="7098684468842750800">"यह ऐप्स आपके टेबलेट के संगत नहीं है."</string>
+ <string name="install_failed_cpu_abi_incompatible" product="default" msgid="4433316303249711331">"यह ऐप्स आपके फ़ोन के संगत नहीं है."</string>
<string name="install_failed_file_not_found" msgid="1958430133396322619">"नि‍र्दि‍ष्‍ट कि‍या गया पैकेज इंस्‍टॉल कि‍ए जाने से पहले ही हटा दि‍या गया था."</string>
<string name="install_failed_verify_failed" msgid="5567372439890440205">"पैकेज ने सत्‍यापन पास नहीं कि‍या और इंस्‍टॉल नहीं कि‍या जा सका."</string>
<string name="install_failed_verify_timeout" msgid="7083090219270140373">"इस पैकेज को सत्‍यापित करते समय समयबाह्य हो गया. इसे बाद में पुन: इंस्‍टॉल करने का प्रयास करें."</string>
@@ -48,23 +48,23 @@
<string name="unknown_apps_dlg_text" product="default" msgid="133213135679009316">"सुरक्षा के लिए, आपका फ़ोन अज्ञात स्रोतों से मिले एप्‍लि. के इंस्‍टॉलेशन को अवरुद्ध करने हेतु सेट है."</string>
<string name="ok" msgid="3468756155452870475">"ठीक है"</string>
<string name="settings" msgid="6743583734099755409">"सेटिंग"</string>
- <string name="allow_source_dlg_title" msgid="7568985073502399415">"एप्स के लिए नया स्रोत"</string>
+ <string name="allow_source_dlg_title" msgid="7568985073502399415">"ऐप्स के लिए नया स्रोत"</string>
<string name="allow_source_dlg_text" msgid="3927580956764099076">"<xliff:g id="APP_NAME">%1$s</xliff:g> अन्‍य एप्‍लि‍केशन इंस्‍टॉल करना चाहता है.\n\nइसकी अनुमति‍ अभी दें या बाद में?"</string>
- <string name="manage_applications" msgid="4033876279091996596">"एप्स प्रबंधित करें"</string>
- <string name="dlg_app_replacement_title" msgid="1232230739563820951">"एप्स बदलें?"</string>
- <string name="dlg_app_replacement_statement" msgid="2992911899989907492">"आप जिस एप्स को इंस्‍टॉल कर रहे हैं वह दूसरे एप्स को बदल देगा.\n\nआपका सभी पिछला उपयोगकर्ता डेटा सहेज लिया जाएगा."</string>
- <string name="dlg_sys_app_replacement_statement" msgid="1900046590819605929">"यह कोई सिस्‍टम एप्स है.\n\nआपका सभी पिछला उपयोगकर्ता डेटा सहेज लिया जाएगा."</string>
+ <string name="manage_applications" msgid="4033876279091996596">"ऐप्स प्रबंधित करें"</string>
+ <string name="dlg_app_replacement_title" msgid="1232230739563820951">"ऐप्स बदलें?"</string>
+ <string name="dlg_app_replacement_statement" msgid="2992911899989907492">"आप जिस ऐप्स को इंस्‍टॉल कर रहे हैं वह दूसरे ऐप्स को बदल देगा.\n\nआपका सभी पिछला उपयोगकर्ता डेटा सहेज लिया जाएगा."</string>
+ <string name="dlg_sys_app_replacement_statement" msgid="1900046590819605929">"यह कोई सिस्‍टम ऐप्स है.\n\nआपका सभी पिछला उपयोगकर्ता डेटा सहेज लिया जाएगा."</string>
<string name="out_of_space_dlg_title" msgid="7843674437613797326">"स्थान नहीं है"</string>
<string name="out_of_space_dlg_text" msgid="4774775404294282216">"<xliff:g id="APP_NAME">%1$s</xliff:g> को इंस्‍टॉल नहीं किया जा सका. कुछ स्‍थान रिक्त करें और पुन: प्रयास करें."</string>
<string name="dlg_ok" msgid="6944357727705699232">"ठीक है"</string>
- <string name="app_not_found_dlg_title" msgid="2692335460569505484">"एप्स नहीं मिला"</string>
- <string name="app_not_found_dlg_text" msgid="6107465056055095930">"एप्स, इंस्‍टॉल किए गए एप्स की सूची में नहीं मिला था."</string>
+ <string name="app_not_found_dlg_title" msgid="2692335460569505484">"ऐप्स नहीं मिला"</string>
+ <string name="app_not_found_dlg_text" msgid="6107465056055095930">"ऐप्स , इंस्‍टॉल किए गए ऐप्स की सूची में नहीं मिला था."</string>
<string name="uninstall_application_title" msgid="1860074100811653963">"ऐप्स अनइंस्‍टॉल करें"</string>
<string name="uninstall_update_title" msgid="4146940097553335390">"नई जानकारी अनइंस्‍टॉल करें"</string>
- <string name="uninstall_activity_text" msgid="6680688689803932550">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> निम्‍न एप्स का भाग है:"</string>
- <string name="uninstall_application_text" msgid="6691975835951187030">"क्‍या आप इस एप्स को अनइंस्‍टॉल करना चाहते हैं?"</string>
- <string name="uninstall_application_text_all_users" msgid="5574704453233525222">"क्या आप इस एप्स को "<b>"सभी"</b>" उपयोगकर्ताओं के लिए अनइंस्टॉल करना चाहते हैं? एप्स और उसके डेटा को उपकरण पर "<b>"सभी"</b>" उपयोगकर्ताओं से निकाल दिया जाएगा."</string>
- <string name="uninstall_update_text" msgid="2056387942084605027">"क्‍या आप इस एप्स को फ़ैक्‍टरी संस्‍करण से बदलना चाहते हैं?"</string>
+ <string name="uninstall_activity_text" msgid="6680688689803932550">"<xliff:g id="ACTIVITY_NAME">%1$s</xliff:g> निम्‍न ऐप्स का भाग है:"</string>
+ <string name="uninstall_application_text" msgid="6691975835951187030">"क्‍या आप इस ऐप्स को अनइंस्‍टॉल करना चाहते हैं?"</string>
+ <string name="uninstall_application_text_all_users" msgid="5574704453233525222">"क्या आप इस ऐप्स को "<b>"सभी"</b>" उपयोगकर्ताओं के लिए अनइंस्टॉल करना चाहते हैं? ऐप्स और उसके डेटा को उपकरण पर "<b>"सभी"</b>" उपयोगकर्ताओं से निकाल दिया जाएगा."</string>
+ <string name="uninstall_update_text" msgid="2056387942084605027">"क्‍या आप इस ऐप्स को फ़ैक्‍टरी संस्‍करण से बदलना चाहते हैं?"</string>
<string name="uninstalling" msgid="5556217435895938250">"अनइंस्‍टॉल कर रहा है…"</string>
<string name="uninstall_done" msgid="3792487853420281888">"अनइंस्‍टॉल करना पूर्ण हो गया."</string>
<string name="uninstall_failed" msgid="631122574306299512">"अनइंस्‍टॉल करना विफल."</string>
diff --git a/res/values-iw/strings.xml b/res/values-iw/strings.xml
index 0677005..a89dfe8 100644
--- a/res/values-iw/strings.xml
+++ b/res/values-iw/strings.xml
@@ -34,7 +34,7 @@
<string name="install_failed" msgid="6579998651498970899">"האפליקציה לא הותקנה."</string>
<string name="install_failed_invalid_apk" msgid="1287935707565682604">"נראה שהחבילה פגומה."</string>
<string name="install_failed_inconsistent_certificates" msgid="1517751954440692054">"כבר מותקנת חבילה קיימת באותו שם עם חתימה מתנגשת."</string>
- <string name="install_failed_older_sdk" msgid="7947925824732917665">"החבילה פועלת רק בגרסאות חדשות יותר של Android."</string>
+ <string name="install_failed_older_sdk" msgid="7947925824732917665">"‏החבילה פועלת רק בגרסאות חדשות יותר של Android."</string>
<string name="install_failed_cpu_abi_incompatible" product="tablet" msgid="7098684468842750800">"אפליקציה זו אינה תואמת לטאבלט שלך."</string>
<string name="install_failed_cpu_abi_incompatible" product="default" msgid="4433316303249711331">"אפליקציה זו אינה תואמת לטלפון שלך."</string>
<string name="install_failed_file_not_found" msgid="1958430133396322619">"החבילה שצוינה נמחקה לפני שההתקנה הושלמה."</string>
diff --git a/src/com/android/packageinstaller/EventLogTags.logtags b/src/com/android/packageinstaller/EventLogTags.logtags
index 0183148..8cbb1cc 100644
--- a/src/com/android/packageinstaller/EventLogTags.logtags
+++ b/src/com/android/packageinstaller/EventLogTags.logtags
@@ -3,4 +3,4 @@
option java_package com.android.packageinstaller
# APK install attempt via PackageInstaller (see InstallFlowAnalytics for format)
-90300 install_package_attempt (result_and_flags|1),(total_time|1|3),(time_till_pkg_info_obtained|1|3),(time_till_install_clicked|1|3)
+90300 install_package_attempt (result_and_flags|1),(total_time|1|3),(time_till_pkg_info_obtained|1|3),(time_till_install_clicked|1|3),(package_digest|3)
diff --git a/src/com/android/packageinstaller/InstallAppProgress.java b/src/com/android/packageinstaller/InstallAppProgress.java
index 83e4aa7..c8e4133 100755
--- a/src/com/android/packageinstaller/InstallAppProgress.java
+++ b/src/com/android/packageinstaller/InstallAppProgress.java
@@ -169,6 +169,7 @@ public class InstallAppProgress extends Activity implements View.OnClickListener
Intent intent = getIntent();
mAppInfo = intent.getParcelableExtra(PackageUtil.INTENT_ATTR_APPLICATION_INFO);
mInstallFlowAnalytics = intent.getParcelableExtra(EXTRA_INSTALL_FLOW_ANALYTICS);
+ mInstallFlowAnalytics.setContext(this);
mPackageURI = intent.getData();
final String scheme = mPackageURI.getScheme();
diff --git a/src/com/android/packageinstaller/InstallFlowAnalytics.java b/src/com/android/packageinstaller/InstallFlowAnalytics.java
index ac8e53a..2fc6db3 100644
--- a/src/com/android/packageinstaller/InstallFlowAnalytics.java
+++ b/src/com/android/packageinstaller/InstallFlowAnalytics.java
@@ -16,13 +16,27 @@
*/
package com.android.packageinstaller;
+import android.content.Context;
import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.SystemClock;
+import android.provider.Settings;
import android.util.EventLog;
import android.util.Log;
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import libcore.io.IoUtils;
+
/**
* Analytics about an attempt to install a package via {@link PackageInstallerActivity}.
*
@@ -125,9 +139,14 @@ public class InstallFlowAnalytics implements Parcelable {
*/
private long mEndTimestampMillis;
+ /** URI of the package being installed. */
+ private String mPackageUri;
+
/** Whether this attempt has been logged to the Event Log. */
private boolean mLogged;
+ private Context mContext;
+
public static final Parcelable.Creator<InstallFlowAnalytics> CREATOR =
new Parcelable.Creator<InstallFlowAnalytics>() {
@Override
@@ -151,6 +170,7 @@ public class InstallFlowAnalytics implements Parcelable {
mPackageInfoObtainedTimestampMillis = in.readLong();
mInstallButtonClickTimestampMillis = in.readLong();
mEndTimestampMillis = in.readLong();
+ mPackageUri = in.readString();
mLogged = readBoolean(in);
}
@@ -163,6 +183,7 @@ public class InstallFlowAnalytics implements Parcelable {
dest.writeLong(mPackageInfoObtainedTimestampMillis);
dest.writeLong(mInstallButtonClickTimestampMillis);
dest.writeLong(mEndTimestampMillis);
+ dest.writeString(mPackageUri);
writeBoolean(dest, mLogged);
}
@@ -179,6 +200,10 @@ public class InstallFlowAnalytics implements Parcelable {
return 0;
}
+ void setContext(Context context) {
+ mContext = context;
+ }
+
/** Sets whether the Unknown Sources setting is checked. */
void setInstallsFromUnknownSourcesPermitted(boolean permitted) {
setFlagState(FLAG_INSTALLS_FROM_UNKNOWN_SOURCES_PERMITTED, permitted);
@@ -230,6 +255,13 @@ public class InstallFlowAnalytics implements Parcelable {
}
/**
+ * Sets the URI of the package being installed.
+ */
+ void setPackageUri(String packageUri) {
+ mPackageUri = packageUri;
+ }
+
+ /**
* Gets whether an APK file is being installed.
*
* @return {@code true} if an APK file is being installed, {@code false} if an already
@@ -393,33 +425,65 @@ public class InstallFlowAnalytics implements Parcelable {
-mPackageManagerInstallResult);
}
- int resultAndFlags = (mResult & 0xff)
+ final int resultAndFlags = (mResult & 0xff)
| ((packageManagerInstallResultByte & 0xff) << 8)
| ((mFlags & 0xffff) << 16);
// Total elapsed time from start to end, in milliseconds.
- int totalElapsedTime =
+ final int totalElapsedTime =
clipUnsignedLongToUnsignedInt(mEndTimestampMillis - mStartTimestampMillis);
// Total elapsed time from start till information about the package being installed was
// obtained, in milliseconds.
- int elapsedTimeTillPackageInfoObtained = (isPackageInfoObtained())
+ final int elapsedTimeTillPackageInfoObtained = (isPackageInfoObtained())
? clipUnsignedLongToUnsignedInt(
mPackageInfoObtainedTimestampMillis - mStartTimestampMillis)
: 0;
// Total elapsed time from start till Install button clicked, in milliseconds
// milliseconds.
- int elapsedTimeTillInstallButtonClick = (isInstallButtonClicked())
+ final int elapsedTimeTillInstallButtonClick = (isInstallButtonClicked())
? clipUnsignedLongToUnsignedInt(
mInstallButtonClickTimestampMillis - mStartTimestampMillis)
: 0;
- EventLogTags.writeInstallPackageAttempt(
- resultAndFlags,
- totalElapsedTime,
- elapsedTimeTillPackageInfoObtained,
- elapsedTimeTillInstallButtonClick);
+ // If this user has consented to app verification, augment the logged event with the hash of
+ // the contents of the APK.
+ if (((mFlags & FLAG_FILE_URI) != 0)
+ && ((mFlags & FLAG_VERIFY_APPS_ENABLED) != 0)
+ && (isUserConsentToVerifyAppsGranted())) {
+ // Log the hash of the APK's contents.
+ // Reading the APK may take a while -- perform in background.
+ AsyncTask.THREAD_POOL_EXECUTOR.execute(new Runnable() {
+ @Override
+ public void run() {
+ byte[] digest = null;
+ try {
+ digest = getPackageContentsDigest();
+ } catch (IOException e) {
+ Log.w(TAG, "Failed to hash APK contents", e);
+ } finally {
+ String digestHex = (digest != null)
+ ? IntegralToString.bytesToHexString(digest, false)
+ : "";
+ EventLogTags.writeInstallPackageAttempt(
+ resultAndFlags,
+ totalElapsedTime,
+ elapsedTimeTillPackageInfoObtained,
+ elapsedTimeTillInstallButtonClick,
+ digestHex);
+ }
+ }
+ });
+ } else {
+ // Do not log the hash of the APK's contents
+ EventLogTags.writeInstallPackageAttempt(
+ resultAndFlags,
+ totalElapsedTime,
+ elapsedTimeTillPackageInfoObtained,
+ elapsedTimeTillInstallButtonClick,
+ "");
+ }
mLogged = true;
if (Log.isLoggable(TAG, Log.VERBOSE)) {
@@ -494,4 +558,46 @@ public class InstallFlowAnalytics implements Parcelable {
private boolean isFlagSet(int flag) {
return (mFlags & flag) == flag;
}
+
+ /**
+ * Checks whether the user has consented to app verification.
+ */
+ private boolean isUserConsentToVerifyAppsGranted() {
+ return Settings.Secure.getInt(
+ mContext.getContentResolver(),
+ Settings.Secure.PACKAGE_VERIFIER_USER_CONSENT, 0) != 0;
+ }
+
+ /**
+ * Gets the digest of the contents of the package being installed.
+ */
+ private byte[] getPackageContentsDigest() throws IOException {
+ File file = new File(Uri.parse(mPackageUri).getPath());
+ return getSha256ContentsDigest(file);
+ }
+
+ /**
+ * Gets the SHA-256 digest of the contents of the specified file.
+ */
+ private static byte[] getSha256ContentsDigest(File file) throws IOException {
+ MessageDigest digest;
+ try {
+ digest = MessageDigest.getInstance("SHA-256");
+ } catch (NoSuchAlgorithmException e) {
+ throw new RuntimeException("SHA-256 not available", e);
+ }
+
+ byte[] buf = new byte[8192];
+ InputStream in = null;
+ try {
+ in = new BufferedInputStream(new FileInputStream(file), buf.length);
+ int chunkSize;
+ while ((chunkSize = in.read(buf)) != -1) {
+ digest.update(buf, 0, chunkSize);
+ }
+ } finally {
+ IoUtils.closeQuietly(in);
+ }
+ return digest.digest();
+ }
} \ No newline at end of file
diff --git a/src/com/android/packageinstaller/PackageInstallerActivity.java b/src/com/android/packageinstaller/PackageInstallerActivity.java
index a08e792..a11e11e 100644
--- a/src/com/android/packageinstaller/PackageInstallerActivity.java
+++ b/src/com/android/packageinstaller/PackageInstallerActivity.java
@@ -39,7 +39,6 @@ import android.os.Bundle;
import android.os.SystemClock;
import android.provider.Settings;
import android.support.v4.view.ViewPager;
-import android.util.EventLog;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
@@ -51,7 +50,6 @@ import android.widget.TabHost;
import android.widget.TextView;
import java.io.File;
-import java.io.Serializable;
import java.util.List;
/*
@@ -422,12 +420,14 @@ public class PackageInstallerActivity extends Activity implements OnCancelListen
boolean requestFromUnknownSource = isInstallRequestFromUnknownSource(intent);
mInstallFlowAnalytics = new InstallFlowAnalytics();
+ mInstallFlowAnalytics.setContext(this);
mInstallFlowAnalytics.setStartTimestampMillis(SystemClock.elapsedRealtime());
mInstallFlowAnalytics.setInstallsFromUnknownSourcesPermitted(
isInstallingUnknownAppsAllowed());
mInstallFlowAnalytics.setInstallRequestFromUnknownSource(requestFromUnknownSource);
mInstallFlowAnalytics.setVerifyAppsEnabled(isVerifyAppsEnabled());
mInstallFlowAnalytics.setAppVerifierInstalled(isAppVerifierInstalled());
+ mInstallFlowAnalytics.setPackageUri(mPackageURI.toString());
final String scheme = mPackageURI.getScheme();
if (scheme != null && !"file".equals(scheme) && !"package".equals(scheme)) {