There are a handful of core system services that collect data from third-party ContentProviders by spinning them up and then caching the results locally in memory. However, if those apps are killed due to low-memory pressure, they lose that cached data and have to collect it again from scratch. It's impossible for those apps to maintain a correct cache when not running, since they'll miss out on Uri change notifications. To work around this, this change introducing a narrowly-scoped caching mechanism that maps from Uris to Bundles. The cache is isolated per-user and per-calling-package, and internally it's optimized to keep the Uri notification flow as fast as possible. Each Bundle is invalidated whenever a notification event for a Uri key is sent, or when the package hosting the provider is changed. This change also wires up DocumentsUI to use this new mechanism, which improves cold-start performance from 3300ms to 1800ms. The more DocumentsProviders a system has, the more pronounced this benefit is. Use BOOT_COMPLETED to build the cache at boot. Add more permission docs, send a missing extra in DATA_CLEARED broadcast. Bug: 18406595 Change-Id: If3eae14bb3c69a8b83a65f530e081efc3b34d4bc
122 lines
5.4 KiB
XML
122 lines
5.4 KiB
XML
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
package="com.android.documentsui">
|
|
|
|
<uses-permission android:name="android.permission.GET_APP_GRANTED_URI_PERMISSIONS" />
|
|
<uses-permission android:name="android.permission.MANAGE_DOCUMENTS" />
|
|
<uses-permission android:name="android.permission.REMOVE_TASKS" />
|
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
|
<uses-permission android:name="android.permission.CACHE_CONTENT" />
|
|
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
|
|
|
|
<application
|
|
android:name=".DocumentsApplication"
|
|
android:label="@string/app_label"
|
|
android:supportsRtl="true">
|
|
|
|
<activity
|
|
android:name=".DocumentsActivity"
|
|
android:theme="@style/DocumentsTheme"
|
|
android:icon="@drawable/ic_doc_text">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.OPEN_DOCUMENT" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.OPENABLE" />
|
|
<data android:mimeType="*/*" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.CREATE_DOCUMENT" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.OPENABLE" />
|
|
<data android:mimeType="*/*" />
|
|
</intent-filter>
|
|
<intent-filter android:priority="100">
|
|
<action android:name="android.intent.action.GET_CONTENT" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<category android:name="android.intent.category.OPENABLE" />
|
|
<data android:mimeType="*/*" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.OPEN_DOCUMENT_TREE" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
</intent-filter>
|
|
</activity>
|
|
|
|
<activity
|
|
android:name=".LauncherActivity"
|
|
android:theme="@android:style/Theme.NoDisplay"
|
|
android:icon="@drawable/ic_files_app"
|
|
android:label="@string/files_label">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
<category android:name="android.intent.category.LAUNCHER" />
|
|
</intent-filter>
|
|
</activity>
|
|
|
|
<activity
|
|
android:name=".FilesActivity"
|
|
android:theme="@style/DocumentsTheme"
|
|
android:icon="@drawable/ic_files_app"
|
|
android:label="@string/files_label"
|
|
android:documentLaunchMode="intoExisting">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.MAIN" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW_DOWNLOADS" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="android.provider.action.BROWSE" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<data android:mimeType="vnd.android.document/root" />
|
|
</intent-filter>
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.VIEW" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
<data android:mimeType="application/zip"
|
|
android:host="com.android.providers.downloads.documents"
|
|
android:scheme="content" />
|
|
<data android:mimeType="application/x-zip"
|
|
android:host="com.android.providers.downloads.documents"
|
|
android:scheme="content" />
|
|
<data android:mimeType="application/x-zip-compressed"
|
|
android:host="com.android.providers.downloads.documents"
|
|
android:scheme="content" />
|
|
</intent-filter>
|
|
</activity>
|
|
|
|
<activity
|
|
android:name=".OpenExternalDirectoryActivity"
|
|
android:theme="@android:style/Theme.Translucent.NoTitleBar">
|
|
<intent-filter>
|
|
<action android:name="android.os.storage.action.OPEN_EXTERNAL_DIRECTORY" />
|
|
<category android:name="android.intent.category.DEFAULT" />
|
|
</intent-filter>
|
|
</activity>
|
|
|
|
<provider
|
|
android:name=".RecentsProvider"
|
|
android:authorities="com.android.documentsui.recents"
|
|
android:exported="false"/>
|
|
|
|
<receiver android:name=".PackageReceiver">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" />
|
|
<action android:name="android.intent.action.PACKAGE_DATA_CLEARED" />
|
|
<data android:scheme="package" />
|
|
</intent-filter>
|
|
</receiver>
|
|
|
|
<receiver android:name=".BootReceiver">
|
|
<intent-filter>
|
|
<action android:name="android.intent.action.BOOT_COMPLETED" />
|
|
</intent-filter>
|
|
</receiver>
|
|
|
|
<service
|
|
android:name=".services.FileOperationService"
|
|
android:exported="false">
|
|
</service>
|
|
</application>
|
|
</manifest>
|