PackageParser.java revision 78d688369a2240009d3bbe4126996a973b2e2fe2
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content.pm; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser; 308d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapuimport android.os.Build; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PatternMatcher; 33aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapuimport android.provider.Settings; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 392269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn 402269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 42d63f7dbf5d30320e8fd4dd8056d245f7b1e818baKenny Rootimport java.io.BufferedInputStream; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 528d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshimaimport java.util.List; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser { 62a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn /** @hide */ 63a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public static class NewPermissionInfo { 64a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final String name; 65a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final int sdkVersion; 66a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final int fileVersion; 67a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 68a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public NewPermissionInfo(String name, int sdkVersion, int fileVersion) { 69a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.name = name; 70a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.sdkVersion = sdkVersion; 71a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.fileVersion = fileVersion; 72a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 73a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 74a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn /** 76a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * List of new permissions that have been added since 1.0. 77a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * NOTE: These must be declared in SDK version order, with permissions 78a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * added to older SDKs appearing before those added to newer SDKs. 79a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * @hide 80a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn */ 8145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] = 8245515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh new PackageParser.NewPermissionInfo[] { 835a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 8445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.os.Build.VERSION_CODES.DONUT, 0), 8545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE, 8645515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.os.Build.VERSION_CODES.DONUT, 0) 87a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn }; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mArchiveSourcePath; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mSeparateProcesses; 918d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu private static final int SDK_VERSION = Build.VERSION.SDK_INT; 928d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu private static final String SDK_CODENAME = "REL".equals(Build.VERSION.CODENAME) 938d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu ? null : Build.VERSION.CODENAME; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mParseError = PackageManager.INSTALL_SUCCEEDED; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Object mSync = new Object(); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static WeakReference<byte[]> mReadBuffer; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private static boolean sCompatibilityModeEnabled = true; 10190d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private static final int PARSE_DEFAULT_INSTALL_LOCATION = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 10269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima 1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParsePackageItemArgs { 1041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final Package owner; 1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] outError; 1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int nameRes; 1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int labelRes; 1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int iconRes; 10981cd2e90ccdda498234384c8207afe2213714e60Adam Powell final int logoRes; 1101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn String tag; 1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedArray sa; 1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParsePackageItemArgs(Package _owner, String[] _outError, 11581cd2e90ccdda498234384c8207afe2213714e60Adam Powell int _nameRes, int _labelRes, int _iconRes, int _logoRes) { 1161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = _owner; 1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outError = _outError; 1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn nameRes = _nameRes; 1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn labelRes = _labelRes; 1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn iconRes = _iconRes; 12181cd2e90ccdda498234384c8207afe2213714e60Adam Powell logoRes = _logoRes; 1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParseComponentArgs extends ParsePackageItemArgs { 1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] sepProcesses; 1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int processRes; 1288aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn final int descriptionRes; 1291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int enabledRes; 1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int flags; 1311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParseComponentArgs(Package _owner, String[] _outError, 13381cd2e90ccdda498234384c8207afe2213714e60Adam Powell int _nameRes, int _labelRes, int _iconRes, int _logoRes, 1348aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn String[] _sepProcesses, int _processRes, 1358aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn int _descriptionRes, int _enabledRes) { 13681cd2e90ccdda498234384c8207afe2213714e60Adam Powell super(_owner, _outError, _nameRes, _labelRes, _iconRes, _logoRes); 1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sepProcesses = _sepProcesses; 1381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn processRes = _processRes; 1398aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn descriptionRes = _descriptionRes; 1401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn enabledRes = _enabledRes; 1411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 143a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 144a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu /* Light weight package info. 145a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @hide 146a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu */ 147a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public static class PackageLite { 148a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public String packageName; 149a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public int installLocation; 150a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public String mScanPath; 151a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public PackageLite(String packageName, int installLocation) { 152a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu this.packageName = packageName; 153a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu this.installLocation = installLocation; 154a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 155a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 156a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 1571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParsePackageItemArgs mParseInstrumentationArgs; 1581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityArgs; 1591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityAliasArgs; 1601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseServiceArgs; 1611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseProviderArgs; 1621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** If set to true, we will only allow package files that exactly match 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the DTD. Otherwise, we try to get as much from the package as we 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can without failing. This should normally be set to false, to 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * support extensions to the DTD in future versions. */ 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean RIGID_PARSER = false; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "PackageParser"; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageParser(String archiveSourcePath) { 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = archiveSourcePath; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSeparateProcesses(String[] procs) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSeparateProcesses = procs; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean isPackageFilename(String name) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name.endsWith(".apk"); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Generate and return the {@link PackageInfo} for a parsed package. 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p the parsed package. 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags indicating which optional information is included. 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static PackageInfo generatePackageInfo(PackageParser.Package p, 19078d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn int gids[], int flags, long firstInstallTime, long lastUpdateTime) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo pi = new PackageInfo(); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.packageName = p.packageName; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionCode = p.mVersionCode; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionName = p.mVersionName; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserId = p.mSharedUserId; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserLabel = p.mSharedUserLabel; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = p.applicationInfo; 199117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu pi.installLocation = p.installLocation; 20078d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn pi.firstInstallTime = firstInstallTime; 20178d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn pi.lastUpdateTime = lastUpdateTime; 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_GIDS) != 0) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.gids = gids; 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.configPreferences.size(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.configPreferences = new ConfigurationInfo[N]; 20949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn p.configPreferences.toArray(pi.configPreferences); 21049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 21149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn N = p.reqFeatures != null ? p.reqFeatures.size() : 0; 21249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (N > 0) { 21349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pi.reqFeatures = new FeatureInfo[N]; 21449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn p.reqFeatures.toArray(pi.reqFeatures); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_ACTIVITIES) != 0) { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.activities.size(); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2207eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2217eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.activities = new ActivityInfo[N]; 2227eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2237eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2247eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2257eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.activities.get(i).info.enabled) num++; 2267eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2277eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.activities = new ActivityInfo[num]; 2287eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 229d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.activities.get(i); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 233d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.activities[j++] = generateActivityInfo(p.activities.get(i), flags); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_RECEIVERS) != 0) { 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.receivers.size(); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2417eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2427eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.receivers = new ActivityInfo[N]; 2437eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2447eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2457eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2467eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.receivers.get(i).info.enabled) num++; 2477eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2487eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.receivers = new ActivityInfo[num]; 2497eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 250d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.receivers.get(i); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 254d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.receivers[j++] = generateActivityInfo(p.receivers.get(i), flags); 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SERVICES) != 0) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.services.size(); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2627eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2637eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.services = new ServiceInfo[N]; 2647eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2657eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2667eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2677eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.services.get(i).info.enabled) num++; 2687eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2697eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.services = new ServiceInfo[num]; 2707eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 271d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Service service = p.services.get(i); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (service.info.enabled 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 275d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.services[j++] = generateServiceInfo(p.services.get(i), flags); 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PROVIDERS) != 0) { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.providers.size(); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2837eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2847eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.providers = new ProviderInfo[N]; 2857eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2867eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2877eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2887eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.providers.get(i).info.enabled) num++; 2897eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2907eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.providers = new ProviderInfo[num]; 2917eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 292d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Provider provider = p.providers.get(i); 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider.info.enabled 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 296d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.providers[j++] = generateProviderInfo(p.providers.get(i), flags); 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.instrumentation.size(); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation = new InstrumentationInfo[N]; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation[i] = generateInstrumentationInfo( 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.instrumentation.get(i), flags); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PERMISSIONS) != 0) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.permissions.size(); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions = new PermissionInfo[N]; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = p.requestedPermissions.size(); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions = new String[N]; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions[i] = p.requestedPermissions.get(i); 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SIGNATURES) != 0) { 328d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu int N = (p.mSignatures != null) ? p.mSignatures.length : 0; 329d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu if (N > 0) { 330d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.signatures = new Signature[N]; 331d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N); 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Certificate[] loadCertificates(JarFile jarFile, JarEntry je, 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We must read the stream for the JarEntry to retrieve 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // its certificates. 342d63f7dbf5d30320e8fd4dd8056d245f7b1e818baKenny Root InputStream is = new BufferedInputStream(jarFile.getInputStream(je)); 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (is.read(readBuffer, 0, readBuffer.length) != -1) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not using 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is.close(); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return je != null ? je.getCertificates() : null; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + je.getName() + " in " 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarFile.getName(), e); 3516e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn } catch (RuntimeException e) { 3526e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn Log.w(TAG, "Exception reading " + je.getName() + " in " 3536e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn + jarFile.getName(), e); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 358af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_IS_SYSTEM = 1<<0; 359af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_CHATTY = 1<<1; 360af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_MUST_BE_APK = 1<<2; 361af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_IGNORE_PROCESSES = 1<<3; 362af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_FORWARD_LOCK = 1<<4; 363af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_ON_SDCARD = 1<<5; 364806da1d46c94c71728b94dec75dec6519c962b5cDianne Hackborn public final static int PARSE_IS_SYSTEM_DIR = 1<<6; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getParseError() { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mParseError; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 370af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public Package parsePackage(File sourceFile, String destCodePath, 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayMetrics metrics, int flags) { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_SUCCEEDED; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = sourceFile.getPath(); 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!sourceFile.isFile()) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Skipping dir: " + mArchiveSourcePath); 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isPackageFilename(sourceFile.getName()) 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (flags&PARSE_MUST_BE_APK) != 0) { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) == 0) { 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We expect to have non-.apk files in the system dir, 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so don't warn about them. 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d( 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Scanning package: " + mArchiveSourcePath); 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean assetError = true; 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 399b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project int cookie = assmgr.addAssetPath(mArchiveSourcePath); 400b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if(cookie != 0) { 401b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assetError = false; 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to read AndroidManifest.xml of " 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mArchiveSourcePath, e); 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(assetError) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] errorText = new String[1]; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Package pkg = null; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Exception errorException = null; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXXX todo: need to figure out correct configuration. 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = new Resources(assmgr, metrics, null); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg = parsePackage(res, parser, flags, errorText); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project errorException = e; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (errorException != null) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, mArchiveSourcePath, errorException); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, mArchiveSourcePath + " (at " 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getPositionDescription() 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "): " + errorText[0]); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParseError == PackageManager.INSTALL_SUCCEEDED) { 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 447af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu // Set code and resource paths 448af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu pkg.mPath = destCodePath; 449af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu pkg.mScanPath = mArchiveSourcePath; 450af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu //pkg.applicationInfo.sourceDir = destCodePath; 451af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu //pkg.applicationInfo.publicSourceDir = destRes; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean collectCertificates(Package pkg, int flags) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<byte[]> readBufferRef; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer = null; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = mReadBuffer; 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBufferRef != null) { 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = null; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = readBufferRef.get(); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBuffer == null) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = new byte[8192]; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = new WeakReference<byte[]>(readBuffer); 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarFile jarFile = new JarFile(mArchiveSourcePath); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] certs = null; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this package comes from the system image, then we 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can trust it... we'll just use the AndroidManifest.xml 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to retrieve its signatures, not validating all of the 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // files. 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml"); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = loadCertificates(jarFile, jarEntry, readBuffer); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs == null) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarEntry.getName() + "; ignoring!"); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " certs=" + (certs != null ? certs.length : 0)); 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null) { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, " Public key: " 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + certs[i].getPublicKey().getEncoded() 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + certs[i].getPublicKey()); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Enumeration entries = jarFile.entries(); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (entries.hasMoreElements()) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarEntry je = (JarEntry)entries.nextElement(); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.isDirectory()) continue; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.getName().startsWith("META-INF/")) continue; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] localCerts = loadCertificates(jarFile, je, 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer); 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName() 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": certs=" + certs + " (" 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (certs != null ? certs.length : 0) + ")"); 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localCerts == null) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (certs == null) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = localCerts; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ensure all certificates match. 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<certs.length; i++) { 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean found = false; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<localCerts.length; j++) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs[i] != null && 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].equals(localCerts[j])) { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project found = true; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!found || certs.length != localCerts.length) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has mismatched certificates at entry " 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = readBufferRef; 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null && certs.length > 0) { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = new Signature[certs.length]; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures[i] = new Signature( 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].getEncoded()); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates; ignoring!"); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CertificateEncodingException e) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 588a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu /* 589a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * Utility method that retrieves just the package name and install 590a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * location from the apk location at the given file path. 591a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @param packageFilePath file location of the apk 592a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @param flags Special parse flags 593930d3af75f9e9663222f4c4a1d75b326cf811e35Kenny Root * @return PackageLite object with package information or null on failure. 594a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu */ 595a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public static PackageLite parsePackageLite(String packageFilePath, int flags) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cookie = assmgr.addAssetPath(packageFilePath); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to read AndroidManifest.xml of " 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageFilePath, e); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String errors[] = new String[1]; 610a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu PackageLite packageLite = null; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 612a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu packageLite = parsePackageLite(parser, attrs, flags, errors); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, packageFilePath, e); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException e) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, packageFilePath, e); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 621a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (packageLite == null) { 622a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu Log.e(TAG, "parsePackageLite error: " + errors[0]); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 625a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return packageLite; 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String validateName(String name, boolean requiresSeparator) { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = name.length(); 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasSep = false; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean front = true; 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final char c = name.charAt(i); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = false; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!front) { 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= '0' && c <= '9') || c == '_') { 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasSep = true; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = true; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "bad character '" + c + "'"; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasSep || !requiresSeparator 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? null : "must have at least one '.' separator"; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String parsePackageName(XmlPullParser parser, 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs, int flags, String[] outError) 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException, XmlPullParserException { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.START_TAG 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type != parser.END_DOCUMENT) { 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != parser.START_TAG) { 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No start tag found"; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v( 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Root element name: '" + parser.getName() + "'"); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parser.getName().equals("manifest")) { 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No <manifest> tag"; 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = attrs.getAttributeValue(null, "package"); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null || pkgName.length() == 0) { 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not specify package"; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(pkgName, true); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad package name \"" 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkgName + "\": " + nameError; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkgName.intern(); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu private static PackageLite parsePackageLite(XmlPullParser parser, 690a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu AttributeSet attrs, int flags, String[] outError) 691a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu throws IOException, XmlPullParserException { 692a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 693a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int type; 694a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu while ((type=parser.next()) != parser.START_TAG 695a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu && type != parser.END_DOCUMENT) { 696a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu ; 697a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 698a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 699a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (type != parser.START_TAG) { 700a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "No start tag found"; 701a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 702a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 703a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v( 704a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu TAG, "Root element name: '" + parser.getName() + "'"); 705a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (!parser.getName().equals("manifest")) { 706a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "No <manifest> tag"; 707a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 708a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 709a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String pkgName = attrs.getAttributeValue(null, "package"); 710a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (pkgName == null || pkgName.length() == 0) { 711a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "<manifest> does not specify package"; 712a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 713a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 714a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String nameError = validateName(pkgName, true); 715a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (nameError != null && !"android".equals(pkgName)) { 716a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "<manifest> specifies bad package name \"" 717a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu + pkgName + "\": " + nameError; 718a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 719a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 72090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int installLocation = PARSE_DEFAULT_INSTALL_LOCATION; 721a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu for (int i = 0; i < attrs.getAttributeCount(); i++) { 722a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String attr = attrs.getAttributeName(i); 723a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (attr.equals("installLocation")) { 724a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu installLocation = attrs.getAttributeIntValue(i, 72590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu PARSE_DEFAULT_INSTALL_LOCATION); 726a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu break; 727a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 728a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 729a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return new PackageLite(pkgName.intern(), installLocation); 730a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 731a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temporary. 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public Signature stringToSignature(String str) { 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = str.length(); 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] sig = new byte[N]; 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sig[i] = (byte)str.charAt(i); 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Signature(sig); 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Package parsePackage( 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res, XmlResourceParser parser, int flags, String[] outError) 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = null; 7501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = null; 7511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = null; 7521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = null; 7531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = parsePackageName(parser, attrs, flags, outError); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null) { 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Package pkg = new Package(pkgName); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean foundApp = false; 763851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest); 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionCode = sa.getInteger( 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_versionCode, 0); 768cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn pkg.mVersionName = sa.getNonConfigurationString( 769cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifest_versionName, 0); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg.mVersionName != null) { 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionName = pkg.mVersionName.intern(); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 773cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 774cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0); 775cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn if (str != null && str.length() > 0) { 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(str, true); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad sharedUserId name \"" 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + str + "\": " + nameError; 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserId = str.intern(); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserLabel = sa.getResourceId( 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 788aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapu 789117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu pkg.installLocation = sa.getInteger( 790117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu com.android.internal.R.styleable.AndroidManifest_installLocation, 79190d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu PARSE_DEFAULT_INSTALL_LOCATION); 79254e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn pkg.applicationInfo.installLocation = pkg.installLocation; 79354e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn 794723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // Resource boolean are -1, so 1 means we don't know the value. 795723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsSmallScreens = 1; 796723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsNormalScreens = 1; 797723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsLargeScreens = 1; 79814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn int supportsXLargeScreens = 1; 799c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn int resizeable = 1; 80011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn int anyDensity = 1; 801723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("application")) { 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (foundApp) { 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (RIGID_PARSER) { 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> has more than one <application>"; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "<manifest> has more than one <application>"); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project foundApp = true; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseApplication(pkg, res, parser, attrs, flags, outError)) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-group")) { 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) { 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission")) { 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermission(pkg, res, parser, attrs, outError) == null) { 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-tree")) { 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) { 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-permission")) { 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 843cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 844cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString( 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission_name); 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null && !pkg.requestedPermissions.contains(name)) { 851854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.requestedPermissions.add(name.intern()); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-configuration")) { 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ConfigurationInfo cPref = new ConfigurationInfo(); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqTouchScreen = sa.getInt( 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen, 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.TOUCHSCREEN_UNDEFINED); 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqKeyboardType = sa.getInt( 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType, 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.KEYBOARD_UNDEFINED); 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard, 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqNavigation = sa.getInt( 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation, 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.NAVIGATION_UNDEFINED); 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav, 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV; 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.configPreferences.add(cPref); 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 884d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu } else if (tagName.equals("uses-feature")) { 88549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn FeatureInfo fi = new FeatureInfo(); 886d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu sa = res.obtainAttributes(attrs, 887d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu com.android.internal.R.styleable.AndroidManifestUsesFeature); 888cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 889cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 89049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.name = sa.getNonResourceString( 89149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_name); 89249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (fi.name == null) { 89349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.reqGlEsVersion = sa.getInt( 89449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_glEsVersion, 89549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn FeatureInfo.GL_ES_VERSION_UNDEFINED); 89649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 89749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (sa.getBoolean( 89849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_required, 89949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn true)) { 90049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.flags |= FeatureInfo.FLAG_REQUIRED; 90149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 902d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu sa.recycle(); 90349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (pkg.reqFeatures == null) { 90449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.reqFeatures = new ArrayList<FeatureInfo>(); 90549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 90649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.reqFeatures.add(fi); 90749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn 90849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (fi.name == null) { 90949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn ConfigurationInfo cPref = new ConfigurationInfo(); 91049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn cPref.reqGlEsVersion = fi.reqGlEsVersion; 91149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.configPreferences.add(cPref); 91249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 913d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu 914d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu XmlUtils.skipCurrentTag(parser); 915d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu 916851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else if (tagName.equals("uses-sdk")) { 9178d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_VERSION > 0) { 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesSdk); 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 921851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int minVers = 0; 922851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String minCode = null; 923851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int targetVers = 0; 924851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String targetCode = null; 925851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 926851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn TypedValue val = sa.peekValue( 927851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion); 928851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 929851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 930851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 931851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 932851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 9335c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn targetVers = minVers = val.data; 934851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 935851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 936851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 937851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn val = sa.peekValue( 938851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion); 939851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 940851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 941851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 942851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 943851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 944851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetVers = val.data; 945851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 946851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 947851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9505c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn if (minCode != null) { 9518d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (!minCode.equals(SDK_CODENAME)) { 9528d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_CODENAME != null) { 9535c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires development platform " + minCode 9548d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current platform is " + SDK_CODENAME + ")"; 9555c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } else { 9565c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires development platform " + minCode 9575c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn + " but this is a release platform."; 9585c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 9595c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 9605c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return null; 9615c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 9628d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu } else if (minVers > SDK_VERSION) { 9635c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires newer sdk version #" + minVers 9648d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current version is #" + SDK_VERSION + ")"; 9655c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 9665c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return null; 9675c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 9685c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 969851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (targetCode != null) { 9708d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (!targetCode.equals(SDK_CODENAME)) { 9718d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_CODENAME != null) { 972851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 9738d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current platform is " + SDK_CODENAME + ")"; 974851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 975851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 976851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " but this is a release platform."; 977851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 978851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 979851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn return null; 980851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 981851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If the code matches, it definitely targets this SDK. 982a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion 983a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; 984a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } else { 985a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion = targetVers; 986851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 991723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } else if (tagName.equals("supports-screens")) { 992723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn sa = res.obtainAttributes(attrs, 993723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens); 994723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 995723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // This is a trick to get a boolean and still able to detect 996723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // if a value was actually set. 997723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsSmallScreens = sa.getInteger( 998723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_smallScreens, 999723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsSmallScreens); 1000723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsNormalScreens = sa.getInteger( 1001723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_normalScreens, 1002723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsNormalScreens); 1003723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsLargeScreens = sa.getInteger( 1004723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_largeScreens, 1005723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsLargeScreens); 100614cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn supportsXLargeScreens = sa.getInteger( 100714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_xlargeScreens, 100814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn supportsXLargeScreens); 1009c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn resizeable = sa.getInteger( 1010c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_resizeable, 101114cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn resizeable); 101211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn anyDensity = sa.getInteger( 101311b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_anyDensity, 101411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn anyDensity); 1015723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 1016723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn sa.recycle(); 1017723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 10189189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima XmlUtils.skipCurrentTag(parser); 1019854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1020854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("protected-broadcast")) { 1021854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn sa = res.obtainAttributes(attrs, 1022854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProtectedBroadcast); 1023854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1024cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1025cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 1026854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn String name = sa.getNonResourceString( 1027854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProtectedBroadcast_name); 1028854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1029854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn sa.recycle(); 1030854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1031854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (name != null && (flags&PARSE_IS_SYSTEM) != 0) { 1032854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (pkg.protectedBroadcasts == null) { 1033854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.protectedBroadcasts = new ArrayList<String>(); 1034854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1035854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (!pkg.protectedBroadcasts.contains(name)) { 1036854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.protectedBroadcasts.add(name.intern()); 1037854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1038854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1039854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1040854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1041854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1042854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("instrumentation")) { 1043854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) { 1044854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn return null; 1045854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1046854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1047b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } else if (tagName.equals("original-package")) { 1048b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa = res.obtainAttributes(attrs, 1049b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage); 1050b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1051cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String orig =sa.getNonConfigurationString( 1052cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0); 10536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (!pkg.packageName.equals(orig)) { 1054c1552397be706c243338389c628a44eee6011eaeDianne Hackborn if (pkg.mOriginalPackages == null) { 1055c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mOriginalPackages = new ArrayList<String>(); 1056c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mRealPackage = pkg.packageName; 1057c1552397be706c243338389c628a44eee6011eaeDianne Hackborn } 1058c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mOriginalPackages.add(orig); 10596dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 1060b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1061b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa.recycle(); 1062b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1063b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1064b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1065b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } else if (tagName.equals("adopt-permissions")) { 1066b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa = res.obtainAttributes(attrs, 1067b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage); 1068b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1069cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 1070cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0); 1071b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1072b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa.recycle(); 1073b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 10746dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (name != null) { 1075b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn if (pkg.mAdoptPermissions == null) { 1076b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn pkg.mAdoptPermissions = new ArrayList<String>(); 1077b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } 1078b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn pkg.mAdoptPermissions.add(name); 1079b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } 1080b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1081b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1082b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1083854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("eat-comment")) { 1084854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn // Just skip this tag 1085854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1086854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn continue; 1087854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1088854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (RIGID_PARSER) { 1089854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn outError[0] = "Bad element under <manifest>: " 1090854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn + parser.getName(); 1091854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 1092854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn return null; 1093854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1095bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn Log.w(TAG, "Unknown element under <manifest>: " + parser.getName() 1096bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + " at " + mArchiveSourcePath + " " 1097bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!foundApp && pkg.instrumentation.size() == 0) { 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not contain an <application> or <instrumentation>"; 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY; 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1108a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final int NP = PackageParser.NEW_PERMISSIONS.length; 1109a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn StringBuilder implicitPerms = null; 1110a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn for (int ip=0; ip<NP; ip++) { 1111a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final PackageParser.NewPermissionInfo npi 1112a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = PackageParser.NEW_PERMISSIONS[ip]; 1113a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) { 1114a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn break; 1115a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 1116a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (!pkg.requestedPermissions.contains(npi.name)) { 1117a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (implicitPerms == null) { 1118a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms = new StringBuilder(128); 1119a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(pkg.packageName); 1120a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(": compat added "); 1121a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } else { 1122a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(' '); 1123a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 1124a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(npi.name); 1125a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.requestedPermissions.add(npi.name); 1126a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 1127851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 1128a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (implicitPerms != null) { 1129a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.i(TAG, implicitPerms.toString()); 1130a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 1131851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 1132723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsSmallScreens < 0 || (supportsSmallScreens > 0 1133723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 113411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1135723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS; 1136723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1137723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsNormalScreens != 0) { 1138723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS; 1139723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1140723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsLargeScreens < 0 || (supportsLargeScreens > 0 1141723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 114211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1143723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS; 1144723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 114514cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn if (supportsXLargeScreens < 0 || (supportsXLargeScreens > 0 114614cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 114714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn >= android.os.Build.VERSION_CODES.GINGERBREAD)) { 114814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS; 114914cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn } 1150c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (resizeable < 0 || (resizeable > 0 1151c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 115211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1153c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS; 1154c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 115511b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn if (anyDensity < 0 || (anyDensity > 0 115611b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 115711b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 115811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES; 11591ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima } 11601ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildClassName(String pkg, CharSequence clsSeq, 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clsSeq == null || clsSeq.length() <= 0) { 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Empty class name in package " + pkg; 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cls = clsSeq.toString(); 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = cls.charAt(0); 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + cls).intern(); 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cls.indexOf('.') < 0) { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder b = new StringBuilder(pkg); 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append('.'); 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append(cls); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b.toString().intern(); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c >= 'a' && c <= 'z') { 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cls.intern(); 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad class name " + cls + " in package " + pkg; 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildCompoundName(String pkg, 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String type, String[] outError) { 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String proc = procSeq.toString(); 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = proc.charAt(0); 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg != null && c == ':') { 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (proc.length() < 2) { 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad " + type + " name " + proc + " in package " + pkg 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": must be at least two characters"; 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String subName = proc.substring(1); 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(subName, false); 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null) { 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + proc).intern(); 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(proc, true); 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"system".equals(proc)) { 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return proc.intern(); 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildProcessName(String pkg, String defProc, 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, int flags, String[] separateProcesses, 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) { 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc != null ? defProc : pkg; 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (separateProcesses != null) { 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=separateProcesses.length-1; i>=0; i--) { 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String sp = separateProcesses[i]; 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) { 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null || procSeq.length() <= 0) { 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1233d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn return buildCompoundName(pkg, procSeq, "process", outError); 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildTaskAffinityName(String pkg, String defProc, 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String[] outError) { 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null) { 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq.length() <= 0) { 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buildCompoundName(pkg, procSeq, "taskAffinity", outError); 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PermissionGroup parsePermissionGroup(Package owner, Resources res, 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup perm = new PermissionGroup(owner); 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup); 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-group>", sa, 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_name, 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_label, 1259234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon, 0)) { 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_description, 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm, 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissionGroups.add(perm); 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermission(Package owner, Resources res, 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission>", sa, 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_name, 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_label, 1294234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn com.android.internal.R.styleable.AndroidManifestPermission_icon, 0)) { 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1300cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1301cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = sa.getNonResourceString( 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup); 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.group != null) { 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = perm.info.group.intern(); 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_description, 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = sa.getInt( 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel, 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.protectionLevel == -1) { 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission> does not specify protectionLevel"; 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission>", perm, 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissions.add(perm); 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermissionTree(Package owner, Resources res, 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree); 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-tree>", sa, 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_name, 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_label, 1347234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn com.android.internal.R.styleable.AndroidManifestPermissionTree_icon, 0)) { 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = perm.info.name.indexOf('.'); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index > 0) { 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = perm.info.name.indexOf('.', index+1); 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission-tree> name has less than three segments: " 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + perm.info.name; 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = 0; 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL; 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.tree = true; 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm, 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissions.add(perm); 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Instrumentation parseInstrumentation(Package owner, Resources res, 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation); 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseInstrumentationArgs == null) { 13881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError, 13891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_name, 13901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_label, 1391234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_icon, 0); 13921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.tag = "<instrumentation>"; 13931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 13941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 13951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.sa = sa; 13961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 13971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Instrumentation a = new Instrumentation(mParseInstrumentationArgs, 13981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn new InstrumentationInfo()); 13991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1406cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1407cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage); 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.targetPackage = str != null ? str.intern() : null; 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.handleProfiling = sa.getBoolean( 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling, 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.functionalTest = sa.getBoolean( 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest, 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.info.targetPackage == null) { 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<instrumentation> does not specify targetPackage"; 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a, 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.instrumentation.add(a); 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseApplication(Package owner, Resources res, 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ApplicationInfo ai = owner.applicationInfo; 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String pkgName = owner.applicationInfo.packageName; 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication); 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1448cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 1449cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_name, 0); 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null) { 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.className = buildClassName(pkgName, name, outError); 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai.className == null) { 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String manageSpaceActivity = sa.getNonConfigurationString( 1460cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, 0); 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (manageSpaceActivity != null) { 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity, 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError); 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1466181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate boolean allowBackup = sa.getBoolean( 1467181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true); 1468181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate if (allowBackup) { 1469181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; 14705e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate 14713de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate // backupAgent, killAfterRestore, and restoreAnyVersion are only relevant 14723de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate // if backup is possible for the given application. 1473cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String backupAgent = sa.getNonConfigurationString( 1474cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0); 1475181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate if (backupAgent != null) { 1476181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate ai.backupAgentName = buildClassName(pkgName, backupAgent, outError); 1477a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (false) { 1478a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.v(TAG, "android:backupAgent = " + ai.backupAgentName 1479a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " from " + pkgName + "+" + backupAgent); 1480a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 14815e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate 14825e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate if (sa.getBoolean( 14835e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore, 14845e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate true)) { 14855e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE; 14865e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate } 14875e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate if (sa.getBoolean( 14883dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_restoreAnyVersion, 14893dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate false)) { 14903dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate ai.flags |= ApplicationInfo.FLAG_RESTORE_ANY_VERSION; 14913dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate } 1492181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate } 1493181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate } 1494181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_label); 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (ai.labelRes=v.resourceId) == 0) { 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.nonLocalizedLabel = v.coerceToString(); 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.icon = sa.getResourceId( 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_icon, 0); 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.theme = sa.getResourceId( 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_theme, 0); 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.descriptionRes = sa.getResourceId( 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_description, 0); 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_persistent, 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_PERSISTENT; 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1516af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu if ((flags & PARSE_FORWARD_LOCK) != 0) { 1517af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu ai.flags |= ApplicationInfo.FLAG_FORWARD_LOCK; 1518af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } 1519af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu 1520af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu if ((flags & PARSE_ON_SDCARD) != 0) { 15216069beb2dfed6da837bf7faa3db3f6119edc017aSuchi Amalapurapu ai.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE; 1522af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } 1523af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_debuggable, 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE; 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 1531ef3f5ddc2137ed99e41f00441b688fb56b855179Ben Cheng com.android.internal.R.styleable.AndroidManifestApplication_vmSafeMode, 153223085b781e145ed684e7270af1d5ced6800b8effBen Cheng false)) { 153323085b781e145ed684e7270af1d5ced6800b8effBen Cheng ai.flags |= ApplicationInfo.FLAG_VM_SAFE_MODE; 153423085b781e145ed684e7270af1d5ced6800b8effBen Cheng } 153523085b781e145ed684e7270af1d5ced6800b8effBen Cheng 153623085b781e145ed684e7270af1d5ced6800b8effBen Cheng if (sa.getBoolean( 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_hasCode, 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_HAS_CODE; 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting, 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING; 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData, 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA; 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1554ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn if (sa.getBoolean( 1555ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_testOnly, 1556e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn false)) { 1557ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn ai.flags |= ApplicationInfo.FLAG_TEST_ONLY; 1558ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } 1559ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn 15601874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor if (sa.getBoolean( 15611874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor com.android.internal.R.styleable.AndroidManifestApplication_neverEncrypt, 15621874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor false)) { 15631874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor ai.flags |= ApplicationInfo.FLAG_NEVER_ENCRYPT; 15641874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor } 15651874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1567cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1568cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_permission, 0); 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.permission = (str != null && str.length() > 0) ? str.intern() : null; 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1571d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { 1572d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn str = sa.getNonConfigurationString( 1573d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, 0); 1574d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } else { 1575d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // Some older apps have been seen to use a resource reference 1576d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // here that on older builds was ignored (with a warning). We 1577d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // need to continue to do this for them so they don't break. 1578d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn str = sa.getNonResourceString( 1579d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity); 1580d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName, 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str, outError); 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] == null) { 1585d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn CharSequence pname; 1586d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { 1587d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = sa.getNonConfigurationString( 1588d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_process, 0); 1589d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } else { 1590d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // Some older apps have been seen to use a resource reference 1591d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // here that on older builds was ignored (with a warning). We 1592d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // need to continue to do this for them so they don't break. 1593d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = sa.getNonResourceString( 1594d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_process); 1595d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } 1596d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn ai.processName = buildProcessName(ai.packageName, null, pname, 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags, mSeparateProcesses, outError); 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1599cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn ai.enabled = sa.getBoolean( 1600cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_enabled, true); 1601860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 160202486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn if (false) { 160302486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn if (sa.getBoolean( 160402486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_cantSaveState, 160502486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn false)) { 160654e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn ai.flags |= ApplicationInfo.FLAG_CANT_SAVE_STATE; 160702486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn 160802486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn // A heavy-weight application can not be in a custom process. 160902486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn // We can do direct compare because we intern all strings. 161002486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn if (ai.processName != null && ai.processName != ai.packageName) { 161102486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn outError[0] = "cantSaveState applications can not use custom processes"; 161202486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn } 1613860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 1614860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int innerDepth = parser.getDepth(); 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > innerDepth)) { 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("activity")) { 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false); 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("receiver")) { 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true); 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.receivers.add(a); 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("service")) { 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Service s = parseService(owner, res, parser, attrs, flags, outError); 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.services.add(s); 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("provider")) { 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider p = parseProvider(owner, res, parser, attrs, flags, outError); 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) { 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.providers.add(p); 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("activity-alias")) { 16711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError); 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note: application meta-data is stored off to the side, so it can 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remain null in the primary copy (we like to avoid extra copies because 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it can be large) 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData, 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-library")) { 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary); 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1693cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1694cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String lname = sa.getNonResourceString( 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary_name); 169749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn boolean req = sa.getBoolean( 169849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesLibrary_required, 169949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn true); 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 170349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (lname != null) { 170449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (req) { 170549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (owner.usesLibraries == null) { 170649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesLibraries = new ArrayList<String>(); 170749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 170849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (!owner.usesLibraries.contains(lname)) { 170949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesLibraries.add(lname.intern()); 171049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 171149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } else { 171249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (owner.usesOptionalLibraries == null) { 171349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesOptionalLibraries = new ArrayList<String>(); 171449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 171549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (!owner.usesOptionalLibraries.contains(lname)) { 171649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesOptionalLibraries.add(lname.intern()); 171749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 171849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1723cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn } else if (tagName.equals("uses-package")) { 1724cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn // Dependencies for app installers; we don't currently try to 1725cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn // enforce this. 1726cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1727cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 1730a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <application>: " + tagName 1731a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 1732a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <application>: " + tagName; 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo, 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError, String tag, TypedArray sa, 174881cd2e90ccdda498234384c8207afe2213714e60Adam Powell int nameRes, int labelRes, int iconRes, int logoRes) { 1749cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString(nameRes, 0); 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = tag + " does not specify android:name"; 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.name 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = buildClassName(owner.applicationInfo.packageName, name, outError); 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.name == null) { 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iconVal = sa.getResourceId(iconRes, 0); 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iconVal != 0) { 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = iconVal; 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = null; 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 176681cd2e90ccdda498234384c8207afe2213714e60Adam Powell 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue(labelRes); 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.packageName = owner.packageName; 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivity(Package owner, Resources res, 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError, 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean receiver) throws XmlPullParserException, IOException { 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity); 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityArgs == null) { 17841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = new ParseComponentArgs(owner, outError, 17851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_name, 17861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_label, 1787234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_icon, 0, 17881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 17891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_process, 17908aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_description, 17911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_enabled); 17921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 17931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 17941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>"; 17951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.sa = sa; 17961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.flags = flags; 17971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 17981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityArgs, new ActivityInfo()); 17991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported); 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported, false); 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.theme = sa.getResourceId( 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_theme, 0); 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1815cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1816cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_permission, 0); 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = owner.applicationInfo.permission; 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1823cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1824cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, 0); 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName, 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.applicationInfo.taskAffinity, str, outError); 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags = 0; 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_multiprocess, 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS; 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch, 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH; 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch, 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH; 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_noHistory, 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_NO_HISTORY; 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState, 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE; 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded, 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED; 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents, 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS; 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting, 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) { 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING; 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1877ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn if (sa.getBoolean( 1878ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_finishOnCloseSystemDialogs, 1879ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn false)) { 1880ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn a.info.flags |= ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS; 1881ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 1882ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!receiver) { 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = sa.getInt( 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_launchMode, 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.LAUNCH_MULTIPLE); 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.screenOrientation = sa.getInt( 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation, 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = sa.getInt( 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_configChanges, 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.softInputMode = sa.getInt( 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode, 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE; 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = 0; 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 190354e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if (receiver && (owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 1904860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // A heavy-weight application can not have receives in its main process 1905860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // We can do direct compare because we intern all strings. 1906860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (a.info.processName == owner.packageName) { 1907860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn outError[0] = "Heavy-weight applications can not have receivers in main process"; 1908860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 1909860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 1910860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) { 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 1930bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn Log.w(TAG, "No actions in intent filter at " 1931bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + mArchiveSourcePath + " " 1932bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 1945a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <receiver>: " + parser.getName() 1946a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 1947a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1949a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <activity>: " + parser.getName() 1950a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 1951a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <receiver>: " + parser.getName(); 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <activity>: " + parser.getName(); 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivityAlias(Package owner, Resources res, 19731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 19741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn throws XmlPullParserException, IOException { 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias); 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1978cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String targetActivity = sa.getNonConfigurationString( 1979cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, 0); 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> does not specify android:targetActivity"; 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity = buildClassName(owner.applicationInfo.packageName, 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity, outError); 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityAliasArgs == null) { 19941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs = new ParseComponentArgs(owner, outError, 19951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_name, 19961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_label, 1997234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_icon, 0, 19981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 19991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 0, 20008aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_description, 20011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled); 20021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.tag = "<activity-alias>"; 20031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 20041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 20051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.sa = sa; 20061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.flags = flags; 20071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity target = null; 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = owner.activities.size(); 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NA; i++) { 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity t = owner.activities.get(i); 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity.equals(t.info.name)) { 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target = t; 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == null) { 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> target activity " + targetActivity 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " not found in manifest"; 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ActivityInfo info = new ActivityInfo(); 20271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.targetActivity = targetActivity; 20281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.configChanges = target.info.configChanges; 20291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.flags = target.info.flags; 20301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.icon = target.info.icon; 203181cd2e90ccdda498234384c8207afe2213714e60Adam Powell info.logo = target.info.logo; 20321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.labelRes = target.info.labelRes; 20331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.nonLocalizedLabel = target.info.nonLocalizedLabel; 20341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.launchMode = target.info.launchMode; 20351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.processName = target.info.processName; 20368aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (info.descriptionRes == 0) { 20378aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn info.descriptionRes = target.info.descriptionRes; 20388aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 20391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.screenOrientation = target.info.screenOrientation; 20401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.taskAffinity = target.info.taskAffinity; 20411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.theme = target.info.theme; 20421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 20431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityAliasArgs, info); 20441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported); 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false); 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 2057cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2058cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_permission, 0); 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) { 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 2084bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn Log.w(TAG, "No actions in intent filter at " 2085bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + mArchiveSourcePath + " " 2086bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2097a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName() 2098a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 2099a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <activity-alias>: " + parser.getName(); 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Provider parseProvider(Package owner, Resources res, 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider); 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseProviderArgs == null) { 21221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = new ParseComponentArgs(owner, outError, 21231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_name, 21241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_label, 2125234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_icon, 0, 21261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 21271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_process, 21288aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_description, 21291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_enabled); 21301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.tag = "<provider>"; 21311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 21321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 21331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.sa = sa; 21341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.flags = flags; 21351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 21361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Provider p = new Provider(mParseProviderArgs, new ProviderInfo()); 21371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.exported = sa.getBoolean( 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_exported, true); 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2145cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String cpname = sa.getNonConfigurationString( 2146cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_authorities, 0); 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.isSyncable = sa.getBoolean( 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_syncable, 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2152cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String permission = sa.getNonConfigurationString( 2153cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_permission, 0); 2154cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2155cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_readPermission, 0); 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = owner.applicationInfo.permission; 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2165cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2166cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_writePermission, 0); 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = owner.applicationInfo.permission; 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.grantUriPermissions = sa.getBoolean( 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions, 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.multiprocess = sa.getBoolean( 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_multiprocess, 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.initOrder = sa.getInt( 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_initOrder, 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 219154e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 2192860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // A heavy-weight application can not have providers in its main process 2193860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // We can do direct compare because we intern all strings. 2194860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (p.info.processName == owner.packageName) { 2195860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn outError[0] = "Heavy-weight applications can not have providers in main process"; 2196860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn return null; 2197860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2198860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2199860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpname == null) { 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<provider> does not incude authorities attribute"; 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.authority = cpname.intern(); 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseProviderTags(res, parser, attrs, p, outError)) { 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseProviderTags(Resources res, 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider outInfo, String[] outError) 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22312af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("grant-uri-permission")) { 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission); 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher pa = null; 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2238cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2239cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path, 0); 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL); 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2244cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2245cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix, 0); 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX); 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2250cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2251cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern, 0); 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22552af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pa != null) { 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.info.uriPermissionPatterns == null) { 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = new PatternMatcher[1]; 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns[0] = pa; 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = outInfo.info.uriPermissionPatterns.length; 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher[] newp = new PatternMatcher[N+1]; 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N); 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newp[N] = pa; 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = newp; 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.grantUriPermissions = true; 22702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 22712af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2272a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <path-permission>: " 2273a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2274a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 22752af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 22762af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 22772af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22782af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>"; 22792af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn return false; 22802af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22812af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 22822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22832af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else if (parser.getName().equals("path-permission")) { 22842af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn TypedArray sa = res.obtainAttributes(attrs, 22852af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission); 22862af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22872af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PathPermission pa = null; 22882af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2289cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String permission = sa.getNonConfigurationString( 2290cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_permission, 0); 2291cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String readPermission = sa.getNonConfigurationString( 2292cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_readPermission, 0); 22932af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (readPermission == null) { 22942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn readPermission = permission; 22952af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 2296cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String writePermission = sa.getNonConfigurationString( 2297cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_writePermission, 0); 22982af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (writePermission == null) { 22992af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn writePermission = permission; 23002af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23012af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23022af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn boolean havePerm = false; 23032af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (readPermission != null) { 23042af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn readPermission = readPermission.intern(); 23052af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn havePerm = true; 23062af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23072af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (writePermission != null) { 2308e04b1ad9cd3d9a159d4c7721a374f987be1062cdBjorn Bringert writePermission = writePermission.intern(); 23092af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn havePerm = true; 23102af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23112af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23122af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!havePerm) { 23132af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2314a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "No readPermission or writePermssion for <path-permission>: " 2315a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2316a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 23172af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 23182af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 23192af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23202af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outError[0] = "No readPermission or writePermssion for <path-permission>"; 23212af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn return false; 23222af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23232af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2324cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String path = sa.getNonConfigurationString( 2325cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_path, 0); 23262af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 23272af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 23282af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_LITERAL, readPermission, writePermission); 23292af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23302af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2331cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn path = sa.getNonConfigurationString( 2332cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_pathPrefix, 0); 23332af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 23342af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 23352af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_PREFIX, readPermission, writePermission); 23362af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23372af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2338cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn path = sa.getNonConfigurationString( 2339cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_pathPattern, 0); 23402af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 23412af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 23422af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_SIMPLE_GLOB, readPermission, writePermission); 23432af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23442af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23452af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn sa.recycle(); 23462af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23472af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (pa != null) { 23482af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (outInfo.info.pathPermissions == null) { 23492af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions = new PathPermission[1]; 23502af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions[0] = pa; 23512af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 23522af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn final int N = outInfo.info.pathPermissions.length; 23532af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PathPermission[] newp = new PathPermission[N+1]; 23542af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn System.arraycopy(outInfo.info.pathPermissions, 0, newp, 0, N); 23552af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn newp[N] = pa; 23562af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions = newp; 23572af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23582af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 23592af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2360a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: " 2361a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2362a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 23632af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 23642af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 23652af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23662af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>"; 23672af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn return false; 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <provider>: " 2374a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2375a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <provider>: " 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Service parseService(Package owner, Resources res, 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService); 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseServiceArgs == null) { 23941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = new ParseComponentArgs(owner, outError, 23951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_name, 23961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_label, 2397234e42df5fac958ed9f15aae6005dd72e4bdf08aDianne Hackborn com.android.internal.R.styleable.AndroidManifestService_icon, 0, 23981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 23991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_process, 24008aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestService_description, 24011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_enabled); 24021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.tag = "<service>"; 24031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 24041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 24051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.sa = sa; 24061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.flags = flags; 24071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 24081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Service s = new Service(mParseServiceArgs, new ServiceInfo()); 24091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported); 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = sa.getBoolean( 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported, false); 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2421cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2422cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_permission, 0); 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = owner.applicationInfo.permission; 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = str.length() > 0 ? str.toString().intern() : null; 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 243154e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 2432860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // A heavy-weight application can not have services in its main process 2433860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // We can do direct compare because we intern all strings. 2434860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (s.info.processName == owner.packageName) { 2435860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn outError[0] = "Heavy-weight applications can not have services in main process"; 2436860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn return null; 2437860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2438860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2439860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceIntentInfo intent = new ServiceIntentInfo(s); 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) { 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.intents.add(intent); 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData, 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <service>: " 2464a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2465a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <service>: " 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = s.intents.size() > 0; 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s; 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseAllMetaData(Resources res, 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String tag, 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Component outInfo, String[] outError) 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under " + tag + ": " 2503a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2504a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under " + tag + ": " 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle parseMetaData(Resources res, 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle data, String[] outError) 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData); 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == null) { 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = new Bundle(); 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2528cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 2529cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestMetaData_name, 0); 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:name attribute"; 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2536854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn name = name.intern(); 2537854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_resource); 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && v.resourceId != 0) { 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Meta data ref " + name + ": " + v); 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.resourceId); 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = sa.peekValue( 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_value); 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Meta data " + name + ": " + v); 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null) { 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v.type == TypedValue.TYPE_STRING) { 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence cs = v.coerceToString(); 2550854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn data.putString(name, cs != null ? cs.toString().intern() : null); 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) { 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putBoolean(name, v.data != 0); 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type >= TypedValue.TYPE_FIRST_INT 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && v.type <= TypedValue.TYPE_LAST_INT) { 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.data); 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_FLOAT) { 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putFloat(name, v.getFloat()); 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2560a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: " 2561a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2562a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types"; 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:value or android:resource attribute"; 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String ANDROID_RESOURCES 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = "http://schemas.android.com/apk/res/android"; 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseIntent(Resources res, 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentInfo outInfo, String[] outError, boolean isActivity) 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter); 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int priority = sa.getInt( 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0); 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) { 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Activity with priority > 0, forcing to 0 at " 2596a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + mArchiveSourcePath + " " 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getPositionDescription()); 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project priority = 0; 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.setPriority(priority); 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_label); 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = sa.getResourceId( 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0); 261081cd2e90ccdda498234384c8207afe2213714e60Adam Powell 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nodeName = parser.getName(); 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nodeName.equals("action")) { 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addAction(value); 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("category")) { 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addCategory(value); 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("data")) { 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData); 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2647cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2648cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_mimeType, 0); 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataType(str); 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IntentFilter.MalformedMimeTypeException e) { 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = e.toString(); 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2659cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2660cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_scheme, 0); 26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataScheme(str); 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2665cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String host = sa.getNonConfigurationString( 2666cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_host, 0); 2667cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String port = sa.getNonConfigurationString( 2668cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_port, 0); 26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (host != null) { 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataAuthority(host, port); 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2673cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2674cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_path, 0); 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL); 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2679cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2680cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_pathPrefix, 0); 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX); 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2685cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2686cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_pathPattern, 0); 26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!RIGID_PARSER) { 2694a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <intent-filter>: " 2695a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2696a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <intent-filter>: " + parser.getName(); 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT); 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cats = ""; 27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<String> it = outInfo.categoriesIterator(); 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it != null && it.hasNext()) { 27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cats += " " + it.next(); 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Intent d=" + 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault + ", cat=" + cats); 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Package { 27196dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String packageName; 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For now we only support one application per package. 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ApplicationInfo applicationInfo = new ApplicationInfo(); 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Permission> permissions = new ArrayList<Permission>(0); 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0); 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> activities = new ArrayList<Activity>(0); 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> receivers = new ArrayList<Activity>(0); 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Provider> providers = new ArrayList<Provider>(0); 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Service> services = new ArrayList<Service>(0); 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0); 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> requestedPermissions = new ArrayList<String>(); 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2734854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn public ArrayList<String> protectedBroadcasts; 2735854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 273649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<String> usesLibraries = null; 273749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<String> usesOptionalLibraries = null; 27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] usesLibraryFiles = null; 27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2740c1552397be706c243338389c628a44eee6011eaeDianne Hackborn public ArrayList<String> mOriginalPackages = null; 27416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String mRealPackage = null; 2742b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn public ArrayList<String> mAdoptPermissions = null; 2743b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We store the application meta-data independently to avoid multiple unwanted references 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle mAppMetaData = null; 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is a 3rd party app, this is the path of the zip file. 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mPath; 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version code declared for this package. 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mVersionCode; 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version name declared for this package. 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mVersionName; 27559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user id that this package wants to use. 27579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mSharedUserId; 27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user label that this package wants to use. 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mSharedUserLabel; 27619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Signatures that were read from the package. 27639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Signature mSignatures[]; 27649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For use by package manager service for quick lookup of 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preferred up order. 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mPreferredOrder = 0; 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27695c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // For use by the package manager to keep track of the path to the 27705c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // file an app came from. 27715c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public String mScanPath; 27725c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 27735c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // For use by package manager to keep track of where it has done dexopt. 27745c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public boolean mDidDexOpt; 27755c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 277646730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn // User set enabled state. 277746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn public int mSetEnabled = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 277846730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Additional data supplied by callers. 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object mExtras; 2781deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root 2782deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root // Whether an operation is currently pending on this package 2783deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root public boolean mOperationPending; 2784deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications hardware preferences 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<ConfigurationInfo> configPreferences = 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ArrayList<ConfigurationInfo>(); 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn /* 279249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn * Applications requested features 279349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn */ 279449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<FeatureInfo> reqFeatures = null; 279549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn 2796117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu public int installLocation; 2797117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Package(String _name) { 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = _name; 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.packageName = _name; 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.uid = -1; 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28046dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String newName) { 28056dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn packageName = newName; 28066dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn applicationInfo.packageName = newName; 28076dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=permissions.size()-1; i>=0; i--) { 28086dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn permissions.get(i).setPackageName(newName); 28096dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28106dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=permissionGroups.size()-1; i>=0; i--) { 28116dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn permissionGroups.get(i).setPackageName(newName); 28126dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28136dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=activities.size()-1; i>=0; i--) { 28146dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn activities.get(i).setPackageName(newName); 28156dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=receivers.size()-1; i>=0; i--) { 28176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn receivers.get(i).setPackageName(newName); 28186dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28196dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=providers.size()-1; i>=0; i--) { 28206dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn providers.get(i).setPackageName(newName); 28216dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=services.size()-1; i>=0; i--) { 28236dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn services.get(i).setPackageName(newName); 28246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=instrumentation.size()-1; i>=0; i--) { 28266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn instrumentation.get(i).setPackageName(newName); 28276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Package{" 28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + packageName + "}"; 28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Component<II extends IntentInfo> { 28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Package owner; 28391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ArrayList<II> intents; 28406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public final String className; 28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle metaData; 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn ComponentName componentName; 28446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn String componentShortName; 28456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Package _owner) { 28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = _owner; 28481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = null; 28496dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 28501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) { 28531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = args.owner; 28541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = new ArrayList<II>(0); 2855cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = args.sa.getNonConfigurationString(args.nameRes, 0); 28561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (name == null) { 28576dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 28581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not specify android:name"; 28591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 28601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.name 28631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn = buildClassName(owner.applicationInfo.packageName, name, args.outError); 28641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outInfo.name == null) { 28656dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 28661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not have valid android:name"; 28671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 28681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28706dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = outInfo.name; 28711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int iconVal = args.sa.getResourceId(args.iconRes, 0); 28731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (iconVal != 0) { 28741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.icon = iconVal; 28751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = null; 28761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 287781cd2e90ccdda498234384c8207afe2213714e60Adam Powell 28781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedValue v = args.sa.peekValue(args.labelRes); 28791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 28801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = v.coerceToString(); 28811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.packageName = owner.packageName; 28841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParseComponentArgs args, final ComponentInfo outInfo) { 28871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn this(args, (PackageItemInfo)outInfo); 28881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.outError[0] != null) { 28891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 28901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.processRes != 0) { 2893d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn CharSequence pname; 2894d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { 2895d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = args.sa.getNonConfigurationString(args.processRes, 0); 2896d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } else { 2897d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // Some older apps have been seen to use a resource reference 2898d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // here that on older builds was ignored (with a warning). We 2899d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // need to continue to do this for them so they don't break. 2900d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = args.sa.getNonResourceString(args.processRes); 2901d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } 29021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.processName = buildProcessName(owner.applicationInfo.packageName, 2903d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn owner.applicationInfo.processName, pname, 29041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.flags, args.sepProcesses, args.outError); 29051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 29068aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 29078aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (args.descriptionRes != 0) { 29088aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn outInfo.descriptionRes = args.sa.getResourceId(args.descriptionRes, 0); 29098aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 29108aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 29111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.enabled = args.sa.getBoolean(args.enabledRes, true); 29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Component<II> clone) { 29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = clone.owner; 29161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = clone.intents; 29176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = clone.className; 29186dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = clone.componentName; 29191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = clone.componentShortName; 29206dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29216dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 29226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public ComponentName getComponentName() { 29236dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (componentName != null) { 29246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentName; 29256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (className != null) { 29276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = new ComponentName(owner.applicationInfo.packageName, 29286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className); 29296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentName; 29316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 29336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String getComponentShortName() { 29346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (componentShortName != null) { 29356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentShortName; 29366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn ComponentName component = getComponentName(); 29386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (component != null) { 29396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentShortName = component.flattenToShortString(); 29406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentShortName; 29426dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 29446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 29456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = null; 29466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentShortName = null; 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Permission extends Component<IntentInfo> { 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionInfo info; 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean tree; 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup group; 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner) { 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionInfo(); 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner, PermissionInfo _info) { 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29646dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 29656dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 29666dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 29676dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 29686dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Permission{" 29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class PermissionGroup extends Component<IntentInfo> { 29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionGroupInfo info; 29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner) { 29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionGroupInfo(); 29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner, PermissionGroupInfo _info) { 29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29906dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 29916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 29926dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 29936dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29946dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "PermissionGroup{" 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static boolean copyNeeded(int flags, Package p, Bundle metaData) { 300346730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn if (p.mSetEnabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) { 300446730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn boolean enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; 300546730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn if (p.applicationInfo.enabled != enabled) { 300646730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn return true; 300746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn } 300846730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn } 30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (metaData != null || p.mAppMetaData != null)) { 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0 30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && p.usesLibraryFiles != null) { 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ApplicationInfo generateApplicationInfo(Package p, int flags) { 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p, null)) { 302369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima // CompatibilityMode is global state. It's safe to modify the instance 302469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima // of the package. 302569fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima if (!sCompatibilityModeEnabled) { 302669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima p.applicationInfo.disableCompatibilityMode(); 302769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.applicationInfo; 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copy so we can store the metadata/libraries safely 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = new ApplicationInfo(p.applicationInfo); 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0) { 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = p.mAppMetaData; 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) { 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.sharedLibraryFiles = p.usesLibraryFiles; 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 303969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima if (!sCompatibilityModeEnabled) { 304069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima ai.disableCompatibilityMode(); 304169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 304246730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn ai.enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; 30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionInfo generatePermissionInfo( 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission p, int flags) { 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = new PermissionInfo(p.info); 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionGroupInfo generatePermissionGroupInfo( 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup pg, int flags) { 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pg == null) return null; 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pg.info; 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info); 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.metaData = pg.metaData; 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pgi; 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Activity extends Component<ActivityIntentInfo> { 30691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ActivityInfo info; 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Activity(final ParseComponentArgs args, final ActivityInfo _info) { 30721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 30731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 30741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 30776dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 30786dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 30796dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 30806dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30816dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Activity{" 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 30856dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ActivityInfo generateActivityInfo(Activity a, 30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) return null; 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, a.owner, a.metaData)) { 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a.info; 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo ai = new ActivityInfo(a.info); 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = a.metaData; 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.applicationInfo = generateApplicationInfo(a.owner, flags); 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Service extends Component<ServiceIntentInfo> { 31031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ServiceInfo info; 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Service(final ParseComponentArgs args, final ServiceInfo _info) { 31061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 31071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 31081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 31116dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 31126dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 31136dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 31146dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31156dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Service{" 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 31196dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ServiceInfo generateServiceInfo(Service s, int flags) { 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) return null; 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, s.owner, s.metaData)) { 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s.info; 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = new ServiceInfo(s.info); 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.metaData = s.metaData; 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.applicationInfo = generateApplicationInfo(s.owner, flags); 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return si; 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Provider extends Component { 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ProviderInfo info; 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean syncable; 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Provider(final ParseComponentArgs args, final ProviderInfo _info) { 31401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 31411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 31421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project syncable = false; 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Provider(Provider existingProvider) { 31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(existingProvider); 31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.info = existingProvider.info; 31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.syncable = existingProvider.syncable; 31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 31536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 31546dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 31556dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31566dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Provider{" 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ProviderInfo generateProviderInfo(Provider p, 31659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p.owner, p.metaData) 31689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0 31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || p.info.uriPermissionPatterns == null)) { 31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProviderInfo pi = new ProviderInfo(p.info); 31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) { 31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.uriPermissionPatterns = null; 31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = generateApplicationInfo(p.owner, flags); 31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Instrumentation extends Component { 31831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final InstrumentationInfo info; 31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) { 31861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 31871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 31906dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 31916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 31926dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 31936dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31946dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Instrumentation{" 31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 31986dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final InstrumentationInfo generateInstrumentationInfo( 32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Instrumentation i, int flags) { 32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == null) return null; 32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i.info; 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = new InstrumentationInfo(i.info); 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ii.metaData = i.metaData; 32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ii; 32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class IntentInfo extends IntentFilter { 32149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasDefault; 32159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int labelRes; 32169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedLabel; 32179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int icon; 321881cd2e90ccdda498234384c8207afe2213714e60Adam Powell public int logo; 32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ActivityIntentInfo extends IntentInfo { 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Activity activity; 32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActivityIntentInfo(Activity _activity) { 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project activity = _activity; 32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ActivityIntentInfo{" 32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + activity.info.name + "}"; 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ServiceIntentInfo extends IntentInfo { 32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Service service; 32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ServiceIntentInfo(Service _service) { 32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service = _service; 32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ServiceIntentInfo{" 32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + service.info.name + "}"; 32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 324869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima 324969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima /** 325069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima * @hide 325169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima */ 325269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) { 325369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima sCompatibilityModeEnabled = compatibilityModeEnabled; 325469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3256