PackageParser.java revision 529b60a3b16ac3dff24f2403d760ab8ebc9670ff
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 android.content.ComponentName; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser; 278d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapuimport android.os.Build; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PatternMatcher; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 352269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils; 36529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport org.xmlpull.v1.XmlPullParser; 37529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guyimport org.xmlpull.v1.XmlPullParserException; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser { 57a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn /** @hide */ 58a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public static class NewPermissionInfo { 59a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final String name; 60a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final int sdkVersion; 61a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final int fileVersion; 62a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 63a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public NewPermissionInfo(String name, int sdkVersion, int fileVersion) { 64a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.name = name; 65a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.sdkVersion = sdkVersion; 66a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.fileVersion = fileVersion; 67a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 68a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 69a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 70a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn /** 71a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * List of new permissions that have been added since 1.0. 72a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * NOTE: These must be declared in SDK version order, with permissions 73a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * added to older SDKs appearing before those added to newer SDKs. 74a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * @hide 75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn */ 7645515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] = 7745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh new PackageParser.NewPermissionInfo[] { 785a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 7945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.os.Build.VERSION_CODES.DONUT, 0), 8045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE, 8145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.os.Build.VERSION_CODES.DONUT, 0) 82a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn }; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mArchiveSourcePath; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mSeparateProcesses; 868d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu private static final int SDK_VERSION = Build.VERSION.SDK_INT; 878d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu private static final String SDK_CODENAME = "REL".equals(Build.VERSION.CODENAME) 888d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu ? null : Build.VERSION.CODENAME; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mParseError = PackageManager.INSTALL_SUCCEEDED; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Object mSync = new Object(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static WeakReference<byte[]> mReadBuffer; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private static boolean sCompatibilityModeEnabled = true; 9690d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private static final int PARSE_DEFAULT_INSTALL_LOCATION = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 9769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima 981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParsePackageItemArgs { 991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final Package owner; 1001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] outError; 1011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int nameRes; 1021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int labelRes; 1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int iconRes; 10481cd2e90ccdda498234384c8207afe2213714e60Adam Powell final int logoRes; 1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn String tag; 1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedArray sa; 1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParsePackageItemArgs(Package _owner, String[] _outError, 11081cd2e90ccdda498234384c8207afe2213714e60Adam Powell int _nameRes, int _labelRes, int _iconRes, int _logoRes) { 1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = _owner; 1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outError = _outError; 1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn nameRes = _nameRes; 1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn labelRes = _labelRes; 1151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn iconRes = _iconRes; 11681cd2e90ccdda498234384c8207afe2213714e60Adam Powell logoRes = _logoRes; 1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParseComponentArgs extends ParsePackageItemArgs { 1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] sepProcesses; 1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int processRes; 1238aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn final int descriptionRes; 1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int enabledRes; 1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int flags; 1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParseComponentArgs(Package _owner, String[] _outError, 12881cd2e90ccdda498234384c8207afe2213714e60Adam Powell int _nameRes, int _labelRes, int _iconRes, int _logoRes, 1298aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn String[] _sepProcesses, int _processRes, 1308aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn int _descriptionRes, int _enabledRes) { 13181cd2e90ccdda498234384c8207afe2213714e60Adam Powell super(_owner, _outError, _nameRes, _labelRes, _iconRes, _logoRes); 1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sepProcesses = _sepProcesses; 1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn processRes = _processRes; 1348aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn descriptionRes = _descriptionRes; 1351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn enabledRes = _enabledRes; 1361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 138a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 139a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu /* Light weight package info. 140a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @hide 141a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu */ 142a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public static class PackageLite { 143a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public String packageName; 144a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public int installLocation; 145a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public String mScanPath; 146a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public PackageLite(String packageName, int installLocation) { 147a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu this.packageName = packageName; 148a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu this.installLocation = installLocation; 149a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 150a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 151a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 1521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParsePackageItemArgs mParseInstrumentationArgs; 1531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityArgs; 1541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityAliasArgs; 1551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseServiceArgs; 1561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseProviderArgs; 1571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** If set to true, we will only allow package files that exactly match 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the DTD. Otherwise, we try to get as much from the package as we 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can without failing. This should normally be set to false, to 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * support extensions to the DTD in future versions. */ 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean RIGID_PARSER = false; 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "PackageParser"; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageParser(String archiveSourcePath) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = archiveSourcePath; 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSeparateProcesses(String[] procs) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSeparateProcesses = procs; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean isPackageFilename(String name) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name.endsWith(".apk"); 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Generate and return the {@link PackageInfo} for a parsed package. 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p the parsed package. 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags indicating which optional information is included. 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static PackageInfo generatePackageInfo(PackageParser.Package p, 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int gids[], int flags) { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo pi = new PackageInfo(); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.packageName = p.packageName; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionCode = p.mVersionCode; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionName = p.mVersionName; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserId = p.mSharedUserId; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserLabel = p.mSharedUserLabel; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = p.applicationInfo; 194117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu pi.installLocation = p.installLocation; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_GIDS) != 0) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.gids = gids; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.configPreferences.size(); 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.configPreferences = new ConfigurationInfo[N]; 20249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn p.configPreferences.toArray(pi.configPreferences); 20349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 20449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn N = p.reqFeatures != null ? p.reqFeatures.size() : 0; 20549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (N > 0) { 20649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pi.reqFeatures = new FeatureInfo[N]; 20749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn p.reqFeatures.toArray(pi.reqFeatures); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_ACTIVITIES) != 0) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.activities.size(); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2137eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2147eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.activities = new ActivityInfo[N]; 2157eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2167eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2177eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2187eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.activities.get(i).info.enabled) num++; 2197eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2207eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.activities = new ActivityInfo[num]; 2217eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 222d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.activities.get(i); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 226d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.activities[j++] = generateActivityInfo(p.activities.get(i), flags); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_RECEIVERS) != 0) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.receivers.size(); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2347eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2357eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.receivers = new ActivityInfo[N]; 2367eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2377eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2387eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2397eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.receivers.get(i).info.enabled) num++; 2407eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2417eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.receivers = new ActivityInfo[num]; 2427eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 243d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.receivers.get(i); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 247d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.receivers[j++] = generateActivityInfo(p.receivers.get(i), flags); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SERVICES) != 0) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.services.size(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2557eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2567eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.services = new ServiceInfo[N]; 2577eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2587eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2597eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2607eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.services.get(i).info.enabled) num++; 2617eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2627eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.services = new ServiceInfo[num]; 2637eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 264d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Service service = p.services.get(i); 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (service.info.enabled 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 268d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.services[j++] = generateServiceInfo(p.services.get(i), flags); 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PROVIDERS) != 0) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.providers.size(); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2767eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2777eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.providers = new ProviderInfo[N]; 2787eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2797eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2807eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2817eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.providers.get(i).info.enabled) num++; 2827eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2837eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.providers = new ProviderInfo[num]; 2847eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 285d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Provider provider = p.providers.get(i); 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider.info.enabled 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 289d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.providers[j++] = generateProviderInfo(p.providers.get(i), flags); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) { 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.instrumentation.size(); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation = new InstrumentationInfo[N]; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation[i] = generateInstrumentationInfo( 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.instrumentation.get(i), flags); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PERMISSIONS) != 0) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.permissions.size(); 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions = new PermissionInfo[N]; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = p.requestedPermissions.size(); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions = new String[N]; 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions[i] = p.requestedPermissions.get(i); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SIGNATURES) != 0) { 321d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu int N = (p.mSignatures != null) ? p.mSignatures.length : 0; 322d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu if (N > 0) { 323d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.signatures = new Signature[N]; 324d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N); 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Certificate[] loadCertificates(JarFile jarFile, JarEntry je, 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer) { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We must read the stream for the JarEntry to retrieve 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // its certificates. 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream is = jarFile.getInputStream(je); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (is.read(readBuffer, 0, readBuffer.length) != -1) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not using 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is.close(); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return je != null ? je.getCertificates() : null; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + je.getName() + " in " 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarFile.getName(), e); 3446e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn } catch (RuntimeException e) { 3456e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn Log.w(TAG, "Exception reading " + je.getName() + " in " 3466e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn + jarFile.getName(), e); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 351af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_IS_SYSTEM = 1<<0; 352af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_CHATTY = 1<<1; 353af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_MUST_BE_APK = 1<<2; 354af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_IGNORE_PROCESSES = 1<<3; 355af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_FORWARD_LOCK = 1<<4; 356af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_ON_SDCARD = 1<<5; 357806da1d46c94c71728b94dec75dec6519c962b5cDianne Hackborn public final static int PARSE_IS_SYSTEM_DIR = 1<<6; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getParseError() { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mParseError; 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 363af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public Package parsePackage(File sourceFile, String destCodePath, 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayMetrics metrics, int flags) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_SUCCEEDED; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = sourceFile.getPath(); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!sourceFile.isFile()) { 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Skipping dir: " + mArchiveSourcePath); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isPackageFilename(sourceFile.getName()) 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (flags&PARSE_MUST_BE_APK) != 0) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) == 0) { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We expect to have non-.apk files in the system dir, 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so don't warn about them. 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d( 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Scanning package: " + mArchiveSourcePath); 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean assetError = true; 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 392b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project int cookie = assmgr.addAssetPath(mArchiveSourcePath); 393b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if(cookie != 0) { 394b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assetError = false; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath); 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to read AndroidManifest.xml of " 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mArchiveSourcePath, e); 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(assetError) { 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] errorText = new String[1]; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Package pkg = null; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Exception errorException = null; 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXXX todo: need to figure out correct configuration. 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = new Resources(assmgr, metrics, null); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg = parsePackage(res, parser, flags, errorText); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project errorException = e; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (errorException != null) { 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, mArchiveSourcePath, errorException); 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, mArchiveSourcePath + " (at " 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getPositionDescription() 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "): " + errorText[0]); 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParseError == PackageManager.INSTALL_SUCCEEDED) { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 440af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu // Set code and resource paths 441af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu pkg.mPath = destCodePath; 442af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu pkg.mScanPath = mArchiveSourcePath; 443af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu //pkg.applicationInfo.sourceDir = destCodePath; 444af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu //pkg.applicationInfo.publicSourceDir = destRes; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean collectCertificates(Package pkg, int flags) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<byte[]> readBufferRef; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer = null; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = mReadBuffer; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBufferRef != null) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = null; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = readBufferRef.get(); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBuffer == null) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = new byte[8192]; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = new WeakReference<byte[]>(readBuffer); 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarFile jarFile = new JarFile(mArchiveSourcePath); 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] certs = null; 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this package comes from the system image, then we 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can trust it... we'll just use the AndroidManifest.xml 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to retrieve its signatures, not validating all of the 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // files. 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml"); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = loadCertificates(jarFile, jarEntry, readBuffer); 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs == null) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarEntry.getName() + "; ignoring!"); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " certs=" + (certs != null ? certs.length : 0)); 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, " Public key: " 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + certs[i].getPublicKey().getEncoded() 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + certs[i].getPublicKey()); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Enumeration entries = jarFile.entries(); 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (entries.hasMoreElements()) { 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarEntry je = (JarEntry)entries.nextElement(); 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.isDirectory()) continue; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.getName().startsWith("META-INF/")) continue; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] localCerts = loadCertificates(jarFile, je, 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer); 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName() 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": certs=" + certs + " (" 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (certs != null ? certs.length : 0) + ")"); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localCerts == null) { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (certs == null) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = localCerts; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ensure all certificates match. 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<certs.length; i++) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean found = false; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<localCerts.length; j++) { 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs[i] != null && 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].equals(localCerts[j])) { 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project found = true; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!found || certs.length != localCerts.length) { 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has mismatched certificates at entry " 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = readBufferRef; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null && certs.length > 0) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = new Signature[certs.length]; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures[i] = new Signature( 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].getEncoded()); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates; ignoring!"); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CertificateEncodingException e) { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 581a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu /* 582a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * Utility method that retrieves just the package name and install 583a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * location from the apk location at the given file path. 584a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @param packageFilePath file location of the apk 585a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @param flags Special parse flags 586930d3af75f9e9663222f4c4a1d75b326cf811e35Kenny Root * @return PackageLite object with package information or null on failure. 587a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu */ 588a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public static PackageLite parsePackageLite(String packageFilePath, int flags) { 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cookie = assmgr.addAssetPath(packageFilePath); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to read AndroidManifest.xml of " 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageFilePath, e); 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String errors[] = new String[1]; 603a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu PackageLite packageLite = null; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 605a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu packageLite = parsePackageLite(parser, attrs, flags, errors); 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, packageFilePath, e); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException e) { 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, packageFilePath, e); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 614a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (packageLite == null) { 615a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu Log.e(TAG, "parsePackageLite error: " + errors[0]); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 618a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return packageLite; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String validateName(String name, boolean requiresSeparator) { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = name.length(); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasSep = false; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean front = true; 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final char c = name.charAt(i); 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = false; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!front) { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= '0' && c <= '9') || c == '_') { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasSep = true; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = true; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "bad character '" + c + "'"; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasSep || !requiresSeparator 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? null : "must have at least one '.' separator"; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String parsePackageName(XmlPullParser parser, 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs, int flags, String[] outError) 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException, XmlPullParserException { 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.START_TAG 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type != parser.END_DOCUMENT) { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != parser.START_TAG) { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No start tag found"; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v( 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Root element name: '" + parser.getName() + "'"); 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parser.getName().equals("manifest")) { 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No <manifest> tag"; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = attrs.getAttributeValue(null, "package"); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null || pkgName.length() == 0) { 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not specify package"; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(pkgName, true); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad package name \"" 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkgName + "\": " + nameError; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkgName.intern(); 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 682a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu private static PackageLite parsePackageLite(XmlPullParser parser, 683a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu AttributeSet attrs, int flags, String[] outError) 684a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu throws IOException, XmlPullParserException { 685a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 686a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int type; 687a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu while ((type=parser.next()) != parser.START_TAG 688a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu && type != parser.END_DOCUMENT) { 689a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu ; 690a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 691a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 692a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (type != parser.START_TAG) { 693a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "No start tag found"; 694a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 695a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 696a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v( 697a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu TAG, "Root element name: '" + parser.getName() + "'"); 698a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (!parser.getName().equals("manifest")) { 699a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "No <manifest> tag"; 700a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 701a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 702a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String pkgName = attrs.getAttributeValue(null, "package"); 703a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (pkgName == null || pkgName.length() == 0) { 704a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "<manifest> does not specify package"; 705a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 706a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 707a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String nameError = validateName(pkgName, true); 708a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (nameError != null && !"android".equals(pkgName)) { 709a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "<manifest> specifies bad package name \"" 710a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu + pkgName + "\": " + nameError; 711a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 712a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 71390d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int installLocation = PARSE_DEFAULT_INSTALL_LOCATION; 714a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu for (int i = 0; i < attrs.getAttributeCount(); i++) { 715a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String attr = attrs.getAttributeName(i); 716a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (attr.equals("installLocation")) { 717a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu installLocation = attrs.getAttributeIntValue(i, 71890d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu PARSE_DEFAULT_INSTALL_LOCATION); 719a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu break; 720a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 721a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 722a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return new PackageLite(pkgName.intern(), installLocation); 723a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 724a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temporary. 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public Signature stringToSignature(String str) { 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = str.length(); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] sig = new byte[N]; 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sig[i] = (byte)str.charAt(i); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Signature(sig); 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Package parsePackage( 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res, XmlResourceParser parser, int flags, String[] outError) 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = null; 7431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = null; 7441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = null; 7451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = null; 7461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = parsePackageName(parser, attrs, flags, outError); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null) { 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Package pkg = new Package(pkgName); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean foundApp = false; 756851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest); 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionCode = sa.getInteger( 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_versionCode, 0); 761cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn pkg.mVersionName = sa.getNonConfigurationString( 762cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifest_versionName, 0); 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg.mVersionName != null) { 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionName = pkg.mVersionName.intern(); 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 766cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 767cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0); 768cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn if (str != null && str.length() > 0) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(str, true); 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad sharedUserId name \"" 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + str + "\": " + nameError; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserId = str.intern(); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserLabel = sa.getResourceId( 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0); 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 781aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapu 782117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu pkg.installLocation = sa.getInteger( 783117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu com.android.internal.R.styleable.AndroidManifest_installLocation, 78490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu PARSE_DEFAULT_INSTALL_LOCATION); 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 786723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // Resource boolean are -1, so 1 means we don't know the value. 787723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsSmallScreens = 1; 788723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsNormalScreens = 1; 789723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsLargeScreens = 1; 79014cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn int supportsXLargeScreens = 1; 791c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn int resizeable = 1; 79211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn int anyDensity = 1; 793723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("application")) { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (foundApp) { 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (RIGID_PARSER) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> has more than one <application>"; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "<manifest> has more than one <application>"); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project foundApp = true; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseApplication(pkg, res, parser, attrs, flags, outError)) { 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-group")) { 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) { 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission")) { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermission(pkg, res, parser, attrs, outError) == null) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-tree")) { 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionTree(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("uses-permission")) { 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 835cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 836cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString( 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission_name); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null && !pkg.requestedPermissions.contains(name)) { 843854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.requestedPermissions.add(name.intern()); 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-configuration")) { 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ConfigurationInfo cPref = new ConfigurationInfo(); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration); 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqTouchScreen = sa.getInt( 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen, 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.TOUCHSCREEN_UNDEFINED); 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqKeyboardType = sa.getInt( 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType, 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.KEYBOARD_UNDEFINED); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard, 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqNavigation = sa.getInt( 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation, 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.NAVIGATION_UNDEFINED); 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav, 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV; 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.configPreferences.add(cPref); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 876d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu } else if (tagName.equals("uses-feature")) { 87749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn FeatureInfo fi = new FeatureInfo(); 878d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu sa = res.obtainAttributes(attrs, 879d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu com.android.internal.R.styleable.AndroidManifestUsesFeature); 880cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 881cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 88249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.name = sa.getNonResourceString( 88349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_name); 88449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (fi.name == null) { 88549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.reqGlEsVersion = sa.getInt( 88649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_glEsVersion, 88749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn FeatureInfo.GL_ES_VERSION_UNDEFINED); 88849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 88949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (sa.getBoolean( 89049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_required, 89149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn true)) { 89249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.flags |= FeatureInfo.FLAG_REQUIRED; 89349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 894d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu sa.recycle(); 89549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (pkg.reqFeatures == null) { 89649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.reqFeatures = new ArrayList<FeatureInfo>(); 89749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 89849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.reqFeatures.add(fi); 89949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn 90049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (fi.name == null) { 90149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn ConfigurationInfo cPref = new ConfigurationInfo(); 90249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn cPref.reqGlEsVersion = fi.reqGlEsVersion; 90349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.configPreferences.add(cPref); 90449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 905d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu 906d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu XmlUtils.skipCurrentTag(parser); 907d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu 908851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else if (tagName.equals("uses-sdk")) { 9098d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_VERSION > 0) { 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesSdk); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 913851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int minVers = 0; 914851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String minCode = null; 915851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int targetVers = 0; 916851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String targetCode = null; 917851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 918851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn TypedValue val = sa.peekValue( 919851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion); 920851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 921851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 922851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 923851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 924851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 9255c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn targetVers = minVers = val.data; 926851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 927851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 928851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 929851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn val = sa.peekValue( 930851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion); 931851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 932851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 933851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 934851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 935851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 936851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetVers = val.data; 937851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 938851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 939851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9425c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn if (minCode != null) { 9438d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (!minCode.equals(SDK_CODENAME)) { 9448d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_CODENAME != null) { 9455c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires development platform " + minCode 9468d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current platform is " + SDK_CODENAME + ")"; 9475c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } else { 9485c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires development platform " + minCode 9495c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn + " but this is a release platform."; 9505c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 9515c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 9525c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return null; 9535c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 9548d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu } else if (minVers > SDK_VERSION) { 9555c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires newer sdk version #" + minVers 9568d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current version is #" + SDK_VERSION + ")"; 9575c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 9585c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return null; 9595c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 9605c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 961851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (targetCode != null) { 9628d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (!targetCode.equals(SDK_CODENAME)) { 9638d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_CODENAME != null) { 964851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 9658d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current platform is " + SDK_CODENAME + ")"; 966851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 967851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 968851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " but this is a release platform."; 969851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 970851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 971851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn return null; 972851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 973851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If the code matches, it definitely targets this SDK. 974a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion 975a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; 976a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } else { 977a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion = targetVers; 978851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 983723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } else if (tagName.equals("supports-screens")) { 984723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn sa = res.obtainAttributes(attrs, 985723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens); 986723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 987723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // This is a trick to get a boolean and still able to detect 988723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // if a value was actually set. 989723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsSmallScreens = sa.getInteger( 990723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_smallScreens, 991723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsSmallScreens); 992723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsNormalScreens = sa.getInteger( 993723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_normalScreens, 994723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsNormalScreens); 995723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsLargeScreens = sa.getInteger( 996723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_largeScreens, 997723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsLargeScreens); 99814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn supportsXLargeScreens = sa.getInteger( 99914cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_xlargeScreens, 100014cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn supportsXLargeScreens); 1001c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn resizeable = sa.getInteger( 1002c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_resizeable, 100314cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn resizeable); 100411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn anyDensity = sa.getInteger( 100511b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_anyDensity, 100611b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn anyDensity); 1007723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 1008723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn sa.recycle(); 1009723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 10109189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima XmlUtils.skipCurrentTag(parser); 1011854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1012854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("protected-broadcast")) { 1013854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn sa = res.obtainAttributes(attrs, 1014854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProtectedBroadcast); 1015854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1016cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1017cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 1018854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn String name = sa.getNonResourceString( 1019854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProtectedBroadcast_name); 1020854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1021854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn sa.recycle(); 1022854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1023854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (name != null && (flags&PARSE_IS_SYSTEM) != 0) { 1024854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (pkg.protectedBroadcasts == null) { 1025854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.protectedBroadcasts = new ArrayList<String>(); 1026854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1027854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (!pkg.protectedBroadcasts.contains(name)) { 1028854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.protectedBroadcasts.add(name.intern()); 1029854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1030854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1031854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1032854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1033854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1034854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("instrumentation")) { 1035854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) { 1036854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn return null; 1037854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1038854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1039b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } else if (tagName.equals("original-package")) { 1040b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa = res.obtainAttributes(attrs, 1041b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage); 1042b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1043cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String orig =sa.getNonConfigurationString( 1044cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0); 10456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (!pkg.packageName.equals(orig)) { 1046c1552397be706c243338389c628a44eee6011eaeDianne Hackborn if (pkg.mOriginalPackages == null) { 1047c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mOriginalPackages = new ArrayList<String>(); 1048c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mRealPackage = pkg.packageName; 1049c1552397be706c243338389c628a44eee6011eaeDianne Hackborn } 1050c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mOriginalPackages.add(orig); 10516dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 1052b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1053b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa.recycle(); 1054b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1055b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1056b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1057b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } else if (tagName.equals("adopt-permissions")) { 1058b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa = res.obtainAttributes(attrs, 1059b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage); 1060b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1061cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 1062cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0); 1063b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1064b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa.recycle(); 1065b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 10666dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (name != null) { 1067b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn if (pkg.mAdoptPermissions == null) { 1068b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn pkg.mAdoptPermissions = new ArrayList<String>(); 1069b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } 1070b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn pkg.mAdoptPermissions.add(name); 1071b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } 1072b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1073b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1074b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1075854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("eat-comment")) { 1076854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn // Just skip this tag 1077854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1078854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn continue; 1079854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1080854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (RIGID_PARSER) { 1081854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn outError[0] = "Bad element under <manifest>: " 1082854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn + parser.getName(); 1083854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 1084854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn return null; 1085854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1087bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn Log.w(TAG, "Unknown element under <manifest>: " + parser.getName() 1088bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + " at " + mArchiveSourcePath + " " 1089bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!foundApp && pkg.instrumentation.size() == 0) { 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not contain an <application> or <instrumentation>"; 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1100a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final int NP = PackageParser.NEW_PERMISSIONS.length; 1101a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn StringBuilder implicitPerms = null; 1102a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn for (int ip=0; ip<NP; ip++) { 1103a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final PackageParser.NewPermissionInfo npi 1104a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = PackageParser.NEW_PERMISSIONS[ip]; 1105a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) { 1106a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn break; 1107a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 1108a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (!pkg.requestedPermissions.contains(npi.name)) { 1109a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (implicitPerms == null) { 1110a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms = new StringBuilder(128); 1111a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(pkg.packageName); 1112a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(": compat added "); 1113a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } else { 1114a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(' '); 1115a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 1116a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(npi.name); 1117a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.requestedPermissions.add(npi.name); 1118a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 1119851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 1120a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (implicitPerms != null) { 1121a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.i(TAG, implicitPerms.toString()); 1122a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 1123851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 1124723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsSmallScreens < 0 || (supportsSmallScreens > 0 1125723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 112611b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1127723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS; 1128723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1129723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsNormalScreens != 0) { 1130723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS; 1131723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1132723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsLargeScreens < 0 || (supportsLargeScreens > 0 1133723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 113411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1135723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS; 1136723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 113714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn if (supportsXLargeScreens < 0 || (supportsXLargeScreens > 0 113814cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 113914cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn >= android.os.Build.VERSION_CODES.GINGERBREAD)) { 114014cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS; 114114cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn } 1142c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (resizeable < 0 || (resizeable > 0 1143c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 114411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1145c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS; 1146c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 114711b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn if (anyDensity < 0 || (anyDensity > 0 114811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 114911b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 115011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES; 11511ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima } 11521ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildClassName(String pkg, CharSequence clsSeq, 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clsSeq == null || clsSeq.length() <= 0) { 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Empty class name in package " + pkg; 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cls = clsSeq.toString(); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = cls.charAt(0); 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + cls).intern(); 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cls.indexOf('.') < 0) { 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder b = new StringBuilder(pkg); 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append('.'); 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append(cls); 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b.toString().intern(); 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c >= 'a' && c <= 'z') { 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cls.intern(); 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad class name " + cls + " in package " + pkg; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildCompoundName(String pkg, 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String type, String[] outError) { 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String proc = procSeq.toString(); 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = proc.charAt(0); 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg != null && c == ':') { 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (proc.length() < 2) { 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad " + type + " name " + proc + " in package " + pkg 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": must be at least two characters"; 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String subName = proc.substring(1); 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(subName, false); 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null) { 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + proc).intern(); 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(proc, true); 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"system".equals(proc)) { 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 proc.intern(); 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildProcessName(String pkg, String defProc, 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, int flags, String[] separateProcesses, 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) { 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc != null ? defProc : pkg; 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (separateProcesses != null) { 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=separateProcesses.length-1; i>=0; i--) { 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String sp = separateProcesses[i]; 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) { 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null || procSeq.length() <= 0) { 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1225d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn return buildCompoundName(pkg, procSeq, "process", outError); 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildTaskAffinityName(String pkg, String defProc, 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String[] outError) { 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null) { 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq.length() <= 0) { 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buildCompoundName(pkg, procSeq, "taskAffinity", outError); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PermissionGroup parsePermissionGroup(Package owner, Resources res, 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup perm = new PermissionGroup(owner); 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-group>", sa, 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_name, 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_label, 125181cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon, 125281cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermissionGroup_logo)) { 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_description, 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm, 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissionGroups.add(perm); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermission(Package owner, Resources res, 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission); 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission>", sa, 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_name, 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_label, 128781cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermission_icon, 128881cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermission_logo)) { 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1294cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1295cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = sa.getNonResourceString( 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup); 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.group != null) { 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = perm.info.group.intern(); 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_description, 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = sa.getInt( 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel, 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.protectionLevel == -1) { 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission> does not specify protectionLevel"; 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission>", perm, 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 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 owner.permissions.add(perm); 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermissionTree(Package owner, Resources res, 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree); 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-tree>", sa, 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_name, 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_label, 134181cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermissionTree_icon, 134281cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermissionTree_logo)) { 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = perm.info.name.indexOf('.'); 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index > 0) { 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = perm.info.name.indexOf('.', index+1); 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission-tree> name has less than three segments: " 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + perm.info.name; 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = 0; 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL; 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.tree = true; 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm, 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissions.add(perm); 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Instrumentation parseInstrumentation(Package owner, Resources res, 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation); 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseInstrumentationArgs == null) { 13831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError, 13841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_name, 13851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_label, 138681cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestInstrumentation_icon, 138781cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestInstrumentation_logo); 13881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.tag = "<instrumentation>"; 13891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 13901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 13911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.sa = sa; 13921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 13931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Instrumentation a = new Instrumentation(mParseInstrumentationArgs, 13941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn new InstrumentationInfo()); 13951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1402cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1403cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage); 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.targetPackage = str != null ? str.intern() : null; 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.handleProfiling = sa.getBoolean( 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling, 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.functionalTest = sa.getBoolean( 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest, 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.info.targetPackage == null) { 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<instrumentation> does not specify targetPackage"; 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a, 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.instrumentation.add(a); 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseApplication(Package owner, Resources res, 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ApplicationInfo ai = owner.applicationInfo; 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String pkgName = owner.applicationInfo.packageName; 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication); 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1444cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 1445cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_name, 0); 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null) { 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.className = buildClassName(pkgName, name, outError); 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai.className == null) { 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1455cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String manageSpaceActivity = sa.getNonConfigurationString( 1456cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, 0); 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (manageSpaceActivity != null) { 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity, 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError); 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1462181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate boolean allowBackup = sa.getBoolean( 1463181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true); 1464181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate if (allowBackup) { 1465181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; 14665e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate 14673de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate // backupAgent, killAfterRestore, and restoreAnyVersion are only relevant 14683de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate // if backup is possible for the given application. 1469cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String backupAgent = sa.getNonConfigurationString( 1470cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0); 1471181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate if (backupAgent != null) { 1472181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate ai.backupAgentName = buildClassName(pkgName, backupAgent, outError); 1473a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (false) { 1474a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.v(TAG, "android:backupAgent = " + ai.backupAgentName 1475a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " from " + pkgName + "+" + backupAgent); 1476a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 14775e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate 14785e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate if (sa.getBoolean( 14795e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore, 14805e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate true)) { 14815e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE; 14825e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate } 14835e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate if (sa.getBoolean( 14843dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_restoreAnyVersion, 14853dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate false)) { 14863dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate ai.flags |= ApplicationInfo.FLAG_RESTORE_ANY_VERSION; 14873dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate } 1488181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate } 1489181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate } 1490181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_label); 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (ai.labelRes=v.resourceId) == 0) { 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.nonLocalizedLabel = v.coerceToString(); 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.icon = sa.getResourceId( 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_icon, 0); 149981cd2e90ccdda498234384c8207afe2213714e60Adam Powell ai.logo = sa.getResourceId( 150081cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestApplication_logo, 0); 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.theme = sa.getResourceId( 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_theme, 0); 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.descriptionRes = sa.getResourceId( 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_description, 0); 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_persistent, 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_PERSISTENT; 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1514af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu if ((flags & PARSE_FORWARD_LOCK) != 0) { 1515af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu ai.flags |= ApplicationInfo.FLAG_FORWARD_LOCK; 1516af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } 1517af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu 1518af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu if ((flags & PARSE_ON_SDCARD) != 0) { 15196069beb2dfed6da837bf7faa3db3f6119edc017aSuchi Amalapurapu ai.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE; 1520af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } 1521af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_debuggable, 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE; 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 1529ef3f5ddc2137ed99e41f00441b688fb56b855179Ben Cheng com.android.internal.R.styleable.AndroidManifestApplication_vmSafeMode, 153023085b781e145ed684e7270af1d5ced6800b8effBen Cheng false)) { 153123085b781e145ed684e7270af1d5ced6800b8effBen Cheng ai.flags |= ApplicationInfo.FLAG_VM_SAFE_MODE; 153223085b781e145ed684e7270af1d5ced6800b8effBen Cheng } 153323085b781e145ed684e7270af1d5ced6800b8effBen Cheng 1534529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy boolean hardwareAccelerated = sa.getBoolean( 1535812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy com.android.internal.R.styleable.AndroidManifestApplication_hardwareAccelerated, 1536529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy false); 1537812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy 1538812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy if (sa.getBoolean( 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_hasCode, 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_HAS_CODE; 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting, 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING; 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData, 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA; 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1556ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn if (sa.getBoolean( 1557ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_testOnly, 1558e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn false)) { 1559ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn ai.flags |= ApplicationInfo.FLAG_TEST_ONLY; 1560ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } 1561ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn 15621874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor if (sa.getBoolean( 15631874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor com.android.internal.R.styleable.AndroidManifestApplication_neverEncrypt, 15641874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor false)) { 15651874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor ai.flags |= ApplicationInfo.FLAG_NEVER_ENCRYPT; 15661874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor } 15671874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1569cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1570cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_permission, 0); 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.permission = (str != null && str.length() > 0) ? str.intern() : null; 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1573d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { 1574d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn str = sa.getNonConfigurationString( 1575d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, 0); 1576d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } else { 1577d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // Some older apps have been seen to use a resource reference 1578d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // here that on older builds was ignored (with a warning). We 1579d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // need to continue to do this for them so they don't break. 1580d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn str = sa.getNonResourceString( 1581d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity); 1582d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName, 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str, outError); 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] == null) { 1587d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn CharSequence pname; 1588d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { 1589d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = sa.getNonConfigurationString( 1590d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_process, 0); 1591d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } else { 1592d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // Some older apps have been seen to use a resource reference 1593d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // here that on older builds was ignored (with a warning). We 1594d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // need to continue to do this for them so they don't break. 1595d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = sa.getNonResourceString( 1596d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_process); 1597d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } 1598d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn ai.processName = buildProcessName(ai.packageName, null, pname, 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags, mSeparateProcesses, outError); 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1601cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn ai.enabled = sa.getBoolean( 1602cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_enabled, true); 1603860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 1604860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (sa.getBoolean( 1605860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_heavyWeight, 1606860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn false)) { 1607860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn ai.flags |= ApplicationInfo.FLAG_HEAVY_WEIGHT; 1608860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 1609860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // A heavy-weight application can not be in a custom process. 1610860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // We can do direct compare because we intern all strings. 1611860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (ai.processName != null && ai.processName != ai.packageName) { 1612860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn outError[0] = "Heavy-weight applications can not use custom processes"; 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")) { 1635529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false, 1636529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy hardwareAccelerated); 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("receiver")) { 1645529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true, false); 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.receivers.add(a); 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("service")) { 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Service s = parseService(owner, res, parser, attrs, flags, outError); 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.services.add(s); 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("provider")) { 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider p = parseProvider(owner, res, parser, attrs, flags, outError); 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) { 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.providers.add(p); 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("activity-alias")) { 16721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError); 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note: application meta-data is stored off to the side, so it can 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remain null in the primary copy (we like to avoid extra copies because 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it can be large) 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData, 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-library")) { 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary); 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1694cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1695cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String lname = sa.getNonResourceString( 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary_name); 169849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn boolean req = sa.getBoolean( 169949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesLibrary_required, 170049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn true); 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 170449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (lname != null) { 170549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (req) { 170649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (owner.usesLibraries == null) { 170749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesLibraries = new ArrayList<String>(); 170849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 170949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (!owner.usesLibraries.contains(lname)) { 171049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesLibraries.add(lname.intern()); 171149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 171249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } else { 171349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (owner.usesOptionalLibraries == null) { 171449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesOptionalLibraries = new ArrayList<String>(); 171549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 171649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (!owner.usesOptionalLibraries.contains(lname)) { 171749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesOptionalLibraries.add(lname.intern()); 171849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 171949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 1726a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <application>: " + tagName 1727a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 1728a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <application>: " + tagName; 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo, 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError, String tag, TypedArray sa, 174481cd2e90ccdda498234384c8207afe2213714e60Adam Powell int nameRes, int labelRes, int iconRes, int logoRes) { 1745cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString(nameRes, 0); 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = tag + " does not specify android:name"; 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.name 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = buildClassName(owner.applicationInfo.packageName, name, outError); 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.name == null) { 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iconVal = sa.getResourceId(iconRes, 0); 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iconVal != 0) { 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = iconVal; 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = null; 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 176281cd2e90ccdda498234384c8207afe2213714e60Adam Powell 176381cd2e90ccdda498234384c8207afe2213714e60Adam Powell int logoVal = sa.getResourceId(logoRes, 0); 176481cd2e90ccdda498234384c8207afe2213714e60Adam Powell if (logoVal != 0) { 176581cd2e90ccdda498234384c8207afe2213714e60Adam Powell outInfo.logo = logoVal; 176681cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue(labelRes); 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.packageName = owner.packageName; 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivity(Package owner, Resources res, 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError, 1780529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy boolean receiver, boolean hardwareAccelerated) 1781529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy throws XmlPullParserException, IOException { 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity); 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityArgs == null) { 17861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = new ParseComponentArgs(owner, outError, 17871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_name, 17881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_label, 17891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_icon, 179081cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestActivity_logo, 17911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 17921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_process, 17938aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_description, 17941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_enabled); 17951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 17961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 17971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>"; 17981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.sa = sa; 17991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.flags = flags; 18001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 18011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityArgs, new ActivityInfo()); 18021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported); 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported, false); 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.theme = sa.getResourceId( 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_theme, 0); 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1818cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1819cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_permission, 0); 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = owner.applicationInfo.permission; 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1826cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1827cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, 0); 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName, 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.applicationInfo.taskAffinity, str, outError); 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags = 0; 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_multiprocess, 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS; 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch, 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH; 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch, 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH; 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_noHistory, 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_NO_HISTORY; 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState, 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE; 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded, 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED; 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents, 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS; 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting, 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) { 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING; 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1880ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn if (sa.getBoolean( 1881ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_finishOnCloseSystemDialogs, 1882ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn false)) { 1883ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn a.info.flags |= ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS; 1884ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 1885ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn 1886613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler if (sa.getBoolean( 1887613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler com.android.internal.R.styleable.AndroidManifestActivity_immersive, 1888613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler false)) { 1889613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler a.info.flags |= ActivityInfo.FLAG_IMMERSIVE; 1890613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler } 1891529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!receiver) { 1893529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy if (sa.getBoolean( 1894529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy com.android.internal.R.styleable.AndroidManifestActivity_hardwareAccelerated, 1895529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy hardwareAccelerated)) { 1896529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy a.info.flags |= ActivityInfo.FLAG_HARDWARE_ACCELERATED; 1897529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy } 1898529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = sa.getInt( 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_launchMode, 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.LAUNCH_MULTIPLE); 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.screenOrientation = sa.getInt( 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation, 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = sa.getInt( 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_configChanges, 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.softInputMode = sa.getInt( 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode, 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE; 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = 0; 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1918860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (receiver && (owner.applicationInfo.flags&ApplicationInfo.FLAG_HEAVY_WEIGHT) != 0) { 1919860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // A heavy-weight application can not have receives in its main process 1920860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // We can do direct compare because we intern all strings. 1921860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (a.info.processName == owner.packageName) { 1922860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn outError[0] = "Heavy-weight applications can not have receivers in main process"; 1923860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 1924860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 1925860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) { 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 1945bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn Log.w(TAG, "No actions in intent filter at " 1946bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + mArchiveSourcePath + " " 1947bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 1960a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <receiver>: " + parser.getName() 1961a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 1962a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1964a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <activity>: " + parser.getName() 1965a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 1966a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <receiver>: " + parser.getName(); 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <activity>: " + parser.getName(); 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivityAlias(Package owner, Resources res, 19881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 19891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn throws XmlPullParserException, IOException { 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias); 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1993cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String targetActivity = sa.getNonConfigurationString( 1994cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, 0); 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> does not specify android:targetActivity"; 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity = buildClassName(owner.applicationInfo.packageName, 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity, outError); 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityAliasArgs == null) { 20091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs = new ParseComponentArgs(owner, outError, 20101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_name, 20111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_label, 20121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_icon, 201381cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestActivityAlias_logo, 20141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 20151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 0, 20168aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_description, 20171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled); 20181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.tag = "<activity-alias>"; 20191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 20201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 20211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.sa = sa; 20221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.flags = flags; 20231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity target = null; 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = owner.activities.size(); 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NA; i++) { 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity t = owner.activities.get(i); 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity.equals(t.info.name)) { 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target = t; 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == null) { 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> target activity " + targetActivity 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " not found in manifest"; 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ActivityInfo info = new ActivityInfo(); 20431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.targetActivity = targetActivity; 20441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.configChanges = target.info.configChanges; 20451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.flags = target.info.flags; 20461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.icon = target.info.icon; 204781cd2e90ccdda498234384c8207afe2213714e60Adam Powell info.logo = target.info.logo; 20481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.labelRes = target.info.labelRes; 20491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.nonLocalizedLabel = target.info.nonLocalizedLabel; 20501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.launchMode = target.info.launchMode; 20511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.processName = target.info.processName; 20528aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (info.descriptionRes == 0) { 20538aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn info.descriptionRes = target.info.descriptionRes; 20548aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 20551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.screenOrientation = target.info.screenOrientation; 20561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.taskAffinity = target.info.taskAffinity; 20571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.theme = target.info.theme; 20581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 20591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityAliasArgs, info); 20601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported); 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false); 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 2073cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2074cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_permission, 0); 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) { 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 2100bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn Log.w(TAG, "No actions in intent filter at " 2101bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + mArchiveSourcePath + " " 2102bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2113a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName() 2114a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 2115a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <activity-alias>: " + parser.getName(); 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Provider parseProvider(Package owner, Resources res, 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider); 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseProviderArgs == null) { 21381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = new ParseComponentArgs(owner, outError, 21391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_name, 21401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_label, 21411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_icon, 214281cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestProvider_logo, 21431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 21441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_process, 21458aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_description, 21461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_enabled); 21471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.tag = "<provider>"; 21481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 21491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 21501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.sa = sa; 21511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.flags = flags; 21521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 21531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Provider p = new Provider(mParseProviderArgs, new ProviderInfo()); 21541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.exported = sa.getBoolean( 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_exported, true); 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2162cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String cpname = sa.getNonConfigurationString( 2163cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_authorities, 0); 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.isSyncable = sa.getBoolean( 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_syncable, 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2169cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String permission = sa.getNonConfigurationString( 2170cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_permission, 0); 2171cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2172cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_readPermission, 0); 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = owner.applicationInfo.permission; 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2182cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2183cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_writePermission, 0); 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = owner.applicationInfo.permission; 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.grantUriPermissions = sa.getBoolean( 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions, 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.multiprocess = sa.getBoolean( 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_multiprocess, 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.initOrder = sa.getInt( 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_initOrder, 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2208860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_HEAVY_WEIGHT) != 0) { 2209860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // A heavy-weight application can not have providers in its main process 2210860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // We can do direct compare because we intern all strings. 2211860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (p.info.processName == owner.packageName) { 2212860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn outError[0] = "Heavy-weight applications can not have providers in main process"; 2213860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn return null; 2214860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2215860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2216860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpname == null) { 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<provider> does not incude authorities attribute"; 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.authority = cpname.intern(); 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseProviderTags(res, parser, attrs, p, outError)) { 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseProviderTags(Resources res, 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider outInfo, String[] outError) 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22482af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("grant-uri-permission")) { 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission); 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher pa = null; 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2255cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2256cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path, 0); 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL); 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2261cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2262cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix, 0); 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX); 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2267cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2268cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern, 0); 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22722af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pa != null) { 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.info.uriPermissionPatterns == null) { 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = new PatternMatcher[1]; 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns[0] = pa; 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = outInfo.info.uriPermissionPatterns.length; 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher[] newp = new PatternMatcher[N+1]; 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N); 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newp[N] = pa; 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = newp; 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.grantUriPermissions = true; 22872af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 22882af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2289a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <path-permission>: " 2290a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2291a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 22922af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 22932af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 22942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22952af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>"; 22962af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn return false; 22972af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22982af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 22992af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23002af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else if (parser.getName().equals("path-permission")) { 23012af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn TypedArray sa = res.obtainAttributes(attrs, 23022af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission); 23032af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23042af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PathPermission pa = null; 23052af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2306cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String permission = sa.getNonConfigurationString( 2307cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_permission, 0); 2308cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String readPermission = sa.getNonConfigurationString( 2309cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_readPermission, 0); 23102af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (readPermission == null) { 23112af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn readPermission = permission; 23122af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 2313cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String writePermission = sa.getNonConfigurationString( 2314cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_writePermission, 0); 23152af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (writePermission == null) { 23162af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn writePermission = permission; 23172af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23182af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23192af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn boolean havePerm = false; 23202af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (readPermission != null) { 23212af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn readPermission = readPermission.intern(); 23222af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn havePerm = true; 23232af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23242af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (writePermission != null) { 2325e04b1ad9cd3d9a159d4c7721a374f987be1062cdBjorn Bringert writePermission = writePermission.intern(); 23262af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn havePerm = true; 23272af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23282af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23292af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!havePerm) { 23302af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2331a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "No readPermission or writePermssion for <path-permission>: " 2332a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2333a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 23342af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 23352af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 23362af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23372af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outError[0] = "No readPermission or writePermssion for <path-permission>"; 23382af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn return false; 23392af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23402af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2341cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String path = sa.getNonConfigurationString( 2342cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_path, 0); 23432af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 23442af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 23452af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_LITERAL, readPermission, writePermission); 23462af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23472af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2348cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn path = sa.getNonConfigurationString( 2349cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_pathPrefix, 0); 23502af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 23512af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 23522af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_PREFIX, readPermission, writePermission); 23532af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23542af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2355cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn path = sa.getNonConfigurationString( 2356cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_pathPattern, 0); 23572af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 23582af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 23592af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_SIMPLE_GLOB, readPermission, writePermission); 23602af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23612af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23622af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn sa.recycle(); 23632af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23642af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (pa != null) { 23652af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (outInfo.info.pathPermissions == null) { 23662af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions = new PathPermission[1]; 23672af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions[0] = pa; 23682af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 23692af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn final int N = outInfo.info.pathPermissions.length; 23702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PathPermission[] newp = new PathPermission[N+1]; 23712af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn System.arraycopy(outInfo.info.pathPermissions, 0, newp, 0, N); 23722af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn newp[N] = pa; 23732af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions = newp; 23742af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23752af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 23762af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2377a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: " 2378a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2379a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 23802af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 23812af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 23822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 23832af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>"; 23842af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn return false; 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <provider>: " 2391a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2392a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <provider>: " 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Service parseService(Package owner, Resources res, 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService); 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseServiceArgs == null) { 24111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = new ParseComponentArgs(owner, outError, 24121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_name, 24131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_label, 24141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_icon, 241581cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestService_logo, 24161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 24171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_process, 24188aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestService_description, 24191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_enabled); 24201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.tag = "<service>"; 24211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 24221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 24231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.sa = sa; 24241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.flags = flags; 24251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 24261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Service s = new Service(mParseServiceArgs, new ServiceInfo()); 24271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported); 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = sa.getBoolean( 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported, false); 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2439cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2440cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_permission, 0); 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = owner.applicationInfo.permission; 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = str.length() > 0 ? str.toString().intern() : null; 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2449860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_HEAVY_WEIGHT) != 0) { 2450860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // A heavy-weight application can not have services in its main process 2451860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // We can do direct compare because we intern all strings. 2452860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (s.info.processName == owner.packageName) { 2453860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn outError[0] = "Heavy-weight applications can not have services in main process"; 2454860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn return null; 2455860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2456860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2457860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceIntentInfo intent = new ServiceIntentInfo(s); 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) { 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.intents.add(intent); 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData, 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <service>: " 2482a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2483a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <service>: " 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = s.intents.size() > 0; 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s; 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseAllMetaData(Resources res, 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String tag, 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Component outInfo, String[] outError) 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 25149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under " + tag + ": " 2521a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2522a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under " + tag + ": " 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle parseMetaData(Resources res, 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle data, String[] outError) 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData); 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == null) { 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = new Bundle(); 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2546cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 2547cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestMetaData_name, 0); 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:name attribute"; 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2554854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn name = name.intern(); 2555854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_resource); 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && v.resourceId != 0) { 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Meta data ref " + name + ": " + v); 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.resourceId); 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = sa.peekValue( 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_value); 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Meta data " + name + ": " + v); 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null) { 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v.type == TypedValue.TYPE_STRING) { 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence cs = v.coerceToString(); 2568854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn data.putString(name, cs != null ? cs.toString().intern() : null); 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) { 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putBoolean(name, v.data != 0); 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type >= TypedValue.TYPE_FIRST_INT 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && v.type <= TypedValue.TYPE_LAST_INT) { 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.data); 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_FLOAT) { 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putFloat(name, v.getFloat()); 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2578a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: " 2579a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2580a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types"; 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:value or android:resource attribute"; 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String ANDROID_RESOURCES 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = "http://schemas.android.com/apk/res/android"; 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseIntent(Resources res, 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentInfo outInfo, String[] outError, boolean isActivity) 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter); 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int priority = sa.getInt( 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0); 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) { 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Activity with priority > 0, forcing to 0 at " 2614a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + mArchiveSourcePath + " " 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getPositionDescription()); 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project priority = 0; 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.setPriority(priority); 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_label); 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = sa.getResourceId( 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0); 262881cd2e90ccdda498234384c8207afe2213714e60Adam Powell 262981cd2e90ccdda498234384c8207afe2213714e60Adam Powell outInfo.logo = sa.getResourceId( 263081cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestIntentFilter_logo, 0); 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nodeName = parser.getName(); 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nodeName.equals("action")) { 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addAction(value); 26539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("category")) { 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 26589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addCategory(value); 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("data")) { 26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData); 26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2668cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2669cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_mimeType, 0); 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataType(str); 26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IntentFilter.MalformedMimeTypeException e) { 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = e.toString(); 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2680cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2681cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_scheme, 0); 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataScheme(str); 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2686cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String host = sa.getNonConfigurationString( 2687cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_host, 0); 2688cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String port = sa.getNonConfigurationString( 2689cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_port, 0); 26909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (host != null) { 26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataAuthority(host, port); 26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2694cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2695cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_path, 0); 26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL); 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2700cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2701cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_pathPrefix, 0); 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX); 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2706cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2707cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_pathPattern, 0); 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 27099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!RIGID_PARSER) { 2715a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <intent-filter>: " 2716a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2717a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <intent-filter>: " + parser.getName(); 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT); 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cats = ""; 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<String> it = outInfo.categoriesIterator(); 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it != null && it.hasNext()) { 27309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cats += " " + it.next(); 27319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Intent d=" + 27339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault + ", cat=" + cats); 27349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 27379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Package { 27406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String packageName; 27419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For now we only support one application per package. 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ApplicationInfo applicationInfo = new ApplicationInfo(); 27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Permission> permissions = new ArrayList<Permission>(0); 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0); 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> activities = new ArrayList<Activity>(0); 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> receivers = new ArrayList<Activity>(0); 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Provider> providers = new ArrayList<Provider>(0); 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Service> services = new ArrayList<Service>(0); 27519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0); 27529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> requestedPermissions = new ArrayList<String>(); 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2755854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn public ArrayList<String> protectedBroadcasts; 2756854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 275749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<String> usesLibraries = null; 275849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<String> usesOptionalLibraries = null; 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] usesLibraryFiles = null; 27609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2761c1552397be706c243338389c628a44eee6011eaeDianne Hackborn public ArrayList<String> mOriginalPackages = null; 27626dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String mRealPackage = null; 2763b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn public ArrayList<String> mAdoptPermissions = null; 2764b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 27659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We store the application meta-data independently to avoid multiple unwanted references 27669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle mAppMetaData = null; 27679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is a 3rd party app, this is the path of the zip file. 27699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mPath; 27709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version code declared for this package. 27729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mVersionCode; 27739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version name declared for this package. 27759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mVersionName; 27769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user id that this package wants to use. 27789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mSharedUserId; 27799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user label that this package wants to use. 27819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mSharedUserLabel; 27829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Signatures that were read from the package. 27849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Signature mSignatures[]; 27859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For use by package manager service for quick lookup of 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preferred up order. 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mPreferredOrder = 0; 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27905c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // For use by the package manager to keep track of the path to the 27915c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // file an app came from. 27925c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public String mScanPath; 27935c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 27945c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // For use by package manager to keep track of where it has done dexopt. 27955c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public boolean mDidDexOpt; 27965c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 279746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn // User set enabled state. 279846730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn public int mSetEnabled = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 279946730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Additional data supplied by callers. 28019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object mExtras; 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications hardware preferences 28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<ConfigurationInfo> configPreferences = 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ArrayList<ConfigurationInfo>(); 28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 280949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn /* 281049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn * Applications requested features 281149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn */ 281249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<FeatureInfo> reqFeatures = null; 281349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn 2814117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu public int installLocation; 2815117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Package(String _name) { 28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = _name; 28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.packageName = _name; 28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.uid = -1; 28209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String newName) { 28236dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn packageName = newName; 28246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn applicationInfo.packageName = newName; 28256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=permissions.size()-1; i>=0; i--) { 28266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn permissions.get(i).setPackageName(newName); 28276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=permissionGroups.size()-1; i>=0; i--) { 28296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn permissionGroups.get(i).setPackageName(newName); 28306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=activities.size()-1; i>=0; i--) { 28326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn activities.get(i).setPackageName(newName); 28336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=receivers.size()-1; i>=0; i--) { 28356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn receivers.get(i).setPackageName(newName); 28366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=providers.size()-1; i>=0; i--) { 28386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn providers.get(i).setPackageName(newName); 28396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=services.size()-1; i>=0; i--) { 28416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn services.get(i).setPackageName(newName); 28426dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=instrumentation.size()-1; i>=0; i--) { 28446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn instrumentation.get(i).setPackageName(newName); 28456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28476dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Package{" 28509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + packageName + "}"; 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Component<II extends IntentInfo> { 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Package owner; 28571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ArrayList<II> intents; 28586dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public final String className; 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle metaData; 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn ComponentName componentName; 28626dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn String componentShortName; 28636dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Package _owner) { 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = _owner; 28661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = null; 28676dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 28681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) { 28711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = args.owner; 28721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = new ArrayList<II>(0); 2873cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = args.sa.getNonConfigurationString(args.nameRes, 0); 28741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (name == null) { 28756dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 28761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not specify android:name"; 28771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 28781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.name 28811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn = buildClassName(owner.applicationInfo.packageName, name, args.outError); 28821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outInfo.name == null) { 28836dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 28841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not have valid android:name"; 28851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 28861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28886dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = outInfo.name; 28891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int iconVal = args.sa.getResourceId(args.iconRes, 0); 28911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (iconVal != 0) { 28921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.icon = iconVal; 28931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = null; 28941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 289581cd2e90ccdda498234384c8207afe2213714e60Adam Powell 289681cd2e90ccdda498234384c8207afe2213714e60Adam Powell int logoVal = args.sa.getResourceId(args.logoRes, 0); 289781cd2e90ccdda498234384c8207afe2213714e60Adam Powell if (logoVal != 0) { 289881cd2e90ccdda498234384c8207afe2213714e60Adam Powell outInfo.logo = logoVal; 289981cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 29001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 29011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedValue v = args.sa.peekValue(args.labelRes); 29021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 29031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = v.coerceToString(); 29041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 29051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 29061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.packageName = owner.packageName; 29071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 29081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 29091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParseComponentArgs args, final ComponentInfo outInfo) { 29101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn this(args, (PackageItemInfo)outInfo); 29111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.outError[0] != null) { 29121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 29131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 29141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 29151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.processRes != 0) { 2916d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn CharSequence pname; 2917d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { 2918d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = args.sa.getNonConfigurationString(args.processRes, 0); 2919d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } else { 2920d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // Some older apps have been seen to use a resource reference 2921d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // here that on older builds was ignored (with a warning). We 2922d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // need to continue to do this for them so they don't break. 2923d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = args.sa.getNonResourceString(args.processRes); 2924d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } 29251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.processName = buildProcessName(owner.applicationInfo.packageName, 2926d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn owner.applicationInfo.processName, pname, 29271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.flags, args.sepProcesses, args.outError); 29281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 29298aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 29308aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (args.descriptionRes != 0) { 29318aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn outInfo.descriptionRes = args.sa.getResourceId(args.descriptionRes, 0); 29328aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 29338aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 29341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.enabled = args.sa.getBoolean(args.enabledRes, true); 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Component<II> clone) { 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = clone.owner; 29391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = clone.intents; 29406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = clone.className; 29416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = clone.componentName; 29421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = clone.componentShortName; 29436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 29456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public ComponentName getComponentName() { 29466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (componentName != null) { 29476dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentName; 29486dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29496dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (className != null) { 29506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = new ComponentName(owner.applicationInfo.packageName, 29516dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className); 29526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentName; 29546dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29556dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 29566dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String getComponentShortName() { 29576dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (componentShortName != null) { 29586dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentShortName; 29596dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29606dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn ComponentName component = getComponentName(); 29616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (component != null) { 29626dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentShortName = component.flattenToShortString(); 29636dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29646dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentShortName; 29656dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29666dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 29676dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 29686dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = null; 29696dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentShortName = null; 29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Permission extends Component<IntentInfo> { 29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionInfo info; 29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean tree; 29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup group; 29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner) { 29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionInfo(); 29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner, PermissionInfo _info) { 29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29876dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 29886dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 29896dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 29906dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 29916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Permission{" 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class PermissionGroup extends Component<IntentInfo> { 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionGroupInfo info; 30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner) { 30049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 30059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionGroupInfo(); 30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner, PermissionGroupInfo _info) { 30099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 30109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 30119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30136dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 30146dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 30156dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 30166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "PermissionGroup{" 30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static boolean copyNeeded(int flags, Package p, Bundle metaData) { 302646730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn if (p.mSetEnabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) { 302746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn boolean enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; 302846730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn if (p.applicationInfo.enabled != enabled) { 302946730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn return true; 303046730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn } 303146730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn } 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (metaData != null || p.mAppMetaData != null)) { 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0 30379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && p.usesLibraryFiles != null) { 30389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 30399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ApplicationInfo generateApplicationInfo(Package p, int flags) { 30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p, null)) { 304669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima // CompatibilityMode is global state. It's safe to modify the instance 304769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima // of the package. 304869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima if (!sCompatibilityModeEnabled) { 304969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima p.applicationInfo.disableCompatibilityMode(); 305069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.applicationInfo; 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copy so we can store the metadata/libraries safely 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = new ApplicationInfo(p.applicationInfo); 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0) { 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = p.mAppMetaData; 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) { 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.sharedLibraryFiles = p.usesLibraryFiles; 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 306269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima if (!sCompatibilityModeEnabled) { 306369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima ai.disableCompatibilityMode(); 306469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 306546730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn ai.enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionInfo generatePermissionInfo( 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission p, int flags) { 30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = new PermissionInfo(p.info); 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionGroupInfo generatePermissionGroupInfo( 30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup pg, int flags) { 30829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pg == null) return null; 30839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 30849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pg.info; 30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info); 30879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.metaData = pg.metaData; 30889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pgi; 30899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Activity extends Component<ActivityIntentInfo> { 30921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ActivityInfo info; 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Activity(final ParseComponentArgs args, final ActivityInfo _info) { 30951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 30961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 30971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 31006dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 31016dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 31026dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 31036dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31046dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Activity{" 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 31086dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ActivityInfo generateActivityInfo(Activity a, 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) return null; 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, a.owner, a.metaData)) { 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a.info; 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo ai = new ActivityInfo(a.info); 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = a.metaData; 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.applicationInfo = generateApplicationInfo(a.owner, flags); 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Service extends Component<ServiceIntentInfo> { 31261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ServiceInfo info; 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Service(final ParseComponentArgs args, final ServiceInfo _info) { 31291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 31301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 31311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 31346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 31356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 31366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 31376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Service{" 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 31426dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ServiceInfo generateServiceInfo(Service s, int flags) { 31479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) return null; 31489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, s.owner, s.metaData)) { 31499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s.info; 31509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 31529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = new ServiceInfo(s.info); 31539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.metaData = s.metaData; 31549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.applicationInfo = generateApplicationInfo(s.owner, flags); 31559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return si; 31569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Provider extends Component { 31599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ProviderInfo info; 31609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean syncable; 31619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Provider(final ParseComponentArgs args, final ProviderInfo _info) { 31631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 31641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 31651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 31669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project syncable = false; 31679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 31699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Provider(Provider existingProvider) { 31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(existingProvider); 31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.info = existingProvider.info; 31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.syncable = existingProvider.syncable; 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31756dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 31766dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 31776dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 31786dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31796dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Provider{" 31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ProviderInfo generateProviderInfo(Provider p, 31889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 31899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 31909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p.owner, p.metaData) 31919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0 31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || p.info.uriPermissionPatterns == null)) { 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProviderInfo pi = new ProviderInfo(p.info); 31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) { 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.uriPermissionPatterns = null; 32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = generateApplicationInfo(p.owner, flags); 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Instrumentation extends Component { 32061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final InstrumentationInfo info; 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) { 32091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 32101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 32136dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 32146dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 32156dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 32166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 32176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 32189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 32199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Instrumentation{" 32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 32216dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final InstrumentationInfo generateInstrumentationInfo( 32269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Instrumentation i, int flags) { 32279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == null) return null; 32289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 32299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i.info; 32309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = new InstrumentationInfo(i.info); 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ii.metaData = i.metaData; 32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ii; 32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class IntentInfo extends IntentFilter { 32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasDefault; 32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int labelRes; 32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedLabel; 32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int icon; 324181cd2e90ccdda498234384c8207afe2213714e60Adam Powell public int logo; 32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ActivityIntentInfo extends IntentInfo { 32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Activity activity; 32469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActivityIntentInfo(Activity _activity) { 32489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project activity = _activity; 32499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 32529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ActivityIntentInfo{" 32539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 32549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + activity.info.name + "}"; 32559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ServiceIntentInfo extends IntentInfo { 32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Service service; 32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ServiceIntentInfo(Service _service) { 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service = _service; 32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ServiceIntentInfo{" 32679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 32689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + service.info.name + "}"; 32699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 327169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima 327269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima /** 327369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima * @hide 327469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima */ 327569fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) { 327669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima sCompatibilityModeEnabled = compatibilityModeEnabled; 327769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 32789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3279