PackageParser.java revision ef3f5ddc2137ed99e41f00441b688fb56b855179
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.content.pm; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParser; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.xmlpull.v1.XmlPullParserException; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.ComponentName; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.Intent; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.IntentFilter; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.AssetManager; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Configuration; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.Resources; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.TypedArray; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.content.res.XmlResourceParser; 308d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapuimport android.os.Build; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PatternMatcher; 33aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapuimport android.provider.Settings; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 392269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackborn 402269d1572e5fcfb725ea55f5764d8c3280d69f6dDianne Hackbornimport com.android.internal.util.XmlUtils; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException; 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 518d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshimaimport java.util.List; 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry; 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile; 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser { 61a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn /** @hide */ 62a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public static class NewPermissionInfo { 63a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final String name; 64a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final int sdkVersion; 65a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final int fileVersion; 66a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 67a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public NewPermissionInfo(String name, int sdkVersion, int fileVersion) { 68a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.name = name; 69a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.sdkVersion = sdkVersion; 70a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.fileVersion = fileVersion; 71a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 72a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 73a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 74a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn /** 75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * List of new permissions that have been added since 1.0. 76a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * NOTE: These must be declared in SDK version order, with permissions 77a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * added to older SDKs appearing before those added to newer SDKs. 78a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * @hide 79a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn */ 8045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] = 8145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh new PackageParser.NewPermissionInfo[] { 825a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 8345515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.os.Build.VERSION_CODES.DONUT, 0), 8445515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE, 8545515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.os.Build.VERSION_CODES.DONUT, 0) 86a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn }; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mArchiveSourcePath; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mSeparateProcesses; 908d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu private static final int SDK_VERSION = Build.VERSION.SDK_INT; 918d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu private static final String SDK_CODENAME = "REL".equals(Build.VERSION.CODENAME) 928d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu ? null : Build.VERSION.CODENAME; 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mParseError = PackageManager.INSTALL_SUCCEEDED; 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Object mSync = new Object(); 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static WeakReference<byte[]> mReadBuffer; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9990d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private static boolean sCompatibilityModeEnabled = true; 10090d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu private static final int PARSE_DEFAULT_INSTALL_LOCATION = PackageInfo.INSTALL_LOCATION_UNSPECIFIED; 10169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima 1021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParsePackageItemArgs { 1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final Package owner; 1041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] outError; 1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int nameRes; 1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int labelRes; 1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int iconRes; 1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn String tag; 1101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedArray sa; 1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParsePackageItemArgs(Package _owner, String[] _outError, 1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int _nameRes, int _labelRes, int _iconRes) { 1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = _owner; 1151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outError = _outError; 1161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn nameRes = _nameRes; 1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn labelRes = _labelRes; 1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn iconRes = _iconRes; 1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParseComponentArgs extends ParsePackageItemArgs { 1231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] sepProcesses; 1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int processRes; 1258aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn final int descriptionRes; 1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int enabledRes; 1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int flags; 1281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParseComponentArgs(Package _owner, String[] _outError, 1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int _nameRes, int _labelRes, int _iconRes, 1318aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn String[] _sepProcesses, int _processRes, 1328aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn int _descriptionRes, int _enabledRes) { 1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(_owner, _outError, _nameRes, _labelRes, _iconRes); 1341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sepProcesses = _sepProcesses; 1351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn processRes = _processRes; 1368aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn descriptionRes = _descriptionRes; 1371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn enabledRes = _enabledRes; 1381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 140a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 141a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu /* Light weight package info. 142a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @hide 143a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu */ 144a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public static class PackageLite { 145a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public String packageName; 146a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public int installLocation; 147a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public String mScanPath; 148a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public PackageLite(String packageName, int installLocation) { 149a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu this.packageName = packageName; 150a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu this.installLocation = installLocation; 151a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 152a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 153a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 1541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParsePackageItemArgs mParseInstrumentationArgs; 1551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityArgs; 1561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityAliasArgs; 1571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseServiceArgs; 1581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseProviderArgs; 1591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** If set to true, we will only allow package files that exactly match 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the DTD. Otherwise, we try to get as much from the package as we 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can without failing. This should normally be set to false, to 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * support extensions to the DTD in future versions. */ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean RIGID_PARSER = false; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "PackageParser"; 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageParser(String archiveSourcePath) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = archiveSourcePath; 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSeparateProcesses(String[] procs) { 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSeparateProcesses = procs; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean isPackageFilename(String name) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name.endsWith(".apk"); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Generate and return the {@link PackageInfo} for a parsed package. 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p the parsed package. 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags indicating which optional information is included. 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static PackageInfo generatePackageInfo(PackageParser.Package p, 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int gids[], int flags) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo pi = new PackageInfo(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.packageName = p.packageName; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionCode = p.mVersionCode; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionName = p.mVersionName; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserId = p.mSharedUserId; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserLabel = p.mSharedUserLabel; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = p.applicationInfo; 196117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu pi.installLocation = p.installLocation; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_GIDS) != 0) { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.gids = gids; 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) { 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.configPreferences.size(); 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.configPreferences = new ConfigurationInfo[N]; 20449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn p.configPreferences.toArray(pi.configPreferences); 20549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 20649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn N = p.reqFeatures != null ? p.reqFeatures.size() : 0; 20749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (N > 0) { 20849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pi.reqFeatures = new FeatureInfo[N]; 20949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn p.reqFeatures.toArray(pi.reqFeatures); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_ACTIVITIES) != 0) { 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.activities.size(); 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2157eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2167eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.activities = new ActivityInfo[N]; 2177eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2187eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2197eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2207eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.activities.get(i).info.enabled) num++; 2217eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2227eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.activities = new ActivityInfo[num]; 2237eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 224d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.activities.get(i); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 228d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.activities[j++] = generateActivityInfo(p.activities.get(i), flags); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_RECEIVERS) != 0) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.receivers.size(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2367eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2377eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.receivers = new ActivityInfo[N]; 2387eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2397eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2407eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2417eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.receivers.get(i).info.enabled) num++; 2427eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2437eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.receivers = new ActivityInfo[num]; 2447eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 245d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.receivers.get(i); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 249d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.receivers[j++] = generateActivityInfo(p.receivers.get(i), flags); 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SERVICES) != 0) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.services.size(); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2577eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2587eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.services = new ServiceInfo[N]; 2597eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2607eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2617eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2627eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.services.get(i).info.enabled) num++; 2637eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2647eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.services = new ServiceInfo[num]; 2657eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 266d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Service service = p.services.get(i); 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (service.info.enabled 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 270d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.services[j++] = generateServiceInfo(p.services.get(i), flags); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PROVIDERS) != 0) { 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.providers.size(); 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2787eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if ((flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2797eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.providers = new ProviderInfo[N]; 2807eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } else { 2817eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn int num = 0; 2827eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn for (int i=0; i<N; i++) { 2837eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn if (p.providers.get(i).info.enabled) num++; 2847eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 2857eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn pi.providers = new ProviderInfo[num]; 2867eca687c2ee8f633678a1cd3ebf0886c0e6bbcf9Dianne Hackborn } 287d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu for (int i=0, j=0; i<N; i++) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Provider provider = p.providers.get(i); 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider.info.enabled 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 291d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.providers[j++] = generateProviderInfo(p.providers.get(i), flags); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.instrumentation.size(); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation = new InstrumentationInfo[N]; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation[i] = generateInstrumentationInfo( 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.instrumentation.get(i), flags); 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PERMISSIONS) != 0) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.permissions.size(); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions = new PermissionInfo[N]; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = p.requestedPermissions.size(); 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions = new String[N]; 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions[i] = p.requestedPermissions.get(i); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SIGNATURES) != 0) { 323d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu int N = (p.mSignatures != null) ? p.mSignatures.length : 0; 324d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu if (N > 0) { 325d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu pi.signatures = new Signature[N]; 326d83006cbe86545a1e8882b1a4ed90005ebf3423eSuchi Amalapurapu System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N); 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Certificate[] loadCertificates(JarFile jarFile, JarEntry je, 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer) { 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We must read the stream for the JarEntry to retrieve 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // its certificates. 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream is = jarFile.getInputStream(je); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (is.read(readBuffer, 0, readBuffer.length) != -1) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not using 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is.close(); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return je != null ? je.getCertificates() : null; 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + je.getName() + " in " 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarFile.getName(), e); 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 350af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_IS_SYSTEM = 1<<0; 351af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_CHATTY = 1<<1; 352af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_MUST_BE_APK = 1<<2; 353af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_IGNORE_PROCESSES = 1<<3; 354af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_FORWARD_LOCK = 1<<4; 355af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public final static int PARSE_ON_SDCARD = 1<<5; 356806da1d46c94c71728b94dec75dec6519c962b5cDianne Hackborn public final static int PARSE_IS_SYSTEM_DIR = 1<<6; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getParseError() { 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mParseError; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 362af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu public Package parsePackage(File sourceFile, String destCodePath, 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayMetrics metrics, int flags) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_SUCCEEDED; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = sourceFile.getPath(); 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!sourceFile.isFile()) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Skipping dir: " + mArchiveSourcePath); 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isPackageFilename(sourceFile.getName()) 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (flags&PARSE_MUST_BE_APK) != 0) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) == 0) { 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We expect to have non-.apk files in the system dir, 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so don't warn about them. 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d( 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Scanning package: " + mArchiveSourcePath); 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean assetError = true; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 391b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project int cookie = assmgr.addAssetPath(mArchiveSourcePath); 392b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if(cookie != 0) { 393b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assetError = false; 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to read AndroidManifest.xml of " 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mArchiveSourcePath, e); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(assetError) { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST; 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] errorText = new String[1]; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Package pkg = null; 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Exception errorException = null; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXXX todo: need to figure out correct configuration. 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = new Resources(assmgr, metrics, null); 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg = parsePackage(res, parser, flags, errorText); 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project errorException = e; 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (errorException != null) { 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, mArchiveSourcePath, errorException); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, mArchiveSourcePath + " (at " 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getPositionDescription() 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "): " + errorText[0]); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParseError == PackageManager.INSTALL_SUCCEEDED) { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 439af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu // Set code and resource paths 440af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu pkg.mPath = destCodePath; 441af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu pkg.mScanPath = mArchiveSourcePath; 442af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu //pkg.applicationInfo.sourceDir = destCodePath; 443af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu //pkg.applicationInfo.publicSourceDir = destRes; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean collectCertificates(Package pkg, int flags) { 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<byte[]> readBufferRef; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer = null; 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = mReadBuffer; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBufferRef != null) { 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = null; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = readBufferRef.get(); 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBuffer == null) { 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = new byte[8192]; 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = new WeakReference<byte[]>(readBuffer); 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarFile jarFile = new JarFile(mArchiveSourcePath); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] certs = null; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this package comes from the system image, then we 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can trust it... we'll just use the AndroidManifest.xml 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to retrieve its signatures, not validating all of the 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // files. 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml"); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = loadCertificates(jarFile, jarEntry, readBuffer); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs == null) { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarEntry.getName() + "; ignoring!"); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " certs=" + (certs != null ? certs.length : 0)); 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null) { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, " Public key: " 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + certs[i].getPublicKey().getEncoded() 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + certs[i].getPublicKey()); 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Enumeration entries = jarFile.entries(); 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (entries.hasMoreElements()) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarEntry je = (JarEntry)entries.nextElement(); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.isDirectory()) continue; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.getName().startsWith("META-INF/")) continue; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] localCerts = loadCertificates(jarFile, je, 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName() 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": certs=" + certs + " (" 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (certs != null ? certs.length : 0) + ")"); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localCerts == null) { 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (certs == null) { 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = localCerts; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ensure all certificates match. 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<certs.length; i++) { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean found = false; 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<localCerts.length; j++) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs[i] != null && 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].equals(localCerts[j])) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project found = true; 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!found || certs.length != localCerts.length) { 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has mismatched certificates at entry " 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = readBufferRef; 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null && certs.length > 0) { 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = new Signature[certs.length]; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures[i] = new Signature( 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].getEncoded()); 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates; ignoring!"); 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CertificateEncodingException e) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 580a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu /* 581a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * Utility method that retrieves just the package name and install 582a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * location from the apk location at the given file path. 583a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @param packageFilePath file location of the apk 584a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @param flags Special parse flags 585a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu * @return PackageLite object with package information. 586a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu */ 587a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu public static PackageLite parsePackageLite(String packageFilePath, int flags) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cookie = assmgr.addAssetPath(packageFilePath); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to read AndroidManifest.xml of " 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageFilePath, e); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String errors[] = new String[1]; 602a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu PackageLite packageLite = null; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 604a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu packageLite = parsePackageLite(parser, attrs, flags, errors); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, packageFilePath, e); 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException e) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, packageFilePath, e); 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 613a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (packageLite == null) { 614a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu Log.e(TAG, "parsePackageLite error: " + errors[0]); 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 617a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return packageLite; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String validateName(String name, boolean requiresSeparator) { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = name.length(); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasSep = false; 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean front = true; 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final char c = name.charAt(i); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = false; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!front) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= '0' && c <= '9') || c == '_') { 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasSep = true; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = true; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "bad character '" + c + "'"; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasSep || !requiresSeparator 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? null : "must have at least one '.' separator"; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String parsePackageName(XmlPullParser parser, 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs, int flags, String[] outError) 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException, XmlPullParserException { 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.START_TAG 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type != parser.END_DOCUMENT) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != parser.START_TAG) { 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No start tag found"; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v( 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Root element name: '" + parser.getName() + "'"); 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parser.getName().equals("manifest")) { 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No <manifest> tag"; 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = attrs.getAttributeValue(null, "package"); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null || pkgName.length() == 0) { 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not specify package"; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(pkgName, true); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad package name \"" 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkgName + "\": " + nameError; 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkgName.intern(); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 681a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu private static PackageLite parsePackageLite(XmlPullParser parser, 682a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu AttributeSet attrs, int flags, String[] outError) 683a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu throws IOException, XmlPullParserException { 684a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 685a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu int type; 686a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu while ((type=parser.next()) != parser.START_TAG 687a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu && type != parser.END_DOCUMENT) { 688a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu ; 689a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 690a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 691a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (type != parser.START_TAG) { 692a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "No start tag found"; 693a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 694a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 695a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v( 696a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu TAG, "Root element name: '" + parser.getName() + "'"); 697a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (!parser.getName().equals("manifest")) { 698a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "No <manifest> tag"; 699a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 700a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 701a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String pkgName = attrs.getAttributeValue(null, "package"); 702a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (pkgName == null || pkgName.length() == 0) { 703a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "<manifest> does not specify package"; 704a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 705a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 706a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String nameError = validateName(pkgName, true); 707a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (nameError != null && !"android".equals(pkgName)) { 708a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu outError[0] = "<manifest> specifies bad package name \"" 709a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu + pkgName + "\": " + nameError; 710a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return null; 711a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 71290d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu int installLocation = PARSE_DEFAULT_INSTALL_LOCATION; 713a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu for (int i = 0; i < attrs.getAttributeCount(); i++) { 714a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu String attr = attrs.getAttributeName(i); 715a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu if (attr.equals("installLocation")) { 716a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu installLocation = attrs.getAttributeIntValue(i, 71790d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu PARSE_DEFAULT_INSTALL_LOCATION); 718a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu break; 719a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 720a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 721a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu return new PackageLite(pkgName.intern(), installLocation); 722a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu } 723a2b6c3775ed6b8924232d6a01bae4a19740a15f8Suchi Amalapurapu 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temporary. 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public Signature stringToSignature(String str) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = str.length(); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] sig = new byte[N]; 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sig[i] = (byte)str.charAt(i); 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Signature(sig); 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Package parsePackage( 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res, XmlResourceParser parser, int flags, String[] outError) 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = null; 7421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = null; 7431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = null; 7441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = null; 7451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = parsePackageName(parser, attrs, flags, outError); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null) { 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Package pkg = new Package(pkgName); 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean foundApp = false; 755851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest); 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionCode = sa.getInteger( 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_versionCode, 0); 760cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn pkg.mVersionName = sa.getNonConfigurationString( 761cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifest_versionName, 0); 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg.mVersionName != null) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionName = pkg.mVersionName.intern(); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 765cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 766cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifest_sharedUserId, 0); 767cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn if (str != null && str.length() > 0) { 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(str, true); 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad sharedUserId name \"" 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + str + "\": " + nameError; 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserId = str.intern(); 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserLabel = sa.getResourceId( 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0); 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 780aaec779513737a70007dea955f60e1b8bcbc2f1aSuchi Amalapurapu 781117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu pkg.installLocation = sa.getInteger( 782117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu com.android.internal.R.styleable.AndroidManifest_installLocation, 78390d8ee650be988d8479f4f14ae8e541bb4cb034bSuchi Amalapurapu PARSE_DEFAULT_INSTALL_LOCATION); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 785723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // Resource boolean are -1, so 1 means we don't know the value. 786723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsSmallScreens = 1; 787723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsNormalScreens = 1; 788723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn int supportsLargeScreens = 1; 789c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn int resizeable = 1; 79011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn int anyDensity = 1; 791723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("application")) { 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (foundApp) { 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (RIGID_PARSER) { 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> has more than one <application>"; 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "<manifest> has more than one <application>"); 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project foundApp = true; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseApplication(pkg, res, parser, attrs, flags, outError)) { 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-group")) { 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) { 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission")) { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermission(pkg, res, parser, attrs, outError) == null) { 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-tree")) { 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) { 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-permission")) { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission); 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 833cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 834cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString( 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission_name); 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null && !pkg.requestedPermissions.contains(name)) { 841854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.requestedPermissions.add(name.intern()); 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-configuration")) { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ConfigurationInfo cPref = new ConfigurationInfo(); 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration); 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqTouchScreen = sa.getInt( 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen, 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.TOUCHSCREEN_UNDEFINED); 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqKeyboardType = sa.getInt( 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType, 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.KEYBOARD_UNDEFINED); 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard, 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqNavigation = sa.getInt( 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation, 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.NAVIGATION_UNDEFINED); 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav, 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.configPreferences.add(cPref); 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 874d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu } else if (tagName.equals("uses-feature")) { 87549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn FeatureInfo fi = new FeatureInfo(); 876d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu sa = res.obtainAttributes(attrs, 877d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu com.android.internal.R.styleable.AndroidManifestUsesFeature); 878cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 879cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 88049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.name = sa.getNonResourceString( 88149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_name); 88249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (fi.name == null) { 88349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.reqGlEsVersion = sa.getInt( 88449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_glEsVersion, 88549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn FeatureInfo.GL_ES_VERSION_UNDEFINED); 88649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 88749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (sa.getBoolean( 88849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesFeature_required, 88949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn true)) { 89049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn fi.flags |= FeatureInfo.FLAG_REQUIRED; 89149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 892d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu sa.recycle(); 89349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (pkg.reqFeatures == null) { 89449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.reqFeatures = new ArrayList<FeatureInfo>(); 89549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 89649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.reqFeatures.add(fi); 89749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn 89849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (fi.name == null) { 89949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn ConfigurationInfo cPref = new ConfigurationInfo(); 90049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn cPref.reqGlEsVersion = fi.reqGlEsVersion; 90149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn pkg.configPreferences.add(cPref); 90249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 903d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu 904d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu XmlUtils.skipCurrentTag(parser); 905d299b8194dde8c4875e5f032918ab35ebad8b1f1Suchi Amalapurapu 906851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else if (tagName.equals("uses-sdk")) { 9078d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_VERSION > 0) { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesSdk); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 911851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int minVers = 0; 912851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String minCode = null; 913851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int targetVers = 0; 914851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String targetCode = null; 915851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 916851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn TypedValue val = sa.peekValue( 917851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion); 918851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 919851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 920851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 921851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 922851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 9235c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn targetVers = minVers = val.data; 924851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 925851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 926851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 927851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn val = sa.peekValue( 928851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion); 929851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 930851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 931851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 932851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 933851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 934851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetVers = val.data; 935851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 936851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 937851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9405c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn if (minCode != null) { 9418d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (!minCode.equals(SDK_CODENAME)) { 9428d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_CODENAME != null) { 9435c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires development platform " + minCode 9448d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current platform is " + SDK_CODENAME + ")"; 9455c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } else { 9465c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires development platform " + minCode 9475c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn + " but this is a release platform."; 9485c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 9495c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 9505c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return null; 9515c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 9528d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu } else if (minVers > SDK_VERSION) { 9535c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn outError[0] = "Requires newer sdk version #" + minVers 9548d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current version is #" + SDK_VERSION + ")"; 9555c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 9565c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn return null; 9575c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn } 9585c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 959851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (targetCode != null) { 9608d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (!targetCode.equals(SDK_CODENAME)) { 9618d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu if (SDK_CODENAME != null) { 962851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 9638d5ae98549f68a1214a72e6d79456503eb7d96f5Suchi Amalapurapu + " (current platform is " + SDK_CODENAME + ")"; 964851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 965851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 966851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " but this is a release platform."; 967851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 968851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 969851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn return null; 970851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 971851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If the code matches, it definitely targets this SDK. 972a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion 973a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; 974a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } else { 975a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion = targetVers; 976851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 981723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } else if (tagName.equals("supports-screens")) { 982723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn sa = res.obtainAttributes(attrs, 983723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens); 984723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 985723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // This is a trick to get a boolean and still able to detect 986723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn // if a value was actually set. 987723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsSmallScreens = sa.getInteger( 988723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_smallScreens, 989723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsSmallScreens); 990723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsNormalScreens = sa.getInteger( 991723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_normalScreens, 992723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsNormalScreens); 993723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsLargeScreens = sa.getInteger( 994723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_largeScreens, 995723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn supportsLargeScreens); 996c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn resizeable = sa.getInteger( 997c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_resizeable, 998c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn supportsLargeScreens); 99911b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn anyDensity = sa.getInteger( 100011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn com.android.internal.R.styleable.AndroidManifestSupportsScreens_anyDensity, 100111b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn anyDensity); 1002723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 1003723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn sa.recycle(); 1004723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn 10059189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima XmlUtils.skipCurrentTag(parser); 1006854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1007854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("protected-broadcast")) { 1008854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn sa = res.obtainAttributes(attrs, 1009854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProtectedBroadcast); 1010854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1011cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1012cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 1013854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn String name = sa.getNonResourceString( 1014854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProtectedBroadcast_name); 1015854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1016854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn sa.recycle(); 1017854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1018854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (name != null && (flags&PARSE_IS_SYSTEM) != 0) { 1019854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (pkg.protectedBroadcasts == null) { 1020854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.protectedBroadcasts = new ArrayList<String>(); 1021854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1022854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (!pkg.protectedBroadcasts.contains(name)) { 1023854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn pkg.protectedBroadcasts.add(name.intern()); 1024854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1025854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1026854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1027854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1028854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1029854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("instrumentation")) { 1030854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) { 1031854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn return null; 1032854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } 1033854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1034b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } else if (tagName.equals("original-package")) { 1035b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa = res.obtainAttributes(attrs, 1036b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage); 1037b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1038cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String orig =sa.getNonConfigurationString( 1039cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0); 10406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (!pkg.packageName.equals(orig)) { 1041c1552397be706c243338389c628a44eee6011eaeDianne Hackborn if (pkg.mOriginalPackages == null) { 1042c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mOriginalPackages = new ArrayList<String>(); 1043c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mRealPackage = pkg.packageName; 1044c1552397be706c243338389c628a44eee6011eaeDianne Hackborn } 1045c1552397be706c243338389c628a44eee6011eaeDianne Hackborn pkg.mOriginalPackages.add(orig); 10466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 1047b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1048b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa.recycle(); 1049b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1050b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1051b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1052b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } else if (tagName.equals("adopt-permissions")) { 1053b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa = res.obtainAttributes(attrs, 1054b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage); 1055b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1056cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 1057cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestOriginalPackage_name, 0); 1058b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1059b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn sa.recycle(); 1060b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 10616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (name != null) { 1062b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn if (pkg.mAdoptPermissions == null) { 1063b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn pkg.mAdoptPermissions = new ArrayList<String>(); 1064b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } 1065b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn pkg.mAdoptPermissions.add(name); 1066b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn } 1067b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1068b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1069b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 1070854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (tagName.equals("eat-comment")) { 1071854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn // Just skip this tag 1072854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn XmlUtils.skipCurrentTag(parser); 1073854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn continue; 1074854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 1075854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn } else if (RIGID_PARSER) { 1076854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn outError[0] = "Bad element under <manifest>: " 1077854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn + parser.getName(); 1078854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 1079854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn return null; 1080854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1082bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn Log.w(TAG, "Unknown element under <manifest>: " + parser.getName() 1083bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + " at " + mArchiveSourcePath + " " 1084bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!foundApp && pkg.instrumentation.size() == 0) { 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not contain an <application> or <instrumentation>"; 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY; 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1095a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final int NP = PackageParser.NEW_PERMISSIONS.length; 1096a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn StringBuilder implicitPerms = null; 1097a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn for (int ip=0; ip<NP; ip++) { 1098a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final PackageParser.NewPermissionInfo npi 1099a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = PackageParser.NEW_PERMISSIONS[ip]; 1100a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) { 1101a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn break; 1102a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 1103a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (!pkg.requestedPermissions.contains(npi.name)) { 1104a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (implicitPerms == null) { 1105a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms = new StringBuilder(128); 1106a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(pkg.packageName); 1107a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(": compat added "); 1108a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } else { 1109a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(' '); 1110a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 1111a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn implicitPerms.append(npi.name); 1112a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.requestedPermissions.add(npi.name); 1113a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 1114851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 1115a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (implicitPerms != null) { 1116a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.i(TAG, implicitPerms.toString()); 1117a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 1118851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 1119723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsSmallScreens < 0 || (supportsSmallScreens > 0 1120723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 112111b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1122723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SMALL_SCREENS; 1123723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1124723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsNormalScreens != 0) { 1125723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_NORMAL_SCREENS; 1126723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1127723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn if (supportsLargeScreens < 0 || (supportsLargeScreens > 0 1128723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 112911b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1130723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_LARGE_SCREENS; 1131723738cfaec3dd7b0fe152c872c41bebf94074c4Dianne Hackborn } 1132c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn if (resizeable < 0 || (resizeable > 0 1133c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 113411b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 1135c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_RESIZEABLE_FOR_SCREENS; 1136c4db95c077f826585d20be2f3db4043c53d30cf5Dianne Hackborn } 113711b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn if (anyDensity < 0 || (anyDensity > 0 113811b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn && pkg.applicationInfo.targetSdkVersion 113911b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn >= android.os.Build.VERSION_CODES.DONUT)) { 114011b822d2a91ea17c34c0cb1c11e80a9a30d72864Dianne Hackborn pkg.applicationInfo.flags |= ApplicationInfo.FLAG_SUPPORTS_SCREEN_DENSITIES; 11411ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima } 11421ecf5d28817f0a051e77488380dcd5bc622ea169Mitsuru Oshima 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildClassName(String pkg, CharSequence clsSeq, 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clsSeq == null || clsSeq.length() <= 0) { 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Empty class name in package " + pkg; 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cls = clsSeq.toString(); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = cls.charAt(0); 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + cls).intern(); 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cls.indexOf('.') < 0) { 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder b = new StringBuilder(pkg); 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append('.'); 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append(cls); 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b.toString().intern(); 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c >= 'a' && c <= 'z') { 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cls.intern(); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad class name " + cls + " in package " + pkg; 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildCompoundName(String pkg, 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String type, String[] outError) { 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String proc = procSeq.toString(); 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = proc.charAt(0); 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg != null && c == ':') { 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (proc.length() < 2) { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad " + type + " name " + proc + " in package " + pkg 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": must be at least two characters"; 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String subName = proc.substring(1); 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(subName, false); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null) { 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + proc).intern(); 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(proc, true); 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"system".equals(proc)) { 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return proc.intern(); 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildProcessName(String pkg, String defProc, 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, int flags, String[] separateProcesses, 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) { 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc != null ? defProc : pkg; 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (separateProcesses != null) { 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=separateProcesses.length-1; i>=0; i--) { 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String sp = separateProcesses[i]; 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) { 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null || procSeq.length() <= 0) { 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buildCompoundName(pkg, procSeq, "package", outError); 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildTaskAffinityName(String pkg, String defProc, 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String[] outError) { 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null) { 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq.length() <= 0) { 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buildCompoundName(pkg, procSeq, "taskAffinity", outError); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PermissionGroup parsePermissionGroup(Package owner, Resources res, 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup perm = new PermissionGroup(owner); 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup); 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-group>", sa, 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_name, 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_label, 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon)) { 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_description, 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm, 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissionGroups.add(perm); 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermission(Package owner, Resources res, 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission>", sa, 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_name, 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_label, 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_icon)) { 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1282cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1283cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = sa.getNonResourceString( 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup); 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.group != null) { 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = perm.info.group.intern(); 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_description, 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = sa.getInt( 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel, 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.protectionLevel == -1) { 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission> does not specify protectionLevel"; 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission>", perm, 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissions.add(perm); 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermissionTree(Package owner, Resources res, 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree); 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-tree>", sa, 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_name, 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_label, 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_icon)) { 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = perm.info.name.indexOf('.'); 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index > 0) { 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = perm.info.name.indexOf('.', index+1); 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission-tree> name has less than three segments: " 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + perm.info.name; 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = 0; 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL; 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.tree = true; 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm, 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissions.add(perm); 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Instrumentation parseInstrumentation(Package owner, Resources res, 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation); 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseInstrumentationArgs == null) { 13701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError, 13711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_name, 13721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_label, 13731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_icon); 13741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.tag = "<instrumentation>"; 13751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 13761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 13771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.sa = sa; 13781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 13791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Instrumentation a = new Instrumentation(mParseInstrumentationArgs, 13801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn new InstrumentationInfo()); 13811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1388cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1389cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage); 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.targetPackage = str != null ? str.intern() : null; 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.handleProfiling = sa.getBoolean( 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling, 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.functionalTest = sa.getBoolean( 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest, 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.info.targetPackage == null) { 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<instrumentation> does not specify targetPackage"; 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a, 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.instrumentation.add(a); 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseApplication(Package owner, Resources res, 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ApplicationInfo ai = owner.applicationInfo; 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String pkgName = owner.applicationInfo.packageName; 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication); 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1430cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 1431cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_name, 0); 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null) { 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.className = buildClassName(pkgName, name, outError); 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai.className == null) { 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1441cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String manageSpaceActivity = sa.getNonConfigurationString( 1442cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity, 0); 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (manageSpaceActivity != null) { 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity, 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError); 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1448181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate boolean allowBackup = sa.getBoolean( 1449181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true); 1450181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate if (allowBackup) { 1451181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; 14525e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate 14533de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate // backupAgent, killAfterRestore, and restoreAnyVersion are only relevant 14543de55bcd34afd5871816526294f9514d1adf3fe5Christopher Tate // if backup is possible for the given application. 1455cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String backupAgent = sa.getNonConfigurationString( 1456cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_backupAgent, 0); 1457181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate if (backupAgent != null) { 1458181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate ai.backupAgentName = buildClassName(pkgName, backupAgent, outError); 1459a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn if (false) { 1460a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.v(TAG, "android:backupAgent = " + ai.backupAgentName 1461a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " from " + pkgName + "+" + backupAgent); 1462a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn } 14635e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate 14645e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate if (sa.getBoolean( 14655e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_killAfterRestore, 14665e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate true)) { 14675e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate ai.flags |= ApplicationInfo.FLAG_KILL_AFTER_RESTORE; 14685e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate } 14695e1ab335e6e8fbfa19c64d53880a22f472010953Christopher Tate if (sa.getBoolean( 14703dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_restoreAnyVersion, 14713dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate false)) { 14723dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate ai.flags |= ApplicationInfo.FLAG_RESTORE_ANY_VERSION; 14733dda518a4fd57cdded3afa50d8aa206501de7fc6Christopher Tate } 1474181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate } 1475181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate } 1476181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_label); 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (ai.labelRes=v.resourceId) == 0) { 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.nonLocalizedLabel = v.coerceToString(); 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.icon = sa.getResourceId( 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_icon, 0); 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.theme = sa.getResourceId( 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_theme, 0); 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.descriptionRes = sa.getResourceId( 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_description, 0); 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_persistent, 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_PERSISTENT; 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1498af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu if ((flags & PARSE_FORWARD_LOCK) != 0) { 1499af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu ai.flags |= ApplicationInfo.FLAG_FORWARD_LOCK; 1500af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } 1501af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu 1502af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu if ((flags & PARSE_ON_SDCARD) != 0) { 15036069beb2dfed6da837bf7faa3db3f6119edc017aSuchi Amalapurapu ai.flags |= ApplicationInfo.FLAG_EXTERNAL_STORAGE; 1504af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu } 1505af8e9f4805643f90a9dc0ecfa119e0a860c12f8aSuchi Amalapurapu 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_debuggable, 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE; 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 1513ef3f5ddc2137ed99e41f00441b688fb56b855179Ben Cheng com.android.internal.R.styleable.AndroidManifestApplication_vmSafeMode, 151423085b781e145ed684e7270af1d5ced6800b8effBen Cheng false)) { 151523085b781e145ed684e7270af1d5ced6800b8effBen Cheng ai.flags |= ApplicationInfo.FLAG_VM_SAFE_MODE; 151623085b781e145ed684e7270af1d5ced6800b8effBen Cheng } 151723085b781e145ed684e7270af1d5ced6800b8effBen Cheng 151823085b781e145ed684e7270af1d5ced6800b8effBen Cheng if (sa.getBoolean( 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_hasCode, 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_HAS_CODE; 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting, 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING; 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData, 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA; 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1536ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn if (sa.getBoolean( 1537ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_testOnly, 1538e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn false)) { 1539ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn ai.flags |= ApplicationInfo.FLAG_TEST_ONLY; 1540ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } 1541ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn 15421874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor if (sa.getBoolean( 15431874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor com.android.internal.R.styleable.AndroidManifestApplication_neverEncrypt, 15441874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor false)) { 15451874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor ai.flags |= ApplicationInfo.FLAG_NEVER_ENCRYPT; 15461874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor } 15471874aa487cf5da31f5770d21f0973a417f99247cOscar Montemayor 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1549cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1550cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_permission, 0); 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.permission = (str != null && str.length() > 0) ? str.intern() : null; 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1553cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1554cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity, 0); 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName, 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str, outError); 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] == null) { 1559cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn ai.processName = buildProcessName(ai.packageName, null, sa.getNonConfigurationString( 1560cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_process, 0), 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags, mSeparateProcesses, outError); 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1563cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn ai.enabled = sa.getBoolean( 1564cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_enabled, true); 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int innerDepth = parser.getDepth(); 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > innerDepth)) { 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("activity")) { 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false); 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("receiver")) { 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true); 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.receivers.add(a); 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("service")) { 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Service s = parseService(owner, res, parser, attrs, flags, outError); 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.services.add(s); 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("provider")) { 16129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider p = parseProvider(owner, res, parser, attrs, flags, outError); 16139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) { 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.providers.add(p); 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("activity-alias")) { 16211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError); 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note: application meta-data is stored off to the side, so it can 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remain null in the primary copy (we like to avoid extra copies because 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it can be large) 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData, 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-library")) { 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary); 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1643cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // Note: don't allow this value to be a reference to a resource 1644cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn // that may change. 16459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String lname = sa.getNonResourceString( 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary_name); 164749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn boolean req = sa.getBoolean( 164849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesLibrary_required, 164949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn true); 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 165349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (lname != null) { 165449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (req) { 165549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (owner.usesLibraries == null) { 165649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesLibraries = new ArrayList<String>(); 165749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 165849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (!owner.usesLibraries.contains(lname)) { 165949237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesLibraries.add(lname.intern()); 166049237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 166149237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } else { 166249237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (owner.usesOptionalLibraries == null) { 166349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesOptionalLibraries = new ArrayList<String>(); 166449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 166549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn if (!owner.usesOptionalLibraries.contains(lname)) { 166649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn owner.usesOptionalLibraries.add(lname.intern()); 166749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 166849237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn } 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 1675a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <application>: " + tagName 1676a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 1677a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <application>: " + tagName; 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo, 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError, String tag, TypedArray sa, 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nameRes, int labelRes, int iconRes) { 1694cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString(nameRes, 0); 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = tag + " does not specify android:name"; 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.name 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = buildClassName(owner.applicationInfo.packageName, name, outError); 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.name == null) { 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iconVal = sa.getResourceId(iconRes, 0); 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iconVal != 0) { 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = iconVal; 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = null; 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue(labelRes); 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.packageName = owner.packageName; 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivity(Package owner, Resources res, 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError, 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean receiver) throws XmlPullParserException, IOException { 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity); 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityArgs == null) { 17291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = new ParseComponentArgs(owner, outError, 17301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_name, 17311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_label, 17321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_icon, 17331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 17341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_process, 17358aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_description, 17361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_enabled); 17371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 17381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 17391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>"; 17401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.sa = sa; 17411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.flags = flags; 17421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 17431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityArgs, new ActivityInfo()); 17441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported); 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported, false); 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.theme = sa.getResourceId( 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_theme, 0); 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1760cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1761cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_permission, 0); 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = owner.applicationInfo.permission; 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1768cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1769cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity, 0); 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName, 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.applicationInfo.taskAffinity, str, outError); 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags = 0; 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_multiprocess, 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS; 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch, 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH; 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch, 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH; 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_noHistory, 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_NO_HISTORY; 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState, 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE; 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded, 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED; 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents, 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS; 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting, 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) { 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING; 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1822ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn if (sa.getBoolean( 1823ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_finishOnCloseSystemDialogs, 1824ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn false)) { 1825ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn a.info.flags |= ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS; 1826ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn } 1827ffa424800d0338b8b894aef2ea1e3e3344cbda7aDianne Hackborn 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!receiver) { 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = sa.getInt( 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_launchMode, 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.LAUNCH_MULTIPLE); 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.screenOrientation = sa.getInt( 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation, 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = sa.getInt( 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_configChanges, 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.softInputMode = sa.getInt( 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode, 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE; 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = 0; 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) { 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 1867bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn Log.w(TAG, "No actions in intent filter at " 1868bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + mArchiveSourcePath + " " 1869bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 1882a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <receiver>: " + parser.getName() 1883a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 1884a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1886a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <activity>: " + parser.getName() 1887a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 1888a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <receiver>: " + parser.getName(); 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <activity>: " + parser.getName(); 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivityAlias(Package owner, Resources res, 19101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 19111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn throws XmlPullParserException, IOException { 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias); 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1915cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String targetActivity = sa.getNonConfigurationString( 1916cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity, 0); 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> does not specify android:targetActivity"; 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity = buildClassName(owner.applicationInfo.packageName, 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity, outError); 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityAliasArgs == null) { 19311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs = new ParseComponentArgs(owner, outError, 19321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_name, 19331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_label, 19341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_icon, 19351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 19361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 0, 19378aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_description, 19381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled); 19391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.tag = "<activity-alias>"; 19401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 19411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 19421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.sa = sa; 19431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.flags = flags; 19441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity target = null; 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = owner.activities.size(); 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NA; i++) { 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity t = owner.activities.get(i); 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity.equals(t.info.name)) { 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target = t; 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == null) { 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> target activity " + targetActivity 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " not found in manifest"; 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ActivityInfo info = new ActivityInfo(); 19641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.targetActivity = targetActivity; 19651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.configChanges = target.info.configChanges; 19661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.flags = target.info.flags; 19671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.icon = target.info.icon; 19681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.labelRes = target.info.labelRes; 19691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.nonLocalizedLabel = target.info.nonLocalizedLabel; 19701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.launchMode = target.info.launchMode; 19711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.processName = target.info.processName; 19728aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (info.descriptionRes == 0) { 19738aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn info.descriptionRes = target.info.descriptionRes; 19748aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 19751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.screenOrientation = target.info.screenOrientation; 19761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.taskAffinity = target.info.taskAffinity; 19771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.theme = target.info.theme; 19781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 19791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityAliasArgs, info); 19801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported); 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false); 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 1993cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 1994cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_permission, 0); 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) { 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 2020bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn Log.w(TAG, "No actions in intent filter at " 2021bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + mArchiveSourcePath + " " 2022bd0a81ff1c0e92e80e05e2f12bb1805c7d081e94Dianne Hackborn + parser.getPositionDescription()); 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2033a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName() 2034a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + " at " + mArchiveSourcePath + " " 2035a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <activity-alias>: " + parser.getName(); 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Provider parseProvider(Package owner, Resources res, 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider); 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseProviderArgs == null) { 20581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = new ParseComponentArgs(owner, outError, 20591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_name, 20601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_label, 20611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_icon, 20621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 20631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_process, 20648aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_description, 20651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_enabled); 20661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.tag = "<provider>"; 20671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 20681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 20691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.sa = sa; 20701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.flags = flags; 20711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 20721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Provider p = new Provider(mParseProviderArgs, new ProviderInfo()); 20731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.exported = sa.getBoolean( 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_exported, true); 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2081cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String cpname = sa.getNonConfigurationString( 2082cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_authorities, 0); 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.isSyncable = sa.getBoolean( 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_syncable, 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2088cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String permission = sa.getNonConfigurationString( 2089cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_permission, 0); 2090cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2091cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_readPermission, 0); 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = owner.applicationInfo.permission; 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2101cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2102cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_writePermission, 0); 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = owner.applicationInfo.permission; 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.grantUriPermissions = sa.getBoolean( 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions, 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.multiprocess = sa.getBoolean( 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_multiprocess, 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.initOrder = sa.getInt( 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_initOrder, 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpname == null) { 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<provider> does not incude authorities attribute"; 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.authority = cpname.intern(); 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseProviderTags(res, parser, attrs, p, outError)) { 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseProviderTags(Resources res, 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider outInfo, String[] outError) 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21582af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("grant-uri-permission")) { 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission); 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher pa = null; 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2165cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2166cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path, 0); 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL); 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2171cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2172cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix, 0); 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX); 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2177cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2178cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern, 0); 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pa != null) { 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.info.uriPermissionPatterns == null) { 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = new PatternMatcher[1]; 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns[0] = pa; 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = outInfo.info.uriPermissionPatterns.length; 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher[] newp = new PatternMatcher[N+1]; 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N); 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newp[N] = pa; 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = newp; 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.grantUriPermissions = true; 21972af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 21982af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2199a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <path-permission>: " 2200a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2201a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 22022af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 22032af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 22042af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22052af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>"; 22062af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn return false; 22072af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22082af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 22092af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22102af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else if (parser.getName().equals("path-permission")) { 22112af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn TypedArray sa = res.obtainAttributes(attrs, 22122af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission); 22132af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22142af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PathPermission pa = null; 22152af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2216cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String permission = sa.getNonConfigurationString( 2217cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_permission, 0); 2218cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String readPermission = sa.getNonConfigurationString( 2219cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_readPermission, 0); 22202af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (readPermission == null) { 22212af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn readPermission = permission; 22222af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 2223cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String writePermission = sa.getNonConfigurationString( 2224cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_writePermission, 0); 22252af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (writePermission == null) { 22262af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn writePermission = permission; 22272af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22282af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22292af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn boolean havePerm = false; 22302af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (readPermission != null) { 22312af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn readPermission = readPermission.intern(); 22322af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn havePerm = true; 22332af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22342af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (writePermission != null) { 2235e04b1ad9cd3d9a159d4c7721a374f987be1062cdBjorn Bringert writePermission = writePermission.intern(); 22362af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn havePerm = true; 22372af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22382af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22392af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!havePerm) { 22402af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2241a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "No readPermission or writePermssion for <path-permission>: " 2242a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2243a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 22442af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 22452af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 22462af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22472af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outError[0] = "No readPermission or writePermssion for <path-permission>"; 22482af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn return false; 22492af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22502af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2251cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String path = sa.getNonConfigurationString( 2252cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_path, 0); 22532af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 22542af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 22552af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_LITERAL, readPermission, writePermission); 22562af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22572af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2258cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn path = sa.getNonConfigurationString( 2259cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_pathPrefix, 0); 22602af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 22612af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 22622af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_PREFIX, readPermission, writePermission); 22632af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22642af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 2265cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn path = sa.getNonConfigurationString( 2266cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestPathPermission_pathPattern, 0); 22672af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (path != null) { 22682af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn pa = new PathPermission(path, 22692af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PatternMatcher.PATTERN_SIMPLE_GLOB, readPermission, writePermission); 22702af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22712af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22722af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn sa.recycle(); 22732af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn 22742af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (pa != null) { 22752af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (outInfo.info.pathPermissions == null) { 22762af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions = new PathPermission[1]; 22772af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions[0] = pa; 22782af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 22792af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn final int N = outInfo.info.pathPermissions.length; 22802af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn PathPermission[] newp = new PathPermission[N+1]; 22812af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn System.arraycopy(outInfo.info.pathPermissions, 0, newp, 0, N); 22822af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn newp[N] = pa; 22832af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outInfo.info.pathPermissions = newp; 22842af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22852af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } else { 22862af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn if (!RIGID_PARSER) { 2287a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "No path, pathPrefix, or pathPattern for <path-permission>: " 2288a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2289a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 22902af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn XmlUtils.skipCurrentTag(parser); 22912af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn continue; 22922af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn } 22932af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn outError[0] = "No path, pathPrefix, or pathPattern for <path-permission>"; 22942af632f87d487deaa5b2eb71341cfc4f0c0d1173Dianne Hackborn return false; 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <provider>: " 2301a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2302a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 23039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 23049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <provider>: " 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 23099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 23129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Service parseService(Package owner, Resources res, 23159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 23169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 23179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 23189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService); 23199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseServiceArgs == null) { 23211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = new ParseComponentArgs(owner, outError, 23221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_name, 23231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_label, 23241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_icon, 23251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 23261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_process, 23278aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn com.android.internal.R.styleable.AndroidManifestService_description, 23281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_enabled); 23291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.tag = "<service>"; 23301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.sa = sa; 23331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.flags = flags; 23341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Service s = new Service(mParseServiceArgs, new ServiceInfo()); 23361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 23379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 23389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 23399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported); 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 23449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = sa.getBoolean( 23459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported, false); 23469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2348cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2349cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_permission, 0); 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = owner.applicationInfo.permission; 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = str.length() > 0 ? str.toString().intern() : null; 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceIntentInfo intent = new ServiceIntentInfo(s); 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) { 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.intents.add(intent); 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData, 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <service>: " 2382a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2383a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <service>: " 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = s.intents.size() > 0; 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s; 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseAllMetaData(Resources res, 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String tag, 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Component outInfo, String[] outError) 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under " + tag + ": " 2421a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2422a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under " + tag + ": " 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle parseMetaData(Resources res, 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle data, String[] outError) 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData); 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == null) { 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = new Bundle(); 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2446cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = sa.getNonConfigurationString( 2447cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestMetaData_name, 0); 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:name attribute"; 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 24529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2454854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn name = name.intern(); 2455854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_resource); 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && v.resourceId != 0) { 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Meta data ref " + name + ": " + v); 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.resourceId); 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = sa.peekValue( 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_value); 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Meta data " + name + ": " + v); 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null) { 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v.type == TypedValue.TYPE_STRING) { 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence cs = v.coerceToString(); 2468854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn data.putString(name, cs != null ? cs.toString().intern() : null); 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) { 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putBoolean(name, v.data != 0); 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type >= TypedValue.TYPE_FIRST_INT 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && v.type <= TypedValue.TYPE_LAST_INT) { 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.data); 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_FLOAT) { 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putFloat(name, v.getFloat()); 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 2478a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types: " 2479a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2480a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types"; 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 24849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:value or android:resource attribute"; 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String ANDROID_RESOURCES 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = "http://schemas.android.com/apk/res/android"; 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseIntent(Resources res, 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentInfo outInfo, String[] outError, boolean isActivity) 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter); 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int priority = sa.getInt( 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0); 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) { 25139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Activity with priority > 0, forcing to 0 at " 2514a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + mArchiveSourcePath + " " 25159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getPositionDescription()); 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project priority = 0; 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.setPriority(priority); 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_label); 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = sa.getResourceId( 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0); 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nodeName = parser.getName(); 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nodeName.equals("action")) { 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addAction(value); 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("category")) { 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addCategory(value); 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("data")) { 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData); 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2565cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String str = sa.getNonConfigurationString( 2566cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_mimeType, 0); 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataType(str); 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IntentFilter.MalformedMimeTypeException e) { 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = e.toString(); 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2577cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2578cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_scheme, 0); 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataScheme(str); 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2583cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String host = sa.getNonConfigurationString( 2584cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_host, 0); 2585cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String port = sa.getNonConfigurationString( 2586cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_port, 0); 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (host != null) { 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataAuthority(host, port); 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2591cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2592cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_path, 0); 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL); 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2597cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2598cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_pathPrefix, 0); 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX); 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2603cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn str = sa.getNonConfigurationString( 2604cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn com.android.internal.R.styleable.AndroidManifestData_pathPattern, 0); 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!RIGID_PARSER) { 2612a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn Log.w(TAG, "Unknown element under <intent-filter>: " 2613a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getName() + " at " + mArchiveSourcePath + " " 2614a33e3f79259b56b03c7912af35944f34ad190e3cDianne Hackborn + parser.getPositionDescription()); 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <intent-filter>: " + parser.getName(); 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT); 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cats = ""; 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<String> it = outInfo.categoriesIterator(); 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it != null && it.hasNext()) { 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cats += " " + it.next(); 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Intent d=" + 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault + ", cat=" + cats); 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Package { 26376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String packageName; 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For now we only support one application per package. 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ApplicationInfo applicationInfo = new ApplicationInfo(); 26419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Permission> permissions = new ArrayList<Permission>(0); 26439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0); 26449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> activities = new ArrayList<Activity>(0); 26459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> receivers = new ArrayList<Activity>(0); 26469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Provider> providers = new ArrayList<Provider>(0); 26479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Service> services = new ArrayList<Service>(0); 26489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0); 26499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> requestedPermissions = new ArrayList<String>(); 26519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2652854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn public ArrayList<String> protectedBroadcasts; 2653854060af30f928c0a65591e9c8314ae17056e6b8Dianne Hackborn 265449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<String> usesLibraries = null; 265549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<String> usesOptionalLibraries = null; 26569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] usesLibraryFiles = null; 26579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2658c1552397be706c243338389c628a44eee6011eaeDianne Hackborn public ArrayList<String> mOriginalPackages = null; 26596dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String mRealPackage = null; 2660b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn public ArrayList<String> mAdoptPermissions = null; 2661b858dfda5012a1040927ed62c3bb856c3294d882Dianne Hackborn 26629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We store the application meta-data independently to avoid multiple unwanted references 26639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle mAppMetaData = null; 26649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is a 3rd party app, this is the path of the zip file. 26669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mPath; 26679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version code declared for this package. 26699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mVersionCode; 26709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version name declared for this package. 26729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mVersionName; 26739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user id that this package wants to use. 26759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mSharedUserId; 26769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user label that this package wants to use. 26789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mSharedUserLabel; 26799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Signatures that were read from the package. 26819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Signature mSignatures[]; 26829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For use by package manager service for quick lookup of 26849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preferred up order. 26859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mPreferredOrder = 0; 26869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26875c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // For use by the package manager to keep track of the path to the 26885c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // file an app came from. 26895c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public String mScanPath; 26905c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 26915c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn // For use by package manager to keep track of where it has done dexopt. 26925c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn public boolean mDidDexOpt; 26935c1e00b14d2ef10ec76abf3e951fa8003a67f558Dianne Hackborn 26949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Additional data supplied by callers. 26959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object mExtras; 26969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 26989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications hardware preferences 26999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 27009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<ConfigurationInfo> configPreferences = 27019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ArrayList<ConfigurationInfo>(); 27029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 270349237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn /* 270449237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn * Applications requested features 270549237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn */ 270649237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn public ArrayList<FeatureInfo> reqFeatures = null; 270749237345d83e62fdb9eb8d50b13ad086636a04faDianne Hackborn 2708117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu public int installLocation; 2709117818e4f171b1fd9daa05349c48f61388f04567Suchi Amalapurapu 27109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Package(String _name) { 27119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = _name; 27129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.packageName = _name; 27139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.uid = -1; 27149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String newName) { 27176dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn packageName = newName; 27186dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn applicationInfo.packageName = newName; 27196dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=permissions.size()-1; i>=0; i--) { 27206dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn permissions.get(i).setPackageName(newName); 27216dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 27226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=permissionGroups.size()-1; i>=0; i--) { 27236dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn permissionGroups.get(i).setPackageName(newName); 27246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 27256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=activities.size()-1; i>=0; i--) { 27266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn activities.get(i).setPackageName(newName); 27276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 27286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=receivers.size()-1; i>=0; i--) { 27296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn receivers.get(i).setPackageName(newName); 27306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 27316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=providers.size()-1; i>=0; i--) { 27326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn providers.get(i).setPackageName(newName); 27336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 27346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=services.size()-1; i>=0; i--) { 27356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn services.get(i).setPackageName(newName); 27366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 27376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn for (int i=instrumentation.size()-1; i>=0; i--) { 27386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn instrumentation.get(i).setPackageName(newName); 27396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 27406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 27416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 27429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 27439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Package{" 27449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 27459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + packageName + "}"; 27469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 27489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Component<II extends IntentInfo> { 27509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Package owner; 27511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ArrayList<II> intents; 27526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public final String className; 27539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle metaData; 27549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 27556dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn ComponentName componentName; 27566dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn String componentShortName; 27576dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 27589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Package _owner) { 27599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = _owner; 27601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = null; 27616dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 27621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 27631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 27641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) { 27651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = args.owner; 27661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = new ArrayList<II>(0); 2767cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn String name = args.sa.getNonConfigurationString(args.nameRes, 0); 27681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (name == null) { 27696dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 27701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not specify android:name"; 27711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 27721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 27731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 27741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.name 27751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn = buildClassName(owner.applicationInfo.packageName, name, args.outError); 27761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outInfo.name == null) { 27776dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = null; 27781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not have valid android:name"; 27791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 27801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 27811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 27826dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = outInfo.name; 27831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 27841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int iconVal = args.sa.getResourceId(args.iconRes, 0); 27851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (iconVal != 0) { 27861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.icon = iconVal; 27871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = null; 27881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 27891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 27901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedValue v = args.sa.peekValue(args.labelRes); 27911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 27921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = v.coerceToString(); 27931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 27941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 27951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.packageName = owner.packageName; 27961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 27971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 27981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParseComponentArgs args, final ComponentInfo outInfo) { 27991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn this(args, (PackageItemInfo)outInfo); 28001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.outError[0] != null) { 28011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 28021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 28041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.processRes != 0) { 28051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.processName = buildProcessName(owner.applicationInfo.packageName, 2806cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn owner.applicationInfo.processName, 2807cf244ada58539ce857ec041d7288d0271204fbb6Dianne Hackborn args.sa.getNonConfigurationString(args.processRes, 0), 28081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.flags, args.sepProcesses, args.outError); 28091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 28108aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 28118aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn if (args.descriptionRes != 0) { 28128aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn outInfo.descriptionRes = args.sa.getResourceId(args.descriptionRes, 0); 28138aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn } 28148aa2e8939c61d788cbc192098465e79f584e173aDianne Hackborn 28151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.enabled = args.sa.getBoolean(args.enabledRes, true); 28169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Component<II> clone) { 28199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = clone.owner; 28201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = clone.intents; 28216dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className = clone.className; 28226dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = clone.componentName; 28231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = clone.componentShortName; 28246dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28256dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 28266dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public ComponentName getComponentName() { 28276dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (componentName != null) { 28286dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentName; 28296dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28306dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (className != null) { 28316dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = new ComponentName(owner.applicationInfo.packageName, 28326dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn className); 28336dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28346dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentName; 28356dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28366dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 28376dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public String getComponentShortName() { 28386dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (componentShortName != null) { 28396dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentShortName; 28406dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28416dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn ComponentName component = getComponentName(); 28426dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn if (component != null) { 28436dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentShortName = component.flattenToShortString(); 28446dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28456dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn return componentShortName; 28466dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28476dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 28486dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 28496dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentName = null; 28506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn componentShortName = null; 28519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Permission extends Component<IntentInfo> { 28559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionInfo info; 28569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean tree; 28579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup group; 28589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner) { 28609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 28619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionInfo(); 28629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner, PermissionInfo _info) { 28659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 28669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 28679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28686dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 28696dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 28706dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 28716dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 28726dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 28759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Permission{" 28769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 28779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 28789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class PermissionGroup extends Component<IntentInfo> { 28829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionGroupInfo info; 28839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner) { 28859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 28869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionGroupInfo(); 28879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner, PermissionGroupInfo _info) { 28909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 28919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 28929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 28939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 28946dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 28956dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 28966dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 28976dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 28986dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 28999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 29009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "PermissionGroup{" 29019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 29029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 29039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static boolean copyNeeded(int flags, Package p, Bundle metaData) { 29079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0 29089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (metaData != null || p.mAppMetaData != null)) { 29099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 29109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0 29129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && p.usesLibraryFiles != null) { 29139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 29149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 29169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ApplicationInfo generateApplicationInfo(Package p, int flags) { 29199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 29209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p, null)) { 292169fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima // CompatibilityMode is global state. It's safe to modify the instance 292269fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima // of the package. 292369fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima if (!sCompatibilityModeEnabled) { 292469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima p.applicationInfo.disableCompatibilityMode(); 292569fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 29269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.applicationInfo; 29279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copy so we can store the metadata/libraries safely 29309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = new ApplicationInfo(p.applicationInfo); 29319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0) { 29329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = p.mAppMetaData; 29339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) { 29359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.sharedLibraryFiles = p.usesLibraryFiles; 29369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 293769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima if (!sCompatibilityModeEnabled) { 293869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima ai.disableCompatibilityMode(); 293969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 29409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 29419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionInfo generatePermissionInfo( 29449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission p, int flags) { 29459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 29469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 29479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 29489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = new PermissionInfo(p.info); 29509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 29519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 29529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionGroupInfo generatePermissionGroupInfo( 29559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup pg, int flags) { 29569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pg == null) return null; 29579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 29589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pg.info; 29599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info); 29619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.metaData = pg.metaData; 29629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pgi; 29639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Activity extends Component<ActivityIntentInfo> { 29661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ActivityInfo info; 29679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Activity(final ParseComponentArgs args, final ActivityInfo _info) { 29691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 29701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 29711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 29729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 29746dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 29756dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 29766dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 29776dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 29786dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 29799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 29809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Activity{" 29819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 29826dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 29839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ActivityInfo generateActivityInfo(Activity a, 29879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 29889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) return null; 29899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, a.owner, a.metaData)) { 29909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a.info; 29919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 29939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo ai = new ActivityInfo(a.info); 29949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = a.metaData; 29959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.applicationInfo = generateApplicationInfo(a.owner, flags); 29969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 29979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 29989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 29999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Service extends Component<ServiceIntentInfo> { 30001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ServiceInfo info; 30019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Service(final ParseComponentArgs args, final ServiceInfo _info) { 30031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 30041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 30051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 30069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 30086dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 30096dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 30106dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 30116dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30126dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 30139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 30149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Service{" 30159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 30166dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 30179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ServiceInfo generateServiceInfo(Service s, int flags) { 30219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) return null; 30229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, s.owner, s.metaData)) { 30239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s.info; 30249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 30269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = new ServiceInfo(s.info); 30279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.metaData = s.metaData; 30289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.applicationInfo = generateApplicationInfo(s.owner, flags); 30299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return si; 30309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Provider extends Component { 30339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ProviderInfo info; 30349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean syncable; 30359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Provider(final ParseComponentArgs args, final ProviderInfo _info) { 30371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 30381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 30391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 30409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project syncable = false; 30419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 30439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Provider(Provider existingProvider) { 30449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(existingProvider); 30459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.info = existingProvider.info; 30469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.syncable = existingProvider.syncable; 30479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30496dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 30506dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 30516dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 30526dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30536dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 30549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 30559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Provider{" 30569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 30579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 30589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ProviderInfo generateProviderInfo(Provider p, 30629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 30639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 30649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p.owner, p.metaData) 30659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0 30669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || p.info.uriPermissionPatterns == null)) { 30679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 30689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 30709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProviderInfo pi = new ProviderInfo(p.info); 30719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 30729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) { 30739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.uriPermissionPatterns = null; 30749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = generateApplicationInfo(p.owner, flags); 30769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 30779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Instrumentation extends Component { 30801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final InstrumentationInfo info; 30819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) { 30831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 30841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 30859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 30876dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn public void setPackageName(String packageName) { 30886dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn super.setPackageName(packageName); 30896dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn info.packageName = packageName; 30906dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn } 30916dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn 30929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 30939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Instrumentation{" 30949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 30956dee18c5cfdd5d63f3a9c299d2b61f819c07e920Dianne Hackborn + " " + getComponentShortName() + "}"; 30969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 30989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 30999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final InstrumentationInfo generateInstrumentationInfo( 31009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Instrumentation i, int flags) { 31019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == null) return null; 31029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 31039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i.info; 31049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = new InstrumentationInfo(i.info); 31069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ii.metaData = i.metaData; 31079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ii; 31089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class IntentInfo extends IntentFilter { 31119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasDefault; 31129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int labelRes; 31139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedLabel; 31149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int icon; 31159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ActivityIntentInfo extends IntentInfo { 31189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Activity activity; 31199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActivityIntentInfo(Activity _activity) { 31219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project activity = _activity; 31229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 31259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ActivityIntentInfo{" 31269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 31279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + activity.info.name + "}"; 31289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ServiceIntentInfo extends IntentInfo { 31329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Service service; 31339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ServiceIntentInfo(Service _service) { 31359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service = _service; 31369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 31389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 31399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ServiceIntentInfo{" 31409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 31419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + service.info.name + "}"; 31429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 31439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 314469fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima 314569fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima /** 314669fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima * @hide 314769fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima */ 314869fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima public static void setCompatibilityModeEnabled(boolean compatibilityModeEnabled) { 314969fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima sCompatibilityModeEnabled = compatibilityModeEnabled; 315069fff4a72d4dfc9208db79d773ef3ca23350287eMitsuru Oshima } 31519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3152