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; 3105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport android.util.Base64; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 3305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport android.util.Log; 34d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Rootimport android.util.Slog; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 36a3cdaa5337fa573c4c61770195d6232c2e587090Jason parksimport com.android.internal.util.XmlUtils; 37a3cdaa5337fa573c4c61770195d6232c2e587090Jason parksimport org.xmlpull.v1.XmlPullParser; 38a3cdaa5337fa573c4c61770195d6232c2e587090Jason parksimport org.xmlpull.v1.XmlPullParserException; 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 40d63f7dbf5d30320e8fd4dd8056d245f7b1e818baKenny Rootimport java.io.BufferedInputStream; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 4505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.KeyFactory; 4605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.NoSuchAlgorithmException; 4705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.PublicKey; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException; 5005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.spec.EncodedKeySpec; 5105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.spec.InvalidKeySpecException; 5205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.security.spec.X509EncodedKeySpec; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 5605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Rootimport java.util.List; 57bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Rootimport java.util.jar.Attributes; 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry; 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile; 60d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Rootimport java.util.jar.Manifest; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser { 68d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root private static final boolean DEBUG_JAR = false; 69d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root private static final boolean DEBUG_PARSER = false; 70d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root private static final boolean DEBUG_BACKUP = false; 71d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root 72bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root /** File name in an APK for the Android manifest. */ 73bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root private static final String ANDROID_MANIFEST_FILENAME = "AndroidManifest.xml"; 74bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root 75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn /** @hide */ 76a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public static class NewPermissionInfo { 77a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final String name; 78a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final int sdkVersion; 79a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final int fileVersion; 80a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 81a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public NewPermissionInfo(String name, int sdkVersion, int fileVersion) { 82a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.name = name; 83a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.sdkVersion = sdkVersion; 84a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.fileVersion = fileVersion; 85a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 86a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 87a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 88a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn /** 89a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * List of new permissions that have been added since 1.0. 90a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * NOTE: These must be declared in SDK version order, with permissions 91a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * added to older SDKs appearing before those added to newer SDKs. 92a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * @hide 93a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn */ 9445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] = 9545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh new PackageParser.NewPermissionInfo[] { 965a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 9745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.os.Build.VERSION_CODES.DONUT, 0), 9845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE, 9945515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.os.Build.VERSION_CODES.DONUT, 0) 100a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn }; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mArchiveSourcePath; 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mSeparateProcesses; 104d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn private boolean mOnlyCoreApps; 1058d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu private static final int SDK_VERSION = Build.VERSION.SDK_INT; 1068d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu private static final String SDK_CODENAME = "REL".equals(Build.VERSION.CODENAME) 1078d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu ? null : Build.VERSION.CODENAME; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mParseError = PackageManager.INSTALL_SUCCEEDED; 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Object mSync = new Object(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static WeakReference<byte[]> mReadBuffer; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private static boolean sCompatibilityModeEnabled = true; 11590d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private static final int PARSE_DEFAULT_INSTALL_LOCATION = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 11669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima 1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParsePackageItemArgs { 1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final Package owner; 1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] outError; 1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int nameRes; 1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int labelRes; 1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int iconRes; 12381cd2e90ccdda498234384c8207afe2213714e60Adam Powell final int logoRes; 1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn String tag; 1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedArray sa; 1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParsePackageItemArgs(Package _owner, String[] _outError, 12981cd2e90ccdda498234384c8207afe2213714e60Adam Powell int _nameRes, int _labelRes, int _iconRes, int _logoRes) { 1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = _owner; 1311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outError = _outError; 1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn nameRes = _nameRes; 1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn labelRes = _labelRes; 1341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn iconRes = _iconRes; 13581cd2e90ccdda498234384c8207afe2213714e60Adam Powell logoRes = _logoRes; 1361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParseComponentArgs extends ParsePackageItemArgs { 1401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] sepProcesses; 1411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int processRes; 1428aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn final int descriptionRes; 1431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int enabledRes; 1441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int flags; 1451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParseComponentArgs(Package _owner, String[] _outError, 14781cd2e90ccdda498234384c8207afe2213714e60Adam Powell int _nameRes, int _labelRes, int _iconRes, int _logoRes, 1488aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn String[] _sepProcesses, int _processRes, 1498aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn int _descriptionRes, int _enabledRes) { 15081cd2e90ccdda498234384c8207afe2213714e60Adam Powell super(_owner, _outError, _nameRes, _labelRes, _iconRes, _logoRes); 1511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sepProcesses = _sepProcesses; 1521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn processRes = _processRes; 1538aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn descriptionRes = _descriptionRes; 1541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn enabledRes = _enabledRes; 1551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 157a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 158a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu /* Light weight package info. 159a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @hide 160a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu */ 161a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public static class PackageLite { 16205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root public final String packageName; 16305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root public final int installLocation; 16405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root public final VerifierInfo[] verifiers; 16505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 16605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root public PackageLite(String packageName, int installLocation, List<VerifierInfo> verifiers) { 167a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu this.packageName = packageName; 168a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu this.installLocation = installLocation; 16905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root this.verifiers = verifiers.toArray(new VerifierInfo[verifiers.size()]); 170a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 171a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 172a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 1731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParsePackageItemArgs mParseInstrumentationArgs; 1741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityArgs; 1751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityAliasArgs; 1761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseServiceArgs; 1771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseProviderArgs; 1781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** If set to true, we will only allow package files that exactly match 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the DTD. Otherwise, we try to get as much from the package as we 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can without failing. This should normally be set to false, to 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * support extensions to the DTD in future versions. */ 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean RIGID_PARSER = false; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "PackageParser"; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageParser(String archiveSourcePath) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = archiveSourcePath; 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSeparateProcesses(String[] procs) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSeparateProcesses = procs; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 195d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn public void setOnlyCoreApps(boolean onlyCoreApps) { 196d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn mOnlyCoreApps = onlyCoreApps; 197d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn } 198d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean isPackageFilename(String name) { 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name.endsWith(".apk"); 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Generate and return the {@link PackageInfo} for a parsed package. 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p the parsed package. 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags indicating which optional information is included. 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static PackageInfo generatePackageInfo(PackageParser.Package p, 21078d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn int gids[], int flags, long firstInstallTime, long lastUpdateTime) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo pi = new PackageInfo(); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.packageName = p.packageName; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionCode = p.mVersionCode; 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionName = p.mVersionName; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserId = p.mSharedUserId; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserLabel = p.mSharedUserLabel; 218e4a5951925f16f18dae91ed65567e96528f17feeDianne Hackborn pi.applicationInfo = generateApplicationInfo(p, flags); 219117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu pi.installLocation = p.installLocation; 22078d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn pi.firstInstallTime = firstInstallTime; 22178d688369a2240009d3bbe4126996a973b2e2fe2Dianne Hackborn pi.lastUpdateTime = lastUpdateTime; 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_GIDS) != 0) { 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.gids = gids; 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) { 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.configPreferences.size(); 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.configPreferences = new ConfigurationInfo[N]; 22949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn p.configPreferences.toArray(pi.configPreferences); 23049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 23149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn N = p.reqFeatures != null ? p.reqFeatures.size() : 0; 23249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (N > 0) { 23349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pi.reqFeatures = new FeatureInfo[N]; 23449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn p.reqFeatures.toArray(pi.reqFeatures); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_ACTIVITIES) != 0) { 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.activities.size(); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2407eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2417eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.activities = new ActivityInfo[N]; 2427eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2437eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2447eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2457eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.activities.get(i).info.enabled) num++; 2467eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2477eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.activities = new ActivityInfo[num]; 2487eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 249d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.activities.get(i); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 253d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.activities[j++] = generateActivityInfo(p.activities.get(i), flags); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_RECEIVERS) != 0) { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.receivers.size(); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2617eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2627eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.receivers = new ActivityInfo[N]; 2637eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2647eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2657eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2667eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.receivers.get(i).info.enabled) num++; 2677eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2687eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.receivers = new ActivityInfo[num]; 2697eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 270d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.receivers.get(i); 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 274d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.receivers[j++] = generateActivityInfo(p.receivers.get(i), flags); 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SERVICES) != 0) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.services.size(); 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2827eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2837eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.services = new ServiceInfo[N]; 2847eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2857eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2867eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2877eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.services.get(i).info.enabled) num++; 2887eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2897eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.services = new ServiceInfo[num]; 2907eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 291d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Service service = p.services.get(i); 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (service.info.enabled 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 295d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.services[j++] = generateServiceInfo(p.services.get(i), flags); 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PROVIDERS) != 0) { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.providers.size(); 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3037eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 3047eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.providers = new ProviderInfo[N]; 3057eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 3067eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 3077eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 3087eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.providers.get(i).info.enabled) num++; 3097eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 3107eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.providers = new ProviderInfo[num]; 3117eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 312d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Provider provider = p.providers.get(i); 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider.info.enabled 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 316d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.providers[j++] = generateProviderInfo(p.providers.get(i), flags); 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) { 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.instrumentation.size(); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation = new InstrumentationInfo[N]; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation[i] = generateInstrumentationInfo( 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.instrumentation.get(i), flags); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PERMISSIONS) != 0) { 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.permissions.size(); 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions = new PermissionInfo[N]; 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = p.requestedPermissions.size(); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions = new String[N]; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions[i] = p.requestedPermissions.get(i); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SIGNATURES) != 0) { 348d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu int N = (p.mSignatures != null) ? p.mSignatures.length : 0; 349d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu if (N > 0) { 350d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.signatures = new Signature[N]; 351d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N); 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Certificate[] loadCertificates(JarFile jarFile, JarEntry je, 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer) { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We must read the stream for the JarEntry to retrieve 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // its certificates. 362d63f7dbf5d30320e8fd4dd8056d245f7b1e818baKenny Root InputStream is = new BufferedInputStream(jarFile.getInputStream(je)); 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (is.read(readBuffer, 0, readBuffer.length) != -1) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not using 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is.close(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return je != null ? je.getCertificates() : null; 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 369d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Exception reading " + je.getName() + " in " 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarFile.getName(), e); 3716e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn } catch (RuntimeException e) { 372d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Exception reading " + je.getName() + " in " 3736e52b5d76850ee60bbef2f3d8a2e47bd589e28e8Dianne Hackborn + jarFile.getName(), e); 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 378af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_IS_SYSTEM = 1<<0; 379af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_CHATTY = 1<<1; 380af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_MUST_BE_APK = 1<<2; 381af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_IGNORE_PROCESSES = 1<<3; 382af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_FORWARD_LOCK = 1<<4; 383af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_ON_SDCARD = 1<<5; 384806da1d46c94c71728b94dec75dec6519c962b5cDianne Hackborn public final static int PARSE_IS_SYSTEM_DIR = 1<<6; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getParseError() { 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mParseError; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 390af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public Package parsePackage(File sourceFile, String destCodePath, 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayMetrics metrics, int flags) { 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_SUCCEEDED; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = sourceFile.getPath(); 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!sourceFile.isFile()) { 396d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Skipping dir: " + mArchiveSourcePath); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isPackageFilename(sourceFile.getName()) 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (flags&PARSE_MUST_BE_APK) != 0) { 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) == 0) { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We expect to have non-.apk files in the system dir, 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so don't warn about them. 405d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Skipping non-package file: " + mArchiveSourcePath); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 411d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (DEBUG_JAR) 412d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.d(TAG, "Scanning package: " + mArchiveSourcePath); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 4163b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn Resources res = null; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean assetError = true; 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 420b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project int cookie = assmgr.addAssetPath(mArchiveSourcePath); 4213b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn if (cookie != 0) { 4223b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn res = new Resources(assmgr, metrics, null); 42369cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4243b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn Build.VERSION.RESOURCES_SDK_INT); 425bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root parser = assmgr.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME); 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assetError = false; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 428d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Failed adding asset path:"+mArchiveSourcePath); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 431d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unable to read AndroidManifest.xml of " 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mArchiveSourcePath, e); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4343b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn if (assetError) { 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] errorText = new String[1]; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Package pkg = null; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Exception errorException = null; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXXX todo: need to figure out correct configuration. 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg = parsePackage(res, parser, flags, errorText); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project errorException = e; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 452d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn // If we are only parsing core apps, then a null with INSTALL_SUCCEEDED 453d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn // just means to skip this app so don't make a fuss about it. 454d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn if (!mOnlyCoreApps || mParseError != PackageManager.INSTALL_SUCCEEDED) { 455d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn if (errorException != null) { 456d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn Slog.w(TAG, mArchiveSourcePath, errorException); 457d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn } else { 458d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn Slog.w(TAG, mArchiveSourcePath + " (at " 459d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn + parser.getPositionDescription() 460d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn + "): " + errorText[0]); 461d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn } 462d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn if (mParseError == PackageManager.INSTALL_SUCCEEDED) { 463d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 464d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 474af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu // Set code and resource paths 475af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu pkg.mPath = destCodePath; 476af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu pkg.mScanPath = mArchiveSourcePath; 477af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu //pkg.applicationInfo.sourceDir = destCodePath; 478af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu //pkg.applicationInfo.publicSourceDir = destRes; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean collectCertificates(Package pkg, int flags) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<byte[]> readBufferRef; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer = null; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = mReadBuffer; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBufferRef != null) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = null; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = readBufferRef.get(); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBuffer == null) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = new byte[8192]; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = new WeakReference<byte[]>(readBuffer); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarFile jarFile = new JarFile(mArchiveSourcePath); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] certs = null; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this package comes from the system image, then we 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can trust it... we'll just use the AndroidManifest.xml 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to retrieve its signatures, not validating all of the 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // files. 511bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root JarEntry jarEntry = jarFile.getJarEntry(ANDROID_MANIFEST_FILENAME); 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = loadCertificates(jarFile, jarEntry, readBuffer); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs == null) { 514d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.e(TAG, "Package " + pkg.packageName 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarEntry.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 } 521d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (DEBUG_JAR) { 522d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " certs=" + (certs != null ? certs.length : 0)); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null) { 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 527d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.i(TAG, " Public key: " 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + certs[i].getPublicKey().getEncoded() 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + certs[i].getPublicKey()); 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 534d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Enumeration<JarEntry> entries = jarFile.entries(); 535bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root final Manifest manifest = jarFile.getManifest(); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (entries.hasMoreElements()) { 537d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root final JarEntry je = entries.nextElement(); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.isDirectory()) continue; 539d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root 540bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root final String name = je.getName(); 541bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root 542bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root if (name.startsWith("META-INF/")) 543bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root continue; 544bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root 545bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root if (ANDROID_MANIFEST_FILENAME.equals(name)) { 546bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root final Attributes attributes = manifest.getAttributes(name); 547bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root pkg.manifestDigest = ManifestDigest.fromAttributes(attributes); 548bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root } 549bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root 550bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root final Certificate[] localCerts = loadCertificates(jarFile, je, readBuffer); 551d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (DEBUG_JAR) { 552d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName() 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": certs=" + certs + " (" 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (certs != null ? certs.length : 0) + ")"); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 556bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localCerts == null) { 558d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.e(TAG, "Package " + pkg.packageName 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (certs == null) { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = localCerts; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ensure all certificates match. 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<certs.length; i++) { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean found = false; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<localCerts.length; j++) { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs[i] != null && 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].equals(localCerts[j])) { 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project found = true; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!found || certs.length != localCerts.length) { 578d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.e(TAG, "Package " + pkg.packageName 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has mismatched certificates at entry " 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = readBufferRef; 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null && certs.length > 0) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = new Signature[certs.length]; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures[i] = new Signature( 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].getEncoded()); 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 603d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.e(TAG, "Package " + pkg.packageName 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates; ignoring!"); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CertificateEncodingException e) { 609d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 613d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e); 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 617d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Exception reading " + mArchiveSourcePath, e); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 625a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu /* 626a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * Utility method that retrieves just the package name and install 627a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * location from the apk location at the given file path. 628a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @param packageFilePath file location of the apk 629a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @param flags Special parse flags 630930d3af75f9e9663222f4c4a1d75b326cf811e35Kenny Root * @return PackageLite object with package information or null on failure. 631a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu */ 632a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public static PackageLite parsePackageLite(String packageFilePath, int flags) { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 63405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final XmlResourceParser parser; 63505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final Resources res; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 63869cb87576ba163b61bb0e6477a3b7c57a9b11d40Dianne Hackborn assmgr.setConfiguration(0, 0, null, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6393b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn Build.VERSION.RESOURCES_SDK_INT); 6401ebd74acf9977daa42133507e970dab88e08f0efKenny Root 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cookie = assmgr.addAssetPath(packageFilePath); 6421ebd74acf9977daa42133507e970dab88e08f0efKenny Root if (cookie == 0) { 6431ebd74acf9977daa42133507e970dab88e08f0efKenny Root return null; 6441ebd74acf9977daa42133507e970dab88e08f0efKenny Root } 6451ebd74acf9977daa42133507e970dab88e08f0efKenny Root 64605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final DisplayMetrics metrics = new DisplayMetrics(); 64705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root metrics.setToDefaults(); 64805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root res = new Resources(assmgr, metrics, null); 649bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root parser = assmgr.openXmlResourceParser(cookie, ANDROID_MANIFEST_FILENAME); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 652d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unable to read AndroidManifest.xml of " 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageFilePath, e); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 65605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 65705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final AttributeSet attrs = parser; 65805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final String errors[] = new String[1]; 659a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu PackageLite packageLite = null; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 66105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root packageLite = parsePackageLite(res, parser, attrs, flags, errors); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 663d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, packageFilePath, e); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException e) { 665d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, packageFilePath, e); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 670a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (packageLite == null) { 671d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.e(TAG, "parsePackageLite error: " + errors[0]); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 674a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return packageLite; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String validateName(String name, boolean requiresSeparator) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = name.length(); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasSep = false; 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean front = true; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final char c = name.charAt(i); 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = false; 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!front) { 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= '0' && c <= '9') || c == '_') { 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasSep = true; 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = true; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "bad character '" + c + "'"; 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasSep || !requiresSeparator 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? null : "must have at least one '.' separator"; 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String parsePackageName(XmlPullParser parser, 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs, int flags, String[] outError) 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException, XmlPullParserException { 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 708d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root while ((type = parser.next()) != XmlPullParser.START_TAG 709d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root && type != XmlPullParser.END_DOCUMENT) { 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 713d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (type != XmlPullParser.START_TAG) { 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No start tag found"; 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 717d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (DEBUG_PARSER) 718d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.v(TAG, "Root element name: '" + parser.getName() + "'"); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parser.getName().equals("manifest")) { 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No <manifest> tag"; 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = attrs.getAttributeValue(null, "package"); 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null || pkgName.length() == 0) { 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not specify package"; 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(pkgName, true); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad package name \"" 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkgName + "\": " + nameError; 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkgName.intern(); 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 73805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root private static PackageLite parsePackageLite(Resources res, XmlPullParser parser, 73905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root AttributeSet attrs, int flags, String[] outError) throws IOException, 74005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root XmlPullParserException { 741a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 742a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int type; 743d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root while ((type = parser.next()) != XmlPullParser.START_TAG 744d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root && type != XmlPullParser.END_DOCUMENT) { 745a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu ; 746a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 747a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 748d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (type != XmlPullParser.START_TAG) { 749a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "No start tag found"; 750a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 751a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 752d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (DEBUG_PARSER) 753d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.v(TAG, "Root element name: '" + parser.getName() + "'"); 754a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (!parser.getName().equals("manifest")) { 755a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "No <manifest> tag"; 756a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 757a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 758a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String pkgName = attrs.getAttributeValue(null, "package"); 759a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (pkgName == null || pkgName.length() == 0) { 760a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "<manifest> does not specify package"; 761a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 762a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 763a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String nameError = validateName(pkgName, true); 764a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (nameError != null && !"android".equals(pkgName)) { 765a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "<manifest> specifies bad package name \"" 766a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu + pkgName + "\": " + nameError; 767a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 768a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 76990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int installLocation = PARSE_DEFAULT_INSTALL_LOCATION; 770a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu for (int i = 0; i < attrs.getAttributeCount(); i++) { 771a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String attr = attrs.getAttributeName(i); 772a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (attr.equals("installLocation")) { 773a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu installLocation = attrs.getAttributeIntValue(i, 77490d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu PARSE_DEFAULT_INSTALL_LOCATION); 775a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu break; 776a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 777a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 77805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 77905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root // Only search the tree when the tag is directly below <manifest> 78005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final int searchDepth = parser.getDepth() + 1; 78105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 78205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final List<VerifierInfo> verifiers = new ArrayList<VerifierInfo>(); 78305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 78405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() >= searchDepth)) { 78505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 78605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root continue; 78705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } 78805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 78905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root if (parser.getDepth() == searchDepth && "package-verifier".equals(parser.getName())) { 79005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final VerifierInfo verifier = parseVerifier(res, parser, attrs, flags, outError); 79105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root if (verifier != null) { 79205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root verifiers.add(verifier); 79305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } 79405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } 79505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } 79605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 79705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root return new PackageLite(pkgName.intern(), installLocation, verifiers); 798a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 799a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temporary. 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public Signature stringToSignature(String str) { 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = str.length(); 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] sig = new byte[N]; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sig[i] = (byte)str.charAt(i); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Signature(sig); 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Package parsePackage( 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res, XmlResourceParser parser, int flags, String[] outError) 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = null; 8181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = null; 8191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = null; 8201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = null; 8211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = parsePackageName(parser, attrs, flags, outError); 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null) { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn if (mOnlyCoreApps) { 830d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn boolean core = attrs.getAttributeBooleanValue(null, "coreApp", false); 831d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn if (!core) { 832d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn mParseError = PackageManager.INSTALL_SUCCEEDED; 833d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn return null; 834d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn } 835d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn } 836d2509fd83597595914ef0627685e917380863eb6Dianne Hackborn 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Package pkg = new Package(pkgName); 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean foundApp = false; 839851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionCode = sa.getInteger( 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_versionCode, 0); 844cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn pkg.mVersionName = sa.getNonConfigurationString( 845cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifest_versionName, 0); 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg.mVersionName != null) { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionName = pkg.mVersionName.intern(); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 850cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0); 851cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn if (str != null && str.length() > 0) { 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(str, true); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad sharedUserId name \"" 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + str + "\": " + nameError; 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserId = str.intern(); 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserLabel = sa.getResourceId( 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 864aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapu 865117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu pkg.installLocation = sa.getInteger( 866117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu com.android.internal.R.styleable.AndroidManifest_installLocation, 86790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu PARSE_DEFAULT_INSTALL_LOCATION); 86854e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn pkg.applicationInfo.installLocation = pkg.installLocation; 86954e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn 870723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // Resource boolean are -1, so 1 means we don't know the value. 871723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsSmallScreens = 1; 872723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsNormalScreens = 1; 873723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsLargeScreens = 1; 87414cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn int supportsXLargeScreens = 1; 875c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn int resizeable = 1; 87611b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn int anyDensity = 1; 877723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 879d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 880d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 881d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("application")) { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (foundApp) { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (RIGID_PARSER) { 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> has more than one <application>"; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 893d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "<manifest> has more than one <application>"); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project foundApp = true; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseApplication(pkg, res, parser, attrs, flags, outError)) { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-group")) { 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) { 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission")) { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermission(pkg, res, parser, attrs, outError) == null) { 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-tree")) { 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) { 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-permission")) { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 920cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString( 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission_name); 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null && !pkg.requestedPermissions.contains(name)) { 927854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.requestedPermissions.add(name.intern()); 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-configuration")) { 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ConfigurationInfo cPref = new ConfigurationInfo(); 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration); 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqTouchScreen = sa.getInt( 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen, 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.TOUCHSCREEN_UNDEFINED); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqKeyboardType = sa.getInt( 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType, 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.KEYBOARD_UNDEFINED); 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard, 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqNavigation = sa.getInt( 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation, 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.NAVIGATION_UNDEFINED); 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav, 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV; 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.configPreferences.add(cPref); 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 960d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu } else if (tagName.equals("uses-feature")) { 96149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn FeatureInfo fi = new FeatureInfo(); 962d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu sa = res.obtainAttributes(attrs, 963d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu com.android.internal.R.styleable.AndroidManifestUsesFeature); 964cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 965cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 96649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.name = sa.getNonResourceString( 96749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_name); 96849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (fi.name == null) { 96949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.reqGlEsVersion = sa.getInt( 97049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_glEsVersion, 97149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn FeatureInfo.GL_ES_VERSION_UNDEFINED); 97249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 97349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (sa.getBoolean( 97449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_required, 97549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn true)) { 97649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.flags |= FeatureInfo.FLAG_REQUIRED; 97749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 978d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu sa.recycle(); 97949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (pkg.reqFeatures == null) { 98049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.reqFeatures = new ArrayList<FeatureInfo>(); 98149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 98249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.reqFeatures.add(fi); 98349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn 98449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (fi.name == null) { 98549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn ConfigurationInfo cPref = new ConfigurationInfo(); 98649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn cPref.reqGlEsVersion = fi.reqGlEsVersion; 98749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.configPreferences.add(cPref); 98849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 989d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu 990d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu XmlUtils.skipCurrentTag(parser); 991d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu 992851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else if (tagName.equals("uses-sdk")) { 9938d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_VERSION > 0) { 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesSdk); 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 997851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int minVers = 0; 998851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String minCode = null; 999851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int targetVers = 0; 1000851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String targetCode = null; 1001851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 1002851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn TypedValue val = sa.peekValue( 1003851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion); 1004851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 1005851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 1006851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 1007851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 1008851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 10095c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn targetVers = minVers = val.data; 1010851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 1011851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 1012851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 1013851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn val = sa.peekValue( 1014851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion); 1015851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 1016851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 1017851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 1018851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 1019851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 1020851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetVers = val.data; 1021851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 1022851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 1023851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10265c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn if (minCode != null) { 10278d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (!minCode.equals(SDK_CODENAME)) { 10288d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_CODENAME != null) { 10295c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires development platform " + minCode 10308d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current platform is " + SDK_CODENAME + ")"; 10315c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } else { 10325c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires development platform " + minCode 10335c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn + " but this is a release platform."; 10345c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 10355c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 10365c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return null; 10375c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 10388d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu } else if (minVers > SDK_VERSION) { 10395c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires newer sdk version #" + minVers 10408d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current version is #" + SDK_VERSION + ")"; 10415c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 10425c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return null; 10435c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 10445c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 1045851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (targetCode != null) { 10468d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (!targetCode.equals(SDK_CODENAME)) { 10478d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_CODENAME != null) { 1048851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 10498d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current platform is " + SDK_CODENAME + ")"; 1050851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 1051851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 1052851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " but this is a release platform."; 1053851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 1054851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 1055851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn return null; 1056851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 1057851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If the code matches, it definitely targets this SDK. 1058a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion 1059a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; 1060a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } else { 1061a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion = targetVers; 1062851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1067723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } else if (tagName.equals("supports-screens")) { 1068723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn sa = res.obtainAttributes(attrs, 1069723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens); 1070723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 1071df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn pkg.applicationInfo.requiresSmallestWidthDp = sa.getInteger( 1072df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_requiresSmallestWidthDp, 1073df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn 0); 1074df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn pkg.applicationInfo.compatibleWidthLimitDp = sa.getInteger( 1075df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_compatibleWidthLimitDp, 1076df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn 0); 10772762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn pkg.applicationInfo.largestWidthLimitDp = sa.getInteger( 10782762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_largestWidthLimitDp, 10792762ff3dc864018352362f6d103de471f9529ba6Dianne Hackborn 0); 1080df6e980e3f63eb0f6f9eb437fa925d5009cd9c44Dianne Hackborn 1081723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // This is a trick to get a boolean and still able to detect 1082723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // if a value was actually set. 1083723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsSmallScreens = sa.getInteger( 1084723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_smallScreens, 1085723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsSmallScreens); 1086723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsNormalScreens = sa.getInteger( 1087723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_normalScreens, 1088723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsNormalScreens); 1089723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsLargeScreens = sa.getInteger( 1090723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_largeScreens, 1091723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsLargeScreens); 109214cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn supportsXLargeScreens = sa.getInteger( 109314cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_xlargeScreens, 109414cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn supportsXLargeScreens); 1095c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn resizeable = sa.getInteger( 1096c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_resizeable, 109714cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn resizeable); 109811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn anyDensity = sa.getInteger( 109911b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_anyDensity, 110011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn anyDensity); 1101723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 1102723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn sa.recycle(); 1103723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 11049189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima XmlUtils.skipCurrentTag(parser); 1105854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1106854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("protected-broadcast")) { 1107854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn sa = res.obtainAttributes(attrs, 1108854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProtectedBroadcast); 1109854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1110cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1111cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 1112854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn String name = sa.getNonResourceString( 1113854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProtectedBroadcast_name); 1114854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1115854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn sa.recycle(); 1116854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1117854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (name != null && (flags&PARSE_IS_SYSTEM) != 0) { 1118854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (pkg.protectedBroadcasts == null) { 1119854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.protectedBroadcasts = new ArrayList<String>(); 1120854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1121854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (!pkg.protectedBroadcasts.contains(name)) { 1122854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.protectedBroadcasts.add(name.intern()); 1123854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1124854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1125854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1126854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1127854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1128854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("instrumentation")) { 1129854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) { 1130854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn return null; 1131854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1132854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1133b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } else if (tagName.equals("original-package")) { 1134b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa = res.obtainAttributes(attrs, 1135b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage); 1136b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1137cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String orig =sa.getNonConfigurationString( 1138cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0); 11396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (!pkg.packageName.equals(orig)) { 1140c1552397be706c243338389c628a44eee6011eaeDianne Hackborn if (pkg.mOriginalPackages == null) { 1141c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mOriginalPackages = new ArrayList<String>(); 1142c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mRealPackage = pkg.packageName; 1143c1552397be706c243338389c628a44eee6011eaeDianne Hackborn } 1144c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mOriginalPackages.add(orig); 11456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 1146b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1147b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa.recycle(); 1148b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1149b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1150b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1151b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } else if (tagName.equals("adopt-permissions")) { 1152b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa = res.obtainAttributes(attrs, 1153b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage); 1154b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1155cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 1156cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0); 1157b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1158b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa.recycle(); 1159b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 11606dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (name != null) { 1161b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn if (pkg.mAdoptPermissions == null) { 1162b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn pkg.mAdoptPermissions = new ArrayList<String>(); 1163b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } 1164b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn pkg.mAdoptPermissions.add(name); 1165b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } 1166b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1167b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1168b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1169a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } else if (tagName.equals("uses-gl-texture")) { 1170a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn // Just skip this tag 1171a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn XmlUtils.skipCurrentTag(parser); 1172a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn continue; 1173a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn 1174a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn } else if (tagName.equals("compatible-screens")) { 1175a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn // Just skip this tag 1176a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn XmlUtils.skipCurrentTag(parser); 1177a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn continue; 1178a0b46c9c441f017a2008ca8ee2c864987465996bDianne Hackborn 1179854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("eat-comment")) { 1180854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn // Just skip this tag 1181854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1182854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn continue; 1183854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1184854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (RIGID_PARSER) { 1185854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn outError[0] = "Bad element under <manifest>: " 1186854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn + parser.getName(); 1187854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 1188854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn return null; 1189854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1191d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unknown element under <manifest>: " + parser.getName() 1192bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + " at " + mArchiveSourcePath + " " 1193bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!foundApp && pkg.instrumentation.size() == 0) { 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not contain an <application> or <instrumentation>"; 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY; 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1204a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final int NP = PackageParser.NEW_PERMISSIONS.length; 1205a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn StringBuilder implicitPerms = null; 1206a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn for (int ip=0; ip<NP; ip++) { 1207a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final PackageParser.NewPermissionInfo npi 1208a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = PackageParser.NEW_PERMISSIONS[ip]; 1209a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) { 1210a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn break; 1211a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 1212a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (!pkg.requestedPermissions.contains(npi.name)) { 1213a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (implicitPerms == null) { 1214a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms = new StringBuilder(128); 1215a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(pkg.packageName); 1216a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(": compat added "); 1217a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } else { 1218a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(' '); 1219a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 1220a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(npi.name); 1221a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.requestedPermissions.add(npi.name); 1222a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 1223851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 1224a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (implicitPerms != null) { 1225d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.i(TAG, implicitPerms.toString()); 1226a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 1227851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 1228723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsSmallScreens < 0 || (supportsSmallScreens > 0 1229723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 123011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1231723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS; 1232723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1233723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsNormalScreens != 0) { 1234723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS; 1235723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1236723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsLargeScreens < 0 || (supportsLargeScreens > 0 1237723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 123811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1239723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS; 1240723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 124114cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn if (supportsXLargeScreens < 0 || (supportsXLargeScreens > 0 124214cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 124314cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn >= android.os.Build.VERSION_CODES.GINGERBREAD)) { 124414cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_XLARGE_SCREENS; 124514cee9f688c32d63d8521188e7422811629bb7c2Dianne Hackborn } 1246c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (resizeable < 0 || (resizeable > 0 1247c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 124811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1249c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS; 1250c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 125111b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn if (anyDensity < 0 || (anyDensity > 0 125211b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 125311b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 125411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES; 12551ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima } 12561ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildClassName(String pkg, CharSequence clsSeq, 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clsSeq == null || clsSeq.length() <= 0) { 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Empty class name in package " + pkg; 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cls = clsSeq.toString(); 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = cls.charAt(0); 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + cls).intern(); 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cls.indexOf('.') < 0) { 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder b = new StringBuilder(pkg); 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append('.'); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append(cls); 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b.toString().intern(); 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c >= 'a' && c <= 'z') { 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cls.intern(); 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad class name " + cls + " in package " + pkg; 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildCompoundName(String pkg, 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String type, String[] outError) { 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String proc = procSeq.toString(); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = proc.charAt(0); 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg != null && c == ':') { 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (proc.length() < 2) { 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad " + type + " name " + proc + " in package " + pkg 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": must be at least two characters"; 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String subName = proc.substring(1); 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(subName, false); 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null) { 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + proc).intern(); 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(proc, true); 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"system".equals(proc)) { 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return proc.intern(); 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildProcessName(String pkg, String defProc, 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, int flags, String[] separateProcesses, 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) { 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc != null ? defProc : pkg; 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (separateProcesses != null) { 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=separateProcesses.length-1; i>=0; i--) { 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String sp = separateProcesses[i]; 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) { 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null || procSeq.length() <= 0) { 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1329d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn return buildCompoundName(pkg, procSeq, "process", outError); 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildTaskAffinityName(String pkg, String defProc, 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String[] outError) { 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null) { 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq.length() <= 0) { 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buildCompoundName(pkg, procSeq, "taskAffinity", outError); 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PermissionGroup parsePermissionGroup(Package owner, Resources res, 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup perm = new PermissionGroup(owner); 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup); 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-group>", sa, 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_name, 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_label, 135581cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon, 135681cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermissionGroup_logo)) { 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_description, 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm, 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissionGroups.add(perm); 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermission(Package owner, Resources res, 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission); 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission>", sa, 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_name, 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_label, 139181cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermission_icon, 139281cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermission_logo)) { 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1398cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1399cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = sa.getNonResourceString( 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.group != null) { 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = perm.info.group.intern(); 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_description, 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = sa.getInt( 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel, 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.protectionLevel == -1) { 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission> does not specify protectionLevel"; 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission>", perm, 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissions.add(perm); 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermissionTree(Package owner, Resources res, 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree); 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-tree>", sa, 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_name, 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_label, 144581cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermissionTree_icon, 144681cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestPermissionTree_logo)) { 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = perm.info.name.indexOf('.'); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index > 0) { 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = perm.info.name.indexOf('.', index+1); 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission-tree> name has less than three segments: " 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + perm.info.name; 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = 0; 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL; 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.tree = true; 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm, 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissions.add(perm); 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Instrumentation parseInstrumentation(Package owner, Resources res, 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation); 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseInstrumentationArgs == null) { 14871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError, 14881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_name, 14891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_label, 149081cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestInstrumentation_icon, 149181cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestInstrumentation_logo); 14921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.tag = "<instrumentation>"; 14931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 14941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 14951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.sa = sa; 14961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 14971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Instrumentation a = new Instrumentation(mParseInstrumentationArgs, 14981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn new InstrumentationInfo()); 14991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1506cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1507cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage); 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.targetPackage = str != null ? str.intern() : null; 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.handleProfiling = sa.getBoolean( 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling, 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.functionalTest = sa.getBoolean( 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest, 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.info.targetPackage == null) { 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<instrumentation> does not specify targetPackage"; 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a, 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.instrumentation.add(a); 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseApplication(Package owner, Resources res, 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ApplicationInfo ai = owner.applicationInfo; 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String pkgName = owner.applicationInfo.packageName; 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication); 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1548cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 1549cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_name, 0); 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null) { 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.className = buildClassName(pkgName, name, outError); 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai.className == null) { 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1559cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String manageSpaceActivity = sa.getNonConfigurationString( 1560cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, 0); 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (manageSpaceActivity != null) { 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity, 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError); 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1566181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate boolean allowBackup = sa.getBoolean( 1567181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true); 1568181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate if (allowBackup) { 1569181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; 15705e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate 15713de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate // backupAgent, killAfterRestore, and restoreAnyVersion are only relevant 15723de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate // if backup is possible for the given application. 1573cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String backupAgent = sa.getNonConfigurationString( 1574cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0); 1575181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate if (backupAgent != null) { 1576181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate ai.backupAgentName = buildClassName(pkgName, backupAgent, outError); 1577d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (DEBUG_BACKUP) { 1578d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.v(TAG, "android:backupAgent = " + ai.backupAgentName 1579a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " from " + pkgName + "+" + backupAgent); 1580a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 15815e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate 15825e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate if (sa.getBoolean( 15835e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore, 15845e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate true)) { 15855e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE; 15865e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate } 15875e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate if (sa.getBoolean( 15883dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_restoreAnyVersion, 15893dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate false)) { 15903dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate ai.flags |= ApplicationInfo.FLAG_RESTORE_ANY_VERSION; 15913dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate } 1592181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate } 1593181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate } 15944a627c71ff53a4fca1f961f4b1dcc0461df18a06Christopher Tate 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_label); 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (ai.labelRes=v.resourceId) == 0) { 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.nonLocalizedLabel = v.coerceToString(); 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.icon = sa.getResourceId( 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_icon, 0); 160381cd2e90ccdda498234384c8207afe2213714e60Adam Powell ai.logo = sa.getResourceId( 160481cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestApplication_logo, 0); 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.theme = sa.getResourceId( 1606b35cd54b88292bd6cf0387406ad9071f5475c6a7Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_theme, 0); 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.descriptionRes = sa.getResourceId( 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_description, 0); 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_persistent, 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_PERSISTENT; 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1618af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu if ((flags & PARSE_FORWARD_LOCK) != 0) { 1619af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu ai.flags |= ApplicationInfo.FLAG_FORWARD_LOCK; 1620af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } 1621af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu 1622af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu if ((flags & PARSE_ON_SDCARD) != 0) { 16236069beb2dfed6da837bf7faa3db3f6119edc017aSuchi Amalapurapu ai.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE; 1624af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } 1625af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_debuggable, 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE; 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 1633ef3f5ddc2137ed99e41f00441b688fb56b855179Ben Cheng com.android.internal.R.styleable.AndroidManifestApplication_vmSafeMode, 163423085b781e145ed684e7270af1d5ced6800b8effBen Cheng false)) { 163523085b781e145ed684e7270af1d5ced6800b8effBen Cheng ai.flags |= ApplicationInfo.FLAG_VM_SAFE_MODE; 163623085b781e145ed684e7270af1d5ced6800b8effBen Cheng } 163723085b781e145ed684e7270af1d5ced6800b8effBen Cheng 1638529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy boolean hardwareAccelerated = sa.getBoolean( 1639812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy com.android.internal.R.styleable.AndroidManifestApplication_hardwareAccelerated, 16402d6833bab353e31ceb4230f3f3563fca2e0d9f6fDianne Hackborn owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.ICE_CREAM_SANDWICH); 1641812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy 1642812ccbeb3ce55c50463fda1d161b2eeed8b19cd2Romain Guy if (sa.getBoolean( 16439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_hasCode, 16449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_HAS_CODE; 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting, 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING; 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData, 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA; 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1660ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn if (sa.getBoolean( 1661ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_testOnly, 1662e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn false)) { 1663ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn ai.flags |= ApplicationInfo.FLAG_TEST_ONLY; 1664ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } 1665ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn 1666a3cdaa5337fa573c4c61770195d6232c2e587090Jason parks if (sa.getBoolean( 16673b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_largeHeap, 1668a3cdaa5337fa573c4c61770195d6232c2e587090Jason parks false)) { 16693b81bc18bb661c02ad8074c39dab16644c1e65d0Dianne Hackborn ai.flags |= ApplicationInfo.FLAG_LARGE_HEAP; 1670a3cdaa5337fa573c4c61770195d6232c2e587090Jason parks } 1671a3cdaa5337fa573c4c61770195d6232c2e587090Jason parks 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1673cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1674cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_permission, 0); 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.permission = (str != null && str.length() > 0) ? str.intern() : null; 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1677d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { 1678d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn str = sa.getNonConfigurationString( 1679d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, 0); 1680d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } else { 1681d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // Some older apps have been seen to use a resource reference 1682d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // here that on older builds was ignored (with a warning). We 1683d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // need to continue to do this for them so they don't break. 1684d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn str = sa.getNonResourceString( 1685d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity); 1686d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName, 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str, outError); 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] == null) { 1691d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn CharSequence pname; 1692d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { 1693d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = sa.getNonConfigurationString( 1694d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_process, 0); 1695d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } else { 1696d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // Some older apps have been seen to use a resource reference 1697d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // here that on older builds was ignored (with a warning). We 1698d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // need to continue to do this for them so they don't break. 1699d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = sa.getNonResourceString( 1700d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_process); 1701d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } 1702d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn ai.processName = buildProcessName(ai.packageName, null, pname, 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags, mSeparateProcesses, outError); 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1705cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn ai.enabled = sa.getBoolean( 1706cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_enabled, true); 1707860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 170802486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn if (false) { 170902486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn if (sa.getBoolean( 171002486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_cantSaveState, 171102486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn false)) { 171254e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn ai.flags |= ApplicationInfo.FLAG_CANT_SAVE_STATE; 171302486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn 171402486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn // A heavy-weight application can not be in a custom process. 171502486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn // We can do direct compare because we intern all strings. 171602486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn if (ai.processName != null && ai.processName != ai.packageName) { 171702486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn outError[0] = "cantSaveState applications can not use custom processes"; 171802486b1327e3007c62d253dd89ba9db1852b87f8Dianne Hackborn } 1719860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 1720860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1723269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell ai.uiOptions = sa.getInt( 1724269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell com.android.internal.R.styleable.AndroidManifestApplication_uiOptions, 0); 1725269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int innerDepth = parser.getDepth(); 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 1736d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 1737d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > innerDepth)) { 1738d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("activity")) { 1744529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false, 1745529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy hardwareAccelerated); 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("receiver")) { 1754529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true, false); 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.receivers.add(a); 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("service")) { 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Service s = parseService(owner, res, parser, attrs, flags, outError); 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.services.add(s); 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("provider")) { 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider p = parseProvider(owner, res, parser, attrs, flags, outError); 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) { 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.providers.add(p); 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("activity-alias")) { 17811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError); 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note: application meta-data is stored off to the side, so it can 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remain null in the primary copy (we like to avoid extra copies because 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it can be large) 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData, 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-library")) { 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary); 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1803cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1804cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String lname = sa.getNonResourceString( 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary_name); 180749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn boolean req = sa.getBoolean( 180849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesLibrary_required, 180949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn true); 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 181349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (lname != null) { 181449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (req) { 181549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (owner.usesLibraries == null) { 181649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesLibraries = new ArrayList<String>(); 181749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 181849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (!owner.usesLibraries.contains(lname)) { 181949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesLibraries.add(lname.intern()); 182049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 182149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } else { 182249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (owner.usesOptionalLibraries == null) { 182349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesOptionalLibraries = new ArrayList<String>(); 182449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 182549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (!owner.usesOptionalLibraries.contains(lname)) { 182649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesOptionalLibraries.add(lname.intern()); 182749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 182849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1833cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn } else if (tagName.equals("uses-package")) { 1834cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn // Dependencies for app installers; we don't currently try to 1835cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn // enforce this. 1836cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1837cef65eeb0315c3118bf8860d6f723cb49ff6bc52Dianne Hackborn 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 1840d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unknown element under <application>: " + tagName 1841a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 1842a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <application>: " + tagName; 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo, 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError, String tag, TypedArray sa, 185881cd2e90ccdda498234384c8207afe2213714e60Adam Powell int nameRes, int labelRes, int iconRes, int logoRes) { 1859cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString(nameRes, 0); 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = tag + " does not specify android:name"; 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.name 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = buildClassName(owner.applicationInfo.packageName, name, outError); 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.name == null) { 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iconVal = sa.getResourceId(iconRes, 0); 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iconVal != 0) { 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = iconVal; 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = null; 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 187681cd2e90ccdda498234384c8207afe2213714e60Adam Powell 187781cd2e90ccdda498234384c8207afe2213714e60Adam Powell int logoVal = sa.getResourceId(logoRes, 0); 187881cd2e90ccdda498234384c8207afe2213714e60Adam Powell if (logoVal != 0) { 187981cd2e90ccdda498234384c8207afe2213714e60Adam Powell outInfo.logo = logoVal; 188081cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue(labelRes); 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.packageName = owner.packageName; 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivity(Package owner, Resources res, 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError, 1894529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy boolean receiver, boolean hardwareAccelerated) 1895529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy throws XmlPullParserException, IOException { 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity); 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityArgs == null) { 19001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = new ParseComponentArgs(owner, outError, 19011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_name, 19021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_label, 19031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_icon, 190481cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestActivity_logo, 19051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 19061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_process, 19078aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_description, 19081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_enabled); 19091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 19101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 19111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>"; 19121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.sa = sa; 19131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.flags = flags; 19141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 19151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityArgs, new ActivityInfo()); 19161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported); 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported, false); 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.theme = sa.getResourceId( 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_theme, 0); 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1931269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell a.info.uiOptions = sa.getInt( 1932269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell com.android.internal.R.styleable.AndroidManifestActivity_uiOptions, 1933269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell a.info.applicationInfo.uiOptions); 1934269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1936cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1937cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_permission, 0); 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = owner.applicationInfo.permission; 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1944cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1945cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, 0); 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName, 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.applicationInfo.taskAffinity, str, outError); 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags = 0; 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_multiprocess, 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS; 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch, 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH; 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch, 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH; 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_noHistory, 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_NO_HISTORY; 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState, 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE; 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded, 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED; 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents, 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS; 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting, 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) { 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING; 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1998ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn if (sa.getBoolean( 1999ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_finishOnCloseSystemDialogs, 2000ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn false)) { 2001ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn a.info.flags |= ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS; 2002ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 2003ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn 2004613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler if (sa.getBoolean( 2005613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler com.android.internal.R.styleable.AndroidManifestActivity_immersive, 2006613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler false)) { 2007613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler a.info.flags |= ActivityInfo.FLAG_IMMERSIVE; 2008613dde4aa651e11dac3db859723cc6faf8fc0a82Daniel Sandler } 2009529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!receiver) { 2011529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy if (sa.getBoolean( 2012529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy com.android.internal.R.styleable.AndroidManifestActivity_hardwareAccelerated, 2013529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy hardwareAccelerated)) { 2014529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy a.info.flags |= ActivityInfo.FLAG_HARDWARE_ACCELERATED; 2015529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy } 2016529b60a3b16ac3dff24f2403d760ab8ebc9670ffRomain Guy 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = sa.getInt( 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_launchMode, 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.LAUNCH_MULTIPLE); 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.screenOrientation = sa.getInt( 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation, 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = sa.getInt( 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_configChanges, 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.softInputMode = sa.getInt( 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode, 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE; 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = 0; 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 203654e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if (receiver && (owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 2037860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // A heavy-weight application can not have receives in its main process 2038860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // We can do direct compare because we intern all strings. 2039860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (a.info.processName == owner.packageName) { 2040860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn outError[0] = "Heavy-weight applications can not have receivers in main process"; 2041860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2042860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2043860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) { 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 2063d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "No actions in intent filter at " 2064bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + mArchiveSourcePath + " " 2065bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2076d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 2078d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unknown element under <receiver>: " + parser.getName() 2079a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 2080a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2082d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unknown element under <activity>: " + parser.getName() 2083a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 2084a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2089d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (receiver) { 2090d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root outError[0] = "Bad element under <receiver>: " + parser.getName(); 2091d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root } else { 2092d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root outError[0] = "Bad element under <activity>: " + parser.getName(); 2093d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root } 2094d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root return null; 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivityAlias(Package owner, Resources res, 21071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 21081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn throws XmlPullParserException, IOException { 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias); 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2112cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String targetActivity = sa.getNonConfigurationString( 2113cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, 0); 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> does not specify android:targetActivity"; 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity = buildClassName(owner.applicationInfo.packageName, 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity, outError); 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityAliasArgs == null) { 21281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs = new ParseComponentArgs(owner, outError, 21291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_name, 21301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_label, 21311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_icon, 213281cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestActivityAlias_logo, 21331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 21341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 0, 21358aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_description, 21361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled); 21371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.tag = "<activity-alias>"; 21381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 21391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 21401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.sa = sa; 21411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.flags = flags; 21421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity target = null; 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = owner.activities.size(); 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NA; i++) { 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity t = owner.activities.get(i); 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity.equals(t.info.name)) { 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target = t; 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == null) { 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> target activity " + targetActivity 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " not found in manifest"; 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ActivityInfo info = new ActivityInfo(); 21621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.targetActivity = targetActivity; 21631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.configChanges = target.info.configChanges; 21641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.flags = target.info.flags; 21651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.icon = target.info.icon; 216681cd2e90ccdda498234384c8207afe2213714e60Adam Powell info.logo = target.info.logo; 21671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.labelRes = target.info.labelRes; 21681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.nonLocalizedLabel = target.info.nonLocalizedLabel; 21691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.launchMode = target.info.launchMode; 21701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.processName = target.info.processName; 21718aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (info.descriptionRes == 0) { 21728aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn info.descriptionRes = target.info.descriptionRes; 21738aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 21741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.screenOrientation = target.info.screenOrientation; 21751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.taskAffinity = target.info.taskAffinity; 21761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.theme = target.info.theme; 21770836c7cb98dd3ff1ef0379dcb97be8b315fed7ebDianne Hackborn info.softInputMode = target.info.softInputMode; 2178269248d112e35fe8e9f0d5d11c96dcb2ac1118b0Adam Powell info.uiOptions = target.info.uiOptions; 21791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 21801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityAliasArgs, info); 21811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported); 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false); 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 2194cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2195cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_permission, 0); 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) { 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 2221d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "No actions in intent filter at " 2222bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + mArchiveSourcePath + " " 2223bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2234d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unknown element under <activity-alias>: " + parser.getName() 2235a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 2236a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2239d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root } else { 2240d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root outError[0] = "Bad element under <activity-alias>: " + parser.getName(); 2241d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root return null; 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Provider parseProvider(Package owner, Resources res, 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider); 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseProviderArgs == null) { 22601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = new ParseComponentArgs(owner, outError, 22611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_name, 22621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_label, 22631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_icon, 226481cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestProvider_logo, 22651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 22661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_process, 22678aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_description, 22681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_enabled); 22691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.tag = "<provider>"; 22701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 22711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 22721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.sa = sa; 22731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.flags = flags; 22741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 22751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Provider p = new Provider(mParseProviderArgs, new ProviderInfo()); 22761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.exported = sa.getBoolean( 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_exported, true); 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2284cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String cpname = sa.getNonConfigurationString( 2285cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_authorities, 0); 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.isSyncable = sa.getBoolean( 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_syncable, 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2291cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String permission = sa.getNonConfigurationString( 2292cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_permission, 0); 2293cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2294cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_readPermission, 0); 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = owner.applicationInfo.permission; 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = 23029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2304cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2305cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_writePermission, 0); 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = owner.applicationInfo.permission; 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.grantUriPermissions = sa.getBoolean( 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions, 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.multiprocess = sa.getBoolean( 23219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_multiprocess, 23229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 23239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.initOrder = sa.getInt( 23259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_initOrder, 23269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 23279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 23299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 233054e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 2331860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // A heavy-weight application can not have providers in its main process 2332860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // We can do direct compare because we intern all strings. 2333860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (p.info.processName == owner.packageName) { 2334860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn outError[0] = "Heavy-weight applications can not have providers in main process"; 2335860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn return null; 2336860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2337860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2338860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpname == null) { 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<provider> does not incude authorities attribute"; 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.authority = cpname.intern(); 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseProviderTags(res, parser, attrs, p, outError)) { 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseProviderTags(Resources res, 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider outInfo, String[] outError) 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("grant-uri-permission")) { 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission); 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher pa = null; 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2377cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2378cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path, 0); 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL); 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2383cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2384cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix, 0); 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX); 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2390cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern, 0); 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pa != null) { 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.info.uriPermissionPatterns == null) { 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = new PatternMatcher[1]; 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns[0] = pa; 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = outInfo.info.uriPermissionPatterns.length; 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher[] newp = new PatternMatcher[N+1]; 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N); 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newp[N] = pa; 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = newp; 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.grantUriPermissions = true; 24092af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 24102af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2411d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unknown element under <path-permission>: " 2412a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2413a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 24142af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 24152af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 2416d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root } else { 2417d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>"; 2418d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root return false; 24192af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24202af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24212af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 24222af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 24232af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else if (parser.getName().equals("path-permission")) { 24242af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn TypedArray sa = res.obtainAttributes(attrs, 24252af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission); 24262af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 24272af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PathPermission pa = null; 24282af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2429cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String permission = sa.getNonConfigurationString( 2430cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_permission, 0); 2431cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String readPermission = sa.getNonConfigurationString( 2432cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_readPermission, 0); 24332af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (readPermission == null) { 24342af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn readPermission = permission; 24352af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 2436cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String writePermission = sa.getNonConfigurationString( 2437cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_writePermission, 0); 24382af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (writePermission == null) { 24392af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn writePermission = permission; 24402af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24412af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 24422af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn boolean havePerm = false; 24432af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (readPermission != null) { 24442af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn readPermission = readPermission.intern(); 24452af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn havePerm = true; 24462af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24472af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (writePermission != null) { 2448e04b1ad9cd3d9a159d4c7721a374f987be1062cdBjorn Bringert writePermission = writePermission.intern(); 24492af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn havePerm = true; 24502af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24512af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 24522af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!havePerm) { 24532af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2454d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "No readPermission or writePermssion for <path-permission>: " 2455a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2456a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 24572af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 24582af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 2459d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root } else { 2460d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root outError[0] = "No readPermission or writePermssion for <path-permission>"; 2461d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root return false; 24622af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24632af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24642af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2465cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String path = sa.getNonConfigurationString( 2466cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_path, 0); 24672af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 24682af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 24692af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_LITERAL, readPermission, writePermission); 24702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24712af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2472cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn path = sa.getNonConfigurationString( 2473cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_pathPrefix, 0); 24742af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 24752af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 24762af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_PREFIX, readPermission, writePermission); 24772af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24782af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2479cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn path = sa.getNonConfigurationString( 2480cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_pathPattern, 0); 24812af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 24822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 24832af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_SIMPLE_GLOB, readPermission, writePermission); 24842af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24852af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 24862af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn sa.recycle(); 24872af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 24882af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (pa != null) { 24892af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (outInfo.info.pathPermissions == null) { 24902af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions = new PathPermission[1]; 24912af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions[0] = pa; 24922af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 24932af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn final int N = outInfo.info.pathPermissions.length; 24942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PathPermission[] newp = new PathPermission[N+1]; 24952af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn System.arraycopy(outInfo.info.pathPermissions, 0, newp, 0, N); 24962af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn newp[N] = pa; 24972af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions = newp; 24982af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 24992af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 25002af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2501d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: " 2502a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2503a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 25042af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 25052af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 25062af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 25072af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>"; 25082af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn return false; 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2514d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unknown element under <provider>: " 2515a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2516a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2519d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root } else { 2520d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root outError[0] = "Bad element under <provider>: " + parser.getName(); 2521d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root return false; 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Service parseService(Package owner, Resources res, 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService); 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseServiceArgs == null) { 25351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = new ParseComponentArgs(owner, outError, 25361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_name, 25371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_label, 25381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_icon, 253981cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestService_logo, 25401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 25411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_process, 25428aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestService_description, 25431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_enabled); 25441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.tag = "<service>"; 25451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 25461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 25471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.sa = sa; 25481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.flags = flags; 25491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 25501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Service s = new Service(mParseServiceArgs, new ServiceInfo()); 25511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported); 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = sa.getBoolean( 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported, false); 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2563cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2564cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_permission, 0); 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = owner.applicationInfo.permission; 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = str.length() > 0 ? str.toString().intern() : null; 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25710c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn s.info.flags = 0; 25720c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn if (sa.getBoolean( 25730c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn com.android.internal.R.styleable.AndroidManifestService_stopWithTask, 25740c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn false)) { 25750c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn s.info.flags |= ServiceInfo.FLAG_STOP_WITH_TASK; 25760c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn } 25770c5001d776d56bae02a5cc2663286a125d99bc5eDianne Hackborn 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 258054e570f78b45d6c47578a4a2513097b590b6d43fDianne Hackborn if ((owner.applicationInfo.flags&ApplicationInfo.FLAG_CANT_SAVE_STATE) != 0) { 2581860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // A heavy-weight application can not have services in its main process 2582860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn // We can do direct compare because we intern all strings. 2583860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn if (s.info.processName == owner.packageName) { 2584860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn outError[0] = "Heavy-weight applications can not have services in main process"; 2585860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn return null; 2586860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2587860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn } 2588860755faa6bdd3c2aeae49c05b87b5bc080ae60cDianne Hackborn 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceIntentInfo intent = new ServiceIntentInfo(s); 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) { 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.intents.add(intent); 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData, 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2612d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unknown element under <service>: " 2613a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2614a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2617d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root } else { 2618d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root outError[0] = "Bad element under <service>: " + parser.getName(); 2619d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root return null; 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = s.intents.size() > 0; 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s; 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseAllMetaData(Resources res, 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String tag, 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Component outInfo, String[] outError) 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2651d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unknown element under " + tag + ": " 2652a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2653a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 26549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 26559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 2656d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root } else { 2657d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root outError[0] = "Bad element under " + tag + ": " + parser.getName(); 2658d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root return false; 26599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle parseMetaData(Resources res, 26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle data, String[] outError) 26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData); 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == null) { 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = new Bundle(); 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2677cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 2678cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestMetaData_name, 0); 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:name attribute"; 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2685854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn name = name.intern(); 2686854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 26879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 26889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_resource); 26899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && v.resourceId != 0) { 2690d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root //Slog.i(TAG, "Meta data ref " + name + ": " + v); 26919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.resourceId); 26929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = sa.peekValue( 26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_value); 2695d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root //Slog.i(TAG, "Meta data " + name + ": " + v); 26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null) { 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v.type == TypedValue.TYPE_STRING) { 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence cs = v.coerceToString(); 2699854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn data.putString(name, cs != null ? cs.toString().intern() : null); 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) { 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putBoolean(name, v.data != 0); 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type >= TypedValue.TYPE_FIRST_INT 27039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && v.type <= TypedValue.TYPE_LAST_INT) { 27049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.data); 27059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_FLOAT) { 27069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putFloat(name, v.getFloat()); 27079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 27089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2709d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: " 2710a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2711a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types"; 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 27189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:value or android:resource attribute"; 27199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 27209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 27249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 27269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 27289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 273005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root private static VerifierInfo parseVerifier(Resources res, XmlPullParser parser, 273105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root AttributeSet attrs, int flags, String[] outError) throws XmlPullParserException, 273205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root IOException { 273305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final TypedArray sa = res.obtainAttributes(attrs, 273405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root com.android.internal.R.styleable.AndroidManifestPackageVerifier); 273505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 273605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final String packageName = sa.getNonResourceString( 273705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root com.android.internal.R.styleable.AndroidManifestPackageVerifier_name); 273805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 273905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final String encodedPublicKey = sa.getNonResourceString( 274005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root com.android.internal.R.styleable.AndroidManifestPackageVerifier_publicKey); 274105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 274205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root sa.recycle(); 274305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 274405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root if (packageName == null || packageName.length() == 0) { 274505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root Slog.i(TAG, "verifier package name was null; skipping"); 274605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root return null; 274705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } else if (encodedPublicKey == null) { 274805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root Slog.i(TAG, "verifier " + packageName + " public key was null; skipping"); 274905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } 275005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 275105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root EncodedKeySpec keySpec; 275205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root try { 275305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final byte[] encoded = Base64.decode(encodedPublicKey, Base64.DEFAULT); 275405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root keySpec = new X509EncodedKeySpec(encoded); 275505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } catch (IllegalArgumentException e) { 275605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root Slog.i(TAG, "Could not parse verifier " + packageName + " public key; invalid Base64"); 275705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root return null; 275805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } 275905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 276005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root /* First try the key as an RSA key. */ 276105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root try { 276205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 276305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final PublicKey publicKey = keyFactory.generatePublic(keySpec); 276405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root return new VerifierInfo(packageName, publicKey); 276505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } catch (NoSuchAlgorithmException e) { 276605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root Log.wtf(TAG, "Could not parse public key because RSA isn't included in build"); 276705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root return null; 276805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } catch (InvalidKeySpecException e) { 276905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root // Not a RSA public key. 277005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } 277105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 277205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root /* Now try it as a DSA key. */ 277305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root try { 277405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final KeyFactory keyFactory = KeyFactory.getInstance("DSA"); 277505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root final PublicKey publicKey = keyFactory.generatePublic(keySpec); 277605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root return new VerifierInfo(packageName, publicKey); 277705ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } catch (NoSuchAlgorithmException e) { 277805ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root Log.wtf(TAG, "Could not parse public key because DSA isn't included in build"); 277905ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root return null; 278005ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } catch (InvalidKeySpecException e) { 278105ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root // Not a DSA public key. 278205ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } 278305ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 278405ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root return null; 278505ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root } 278605ca4c90644921df9193d92b2abdc81ef77e4a62Kenny Root 27879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String ANDROID_RESOURCES 27889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = "http://schemas.android.com/apk/res/android"; 27899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseIntent(Resources res, 27919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, 27929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentInfo outInfo, String[] outError, boolean isActivity) 27939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 27949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 27969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter); 27979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int priority = sa.getInt( 27999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0); 28009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.setPriority(priority); 2801502e9a47c64d819a7aa45251bcf7cb5dd77a310bKenny Root 28029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 28039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_label); 28049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 28059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 28069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = sa.getResourceId( 28099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0); 281081cd2e90ccdda498234384c8207afe2213714e60Adam Powell 281181cd2e90ccdda498234384c8207afe2213714e60Adam Powell outInfo.logo = sa.getResourceId( 281281cd2e90ccdda498234384c8207afe2213714e60Adam Powell com.android.internal.R.styleable.AndroidManifestIntentFilter_logo, 0); 28139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 28159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 2818d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root while ((type = parser.next()) != XmlPullParser.END_DOCUMENT 2819d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root && (type != XmlPullParser.END_TAG || parser.getDepth() > outerDepth)) { 2820d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 28219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 28229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nodeName = parser.getName(); 28259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nodeName.equals("action")) { 28269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 28279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 28289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 28299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 28309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 28319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 28339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addAction(value); 28359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("category")) { 28369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 28379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 28389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 28399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 28409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 28419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 28439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addCategory(value); 28459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("data")) { 28479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 28489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData); 28499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2850cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2851cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_mimeType, 0); 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataType(str); 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IntentFilter.MalformedMimeTypeException e) { 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = e.toString(); 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2862cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2863cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_scheme, 0); 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataScheme(str); 28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2868cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String host = sa.getNonConfigurationString( 2869cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_host, 0); 2870cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String port = sa.getNonConfigurationString( 2871cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_port, 0); 28729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (host != null) { 28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataAuthority(host, port); 28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2876cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2877cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_path, 0); 28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL); 28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2882cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2883cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_pathPrefix, 0); 28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX); 28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2888cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2889cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_pathPattern, 0); 28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 28959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 28969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!RIGID_PARSER) { 2897d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.w(TAG, "Unknown element under <intent-filter>: " 2898a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2899a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <intent-filter>: " + parser.getName(); 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT); 2908d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root 2909d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (DEBUG_PARSER) { 2910d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root final StringBuilder cats = new StringBuilder("Intent d="); 2911d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root cats.append(outInfo.hasDefault); 2912d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root cats.append(", cat="); 2913d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root 2914d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root final Iterator<String> it = outInfo.categoriesIterator(); 2915d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root if (it != null) { 2916d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root while (it.hasNext()) { 2917d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root cats.append(' '); 2918d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root cats.append(it.next()); 2919d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root } 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2921d2d2925ff7ae9456c1c6c9147b1b9fd9a99ea607Kenny Root Slog.d(TAG, cats.toString()); 29229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 29259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Package { 29286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String packageName; 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For now we only support one application per package. 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ApplicationInfo applicationInfo = new ApplicationInfo(); 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Permission> permissions = new ArrayList<Permission>(0); 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0); 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> activities = new ArrayList<Activity>(0); 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> receivers = new ArrayList<Activity>(0); 29379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Provider> providers = new ArrayList<Provider>(0); 29389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Service> services = new ArrayList<Service>(0); 29399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0); 29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> requestedPermissions = new ArrayList<String>(); 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2943854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn public ArrayList<String> protectedBroadcasts; 2944854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 294549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<String> usesLibraries = null; 294649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<String> usesOptionalLibraries = null; 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] usesLibraryFiles = null; 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949c1552397be706c243338389c628a44eee6011eaeDianne Hackborn public ArrayList<String> mOriginalPackages = null; 29506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String mRealPackage = null; 2951b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn public ArrayList<String> mAdoptPermissions = null; 2952b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We store the application meta-data independently to avoid multiple unwanted references 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle mAppMetaData = null; 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is a 3rd party app, this is the path of the zip file. 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mPath; 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version code declared for this package. 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mVersionCode; 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version name declared for this package. 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mVersionName; 29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user id that this package wants to use. 29669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mSharedUserId; 29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user label that this package wants to use. 29699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mSharedUserLabel; 29709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Signatures that were read from the package. 29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Signature mSignatures[]; 29739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For use by package manager service for quick lookup of 29759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preferred up order. 29769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mPreferredOrder = 0; 29779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29785c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // For use by the package manager to keep track of the path to the 29795c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // file an app came from. 29805c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public String mScanPath; 29815c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 29825c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // For use by package manager to keep track of where it has done dexopt. 29835c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public boolean mDidDexOpt; 29845c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 298546730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn // User set enabled state. 298646730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn public int mSetEnabled = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; 298746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn 2988e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn // Whether the package has been stopped. 2989e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn public boolean mSetStopped = false; 2990e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Additional data supplied by callers. 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object mExtras; 2993deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root 2994deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root // Whether an operation is currently pending on this package 2995deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root public boolean mOperationPending; 2996deb112674e9940a46c87fa4e3bae5d8d1ee84ef3Kenny Root 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications hardware preferences 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 30009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<ConfigurationInfo> configPreferences = 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ArrayList<ConfigurationInfo>(); 30029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 300349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn /* 300449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn * Applications requested features 300549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn */ 300649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<FeatureInfo> reqFeatures = null; 300749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn 3008117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu public int installLocation; 3009117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 3010bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root /** 3011bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root * Digest suitable for comparing whether this package's manifest is the 3012bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root * same as another. 3013bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root */ 3014bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root public ManifestDigest manifestDigest; 3015bcc954d772e8cd5ef640060cbc0be50e7e4778f2Kenny Root 30169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Package(String _name) { 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = _name; 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.packageName = _name; 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.uid = -1; 30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String newName) { 30236dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn packageName = newName; 30246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn applicationInfo.packageName = newName; 30256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=permissions.size()-1; i>=0; i--) { 30266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn permissions.get(i).setPackageName(newName); 30276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=permissionGroups.size()-1; i>=0; i--) { 30296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn permissionGroups.get(i).setPackageName(newName); 30306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=activities.size()-1; i>=0; i--) { 30326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn activities.get(i).setPackageName(newName); 30336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=receivers.size()-1; i>=0; i--) { 30356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn receivers.get(i).setPackageName(newName); 30366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=providers.size()-1; i>=0; i--) { 30386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn providers.get(i).setPackageName(newName); 30396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=services.size()-1; i>=0; i--) { 30416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn services.get(i).setPackageName(newName); 30426dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=instrumentation.size()-1; i>=0; i--) { 30446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn instrumentation.get(i).setPackageName(newName); 30456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30476dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 30499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Package{" 30509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 30519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + packageName + "}"; 30529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Component<II extends IntentInfo> { 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Package owner; 30571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ArrayList<II> intents; 30586dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public final String className; 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle metaData; 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn ComponentName componentName; 30626dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn String componentShortName; 30636dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Package _owner) { 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = _owner; 30661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = null; 30676dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 30681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 30691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 30701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) { 30711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = args.owner; 30721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = new ArrayList<II>(0); 3073cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = args.sa.getNonConfigurationString(args.nameRes, 0); 30741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (name == null) { 30756dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 30761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not specify android:name"; 30771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 30781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 30791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 30801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.name 30811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn = buildClassName(owner.applicationInfo.packageName, name, args.outError); 30821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outInfo.name == null) { 30836dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 30841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not have valid android:name"; 30851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 30861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 30871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 30886dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = outInfo.name; 30891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 30901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int iconVal = args.sa.getResourceId(args.iconRes, 0); 30911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (iconVal != 0) { 30921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.icon = iconVal; 30931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = null; 30941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 309581cd2e90ccdda498234384c8207afe2213714e60Adam Powell 309681cd2e90ccdda498234384c8207afe2213714e60Adam Powell int logoVal = args.sa.getResourceId(args.logoRes, 0); 309781cd2e90ccdda498234384c8207afe2213714e60Adam Powell if (logoVal != 0) { 309881cd2e90ccdda498234384c8207afe2213714e60Adam Powell outInfo.logo = logoVal; 309981cd2e90ccdda498234384c8207afe2213714e60Adam Powell } 31001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 31011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedValue v = args.sa.peekValue(args.labelRes); 31021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 31031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = v.coerceToString(); 31041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 31051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 31061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.packageName = owner.packageName; 31071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 31081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 31091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParseComponentArgs args, final ComponentInfo outInfo) { 31101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn this(args, (PackageItemInfo)outInfo); 31111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.outError[0] != null) { 31121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 31131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 31141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 31151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.processRes != 0) { 3116d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn CharSequence pname; 3117d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn if (owner.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.FROYO) { 3118d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = args.sa.getNonConfigurationString(args.processRes, 0); 3119d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } else { 3120d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // Some older apps have been seen to use a resource reference 3121d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // here that on older builds was ignored (with a warning). We 3122d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn // need to continue to do this for them so they don't break. 3123d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn pname = args.sa.getNonResourceString(args.processRes); 3124d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn } 31251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.processName = buildProcessName(owner.applicationInfo.packageName, 3126d1cff1b4a477bad7f6c968572ecdff26ca6e8cdaDianne Hackborn owner.applicationInfo.processName, pname, 31271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.flags, args.sepProcesses, args.outError); 31281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 31298aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 31308aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (args.descriptionRes != 0) { 31318aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn outInfo.descriptionRes = args.sa.getResourceId(args.descriptionRes, 0); 31328aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 31338aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 31341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.enabled = args.sa.getBoolean(args.enabledRes, true); 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Component<II> clone) { 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = clone.owner; 31391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = clone.intents; 31406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = clone.className; 31416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = clone.componentName; 31421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = clone.componentShortName; 31436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 31456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public ComponentName getComponentName() { 31466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (componentName != null) { 31476dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentName; 31486dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31496dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (className != null) { 31506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = new ComponentName(owner.applicationInfo.packageName, 31516dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className); 31526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentName; 31546dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31556dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 31566dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String getComponentShortName() { 31576dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (componentShortName != null) { 31586dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentShortName; 31596dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31606dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn ComponentName component = getComponentName(); 31616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (component != null) { 31626dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentShortName = component.flattenToShortString(); 31636dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31646dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentShortName; 31656dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31666dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 31676dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 31686dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = null; 31696dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentShortName = null; 31709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Permission extends Component<IntentInfo> { 31749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionInfo info; 31759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean tree; 31769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup group; 31779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner) { 31799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 31809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionInfo(); 31819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner, PermissionInfo _info) { 31849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 31859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 31869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31876dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 31886dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 31896dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 31906dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 31916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 31929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 31949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Permission{" 31959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 31969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 31979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class PermissionGroup extends Component<IntentInfo> { 32019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionGroupInfo info; 32029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner) { 32049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 32059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionGroupInfo(); 32069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner, PermissionGroupInfo _info) { 32099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 32109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 32119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 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 "PermissionGroup{" 32209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 32219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 32229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static boolean copyNeeded(int flags, Package p, Bundle metaData) { 322646730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn if (p.mSetEnabled != PackageManager.COMPONENT_ENABLED_STATE_DEFAULT) { 322746730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn boolean enabled = p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED; 322846730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn if (p.applicationInfo.enabled != enabled) { 322946730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn return true; 323046730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn } 323146730fc78388607fd562044cbaaa26ffc9f65337Dianne Hackborn } 32329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0 32339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (metaData != null || p.mAppMetaData != null)) { 32349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 32359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0 32379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && p.usesLibraryFiles != null) { 32389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 32399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 32419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ApplicationInfo generateApplicationInfo(Package p, int flags) { 32449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 32459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p, null)) { 324669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima // CompatibilityMode is global state. It's safe to modify the instance 324769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima // of the package. 324869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima if (!sCompatibilityModeEnabled) { 324969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima p.applicationInfo.disableCompatibilityMode(); 325069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 3251e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn if (p.mSetStopped) { 3252e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn p.applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED; 3253e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } else { 3254e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn p.applicationInfo.flags &= ~ApplicationInfo.FLAG_STOPPED; 3255e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } 32569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.applicationInfo; 32579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copy so we can store the metadata/libraries safely 32609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = new ApplicationInfo(p.applicationInfo); 32619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0) { 32629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = p.mAppMetaData; 32639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) { 32659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.sharedLibraryFiles = p.usesLibraryFiles; 32669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 326769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima if (!sCompatibilityModeEnabled) { 326869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima ai.disableCompatibilityMode(); 326969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 3270e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn if (p.mSetStopped) { 3271e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn p.applicationInfo.flags |= ApplicationInfo.FLAG_STOPPED; 3272e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } else { 3273e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn p.applicationInfo.flags &= ~ApplicationInfo.FLAG_STOPPED; 3274e7f972122db87dc54e41ed1a6e417534d43bca3aDianne Hackborn } 32754b7b7ccd6651f54239c8849d4d85a633c2bbdf6aJohn Reck if (p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_ENABLED) { 32764b7b7ccd6651f54239c8849d4d85a633c2bbdf6aJohn Reck ai.enabled = true; 32770ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn } else if (p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED 32780ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn || p.mSetEnabled == PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER) { 32794b7b7ccd6651f54239c8849d4d85a633c2bbdf6aJohn Reck ai.enabled = false; 32804b7b7ccd6651f54239c8849d4d85a633c2bbdf6aJohn Reck } 32810ac3031c159a0904e73eb4439cdc724d8df4a6e6Dianne Hackborn ai.enabledSetting = p.mSetEnabled; 32829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 32839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionInfo generatePermissionInfo( 32869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission p, int flags) { 32879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 32889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 32899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 32909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = new PermissionInfo(p.info); 32929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 32939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 32949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 32959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 32969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionGroupInfo generatePermissionGroupInfo( 32979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup pg, int flags) { 32989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pg == null) return null; 32999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 33009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pg.info; 33019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info); 33039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.metaData = pg.metaData; 33049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pgi; 33059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Activity extends Component<ActivityIntentInfo> { 33081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ActivityInfo info; 33099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Activity(final ParseComponentArgs args, final ActivityInfo _info) { 33111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 33121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 33131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 33149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 33166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 33176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 33186dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 33196dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 33206dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 33219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 33229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Activity{" 33239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 33246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 33259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ActivityInfo generateActivityInfo(Activity a, 33299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 33309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) return null; 33319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, a.owner, a.metaData)) { 33329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a.info; 33339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 33359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo ai = new ActivityInfo(a.info); 33369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = a.metaData; 33379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.applicationInfo = generateApplicationInfo(a.owner, flags); 33389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 33399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Service extends Component<ServiceIntentInfo> { 33421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ServiceInfo info; 33439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Service(final ParseComponentArgs args, final ServiceInfo _info) { 33451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 33461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 33471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 33489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 33506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 33516dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 33526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 33536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 33546dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 33559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 33569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Service{" 33579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 33586dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 33599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ServiceInfo generateServiceInfo(Service s, int flags) { 33639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) return null; 33649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, s.owner, s.metaData)) { 33659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s.info; 33669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 33689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = new ServiceInfo(s.info); 33699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.metaData = s.metaData; 33709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.applicationInfo = generateApplicationInfo(s.owner, flags); 33719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return si; 33729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Provider extends Component { 33759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ProviderInfo info; 33769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean syncable; 33779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Provider(final ParseComponentArgs args, final ProviderInfo _info) { 33791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 33801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 33811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 33829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project syncable = false; 33839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 33859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Provider(Provider existingProvider) { 33869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(existingProvider); 33879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.info = existingProvider.info; 33889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.syncable = existingProvider.syncable; 33899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 33909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 33916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 33926dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 33936dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 33946dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 33956dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 33969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 33979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Provider{" 33989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 33999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 34009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ProviderInfo generateProviderInfo(Provider p, 34049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 34059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 34069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p.owner, p.metaData) 34079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0 34089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || p.info.uriPermissionPatterns == null)) { 34099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 34109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 34129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProviderInfo pi = new ProviderInfo(p.info); 34139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 34149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) { 34159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.uriPermissionPatterns = null; 34169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = generateApplicationInfo(p.owner, flags); 34189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 34199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Instrumentation extends Component { 34221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final InstrumentationInfo info; 34239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) { 34251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 34261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 34279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 34296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 34306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 34316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 34326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 34336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 34349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 34359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Instrumentation{" 34369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 34376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 34389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final InstrumentationInfo generateInstrumentationInfo( 34429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Instrumentation i, int flags) { 34439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == null) return null; 34449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 34459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i.info; 34469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = new InstrumentationInfo(i.info); 34489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ii.metaData = i.metaData; 34499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ii; 34509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class IntentInfo extends IntentFilter { 34539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasDefault; 34549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int labelRes; 34559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedLabel; 34569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int icon; 345781cd2e90ccdda498234384c8207afe2213714e60Adam Powell public int logo; 34589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ActivityIntentInfo extends IntentInfo { 34619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Activity activity; 34629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActivityIntentInfo(Activity _activity) { 34649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project activity = _activity; 34659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 34689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ActivityIntentInfo{" 34699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 34709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + activity.info.name + "}"; 34719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ServiceIntentInfo extends IntentInfo { 34759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Service service; 34769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ServiceIntentInfo(Service _service) { 34789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service = _service; 34799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 34819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 34829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ServiceIntentInfo{" 34839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 34849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + service.info.name + "}"; 34859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 34869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 348769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima 348869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima /** 348969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima * @hide 349069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima */ 349169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) { 349269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima sCompatibilityModeEnabled = compatibilityModeEnabled; 349369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 34949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3495