PackageParser.java revision 9189cabb0b6c6c28232fe6f412b7ba7a37352a6a
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; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.PatternMatcher; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.AttributeSet; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config; 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.DisplayMetrics; 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log; 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.TypedValue; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport com.android.internal.util.XmlUtils; 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.File; 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException; 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.InputStream; 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.lang.ref.WeakReference; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate; 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.CertificateEncodingException; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.ArrayList; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Enumeration; 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Iterator; 488d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshimaimport java.util.List; 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarEntry; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.jar.JarFile; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Package archive parsing 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class PackageParser { 58a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn /** @hide */ 59a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public static class NewPermissionInfo { 60a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final String name; 61a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final int sdkVersion; 62a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public final int fileVersion; 63a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 64a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public NewPermissionInfo(String name, int sdkVersion, int fileVersion) { 65a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.name = name; 66a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.sdkVersion = sdkVersion; 67a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn this.fileVersion = fileVersion; 68a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 69a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 70a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 71a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn /** 72a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * List of new permissions that have been added since 1.0. 73a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * NOTE: These must be declared in SDK version order, with permissions 74a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * added to older SDKs appearing before those added to newer SDKs. 75a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn * @hide 76a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn */ 7745515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] = 7845515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh new PackageParser.NewPermissionInfo[] { 795a3a77dabd744d5be79d7745c2a977c108a9ad98San Mehat new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, 8045515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.os.Build.VERSION_CODES.DONUT, 0), 8145515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh new PackageParser.NewPermissionInfo(android.Manifest.permission.READ_PHONE_STATE, 8245515659438964ec47f4feac247f0e9dce587c86Jaikumar Ganesh android.os.Build.VERSION_CODES.DONUT, 0) 83a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn }; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mArchiveSourcePath; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mSeparateProcesses; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSdkVersion; 88851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn private String mSdkCodename; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mParseError = PackageManager.INSTALL_SUCCEEDED; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Object mSync = new Object(); 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static WeakReference<byte[]> mReadBuffer; 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParsePackageItemArgs { 961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final Package owner; 971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] outError; 981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int nameRes; 991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int labelRes; 1001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int iconRes; 1011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn String tag; 1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedArray sa; 1041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParsePackageItemArgs(Package _owner, String[] _outError, 1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int _nameRes, int _labelRes, int _iconRes) { 1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = _owner; 1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outError = _outError; 1091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn nameRes = _nameRes; 1101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn labelRes = _labelRes; 1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn iconRes = _iconRes; 1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParseComponentArgs extends ParsePackageItemArgs { 1161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] sepProcesses; 1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int processRes; 1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int enabledRes; 1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int flags; 1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParseComponentArgs(Package _owner, String[] _outError, 1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int _nameRes, int _labelRes, int _iconRes, 1231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn String[] _sepProcesses, int _processRes,int _enabledRes) { 1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(_owner, _outError, _nameRes, _labelRes, _iconRes); 1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sepProcesses = _sepProcesses; 1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn processRes = _processRes; 1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn enabledRes = _enabledRes; 1281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParsePackageItemArgs mParseInstrumentationArgs; 1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityArgs; 1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityAliasArgs; 1341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseServiceArgs; 1351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseProviderArgs; 1361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** If set to true, we will only allow package files that exactly match 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the DTD. Otherwise, we try to get as much from the package as we 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can without failing. This should normally be set to false, to 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * support extensions to the DTD in future versions. */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean RIGID_PARSER = false; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "PackageParser"; 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageParser(String archiveSourcePath) { 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = archiveSourcePath; 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSeparateProcesses(String[] procs) { 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSeparateProcesses = procs; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 153851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn public void setSdkVersion(int sdkVersion, String codename) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSdkVersion = sdkVersion; 155851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mSdkCodename = codename; 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean isPackageFilename(String name) { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name.endsWith(".apk"); 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Generate and return the {@link PackageInfo} for a parsed package. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p the parsed package. 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags indicating which optional information is included. 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static PackageInfo generatePackageInfo(PackageParser.Package p, 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int gids[], int flags) { 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo pi = new PackageInfo(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.packageName = p.packageName; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionCode = p.mVersionCode; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionName = p.mVersionName; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserId = p.mSharedUserId; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserLabel = p.mSharedUserLabel; 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = p.applicationInfo; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_GIDS) != 0) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.gids = gids; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.configPreferences.size(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.configPreferences = new ConfigurationInfo[N]; 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.configPreferences[i] = p.configPreferences.get(i); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_ACTIVITIES) != 0) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.activities.size(); 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.activities = new ActivityInfo[N]; 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.activities.get(i); 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.activities[i] = generateActivityInfo(p.activities.get(i), flags); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_RECEIVERS) != 0) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.receivers.size(); 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.receivers = new ActivityInfo[N]; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.receivers.get(i); 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.receivers[i] = generateActivityInfo(p.receivers.get(i), flags); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SERVICES) != 0) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.services.size(); 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.services = new ServiceInfo[N]; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Service service = p.services.get(i); 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (service.info.enabled 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.services[i] = generateServiceInfo(p.services.get(i), flags); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PROVIDERS) != 0) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.providers.size(); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.providers = new ProviderInfo[N]; 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Provider provider = p.providers.get(i); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider.info.enabled 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.providers[i] = generateProviderInfo(p.providers.get(i), flags); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.instrumentation.size(); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation = new InstrumentationInfo[N]; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation[i] = generateInstrumentationInfo( 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.instrumentation.get(i), flags); 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PERMISSIONS) != 0) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.permissions.size(); 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions = new PermissionInfo[N]; 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = p.requestedPermissions.size(); 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions = new String[N]; 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions[i] = p.requestedPermissions.get(i); 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SIGNATURES) != 0) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.mSignatures.length; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.signatures = new Signature[N]; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N); 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Certificate[] loadCertificates(JarFile jarFile, JarEntry je, 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer) { 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We must read the stream for the JarEntry to retrieve 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // its certificates. 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream is = jarFile.getInputStream(je); 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (is.read(readBuffer, 0, readBuffer.length) != -1) { 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not using 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is.close(); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return je != null ? je.getCertificates() : null; 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + je.getName() + " in " 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarFile.getName(), e); 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int PARSE_IS_SYSTEM = 0x0001; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int PARSE_CHATTY = 0x0002; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int PARSE_MUST_BE_APK = 0x0004; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int PARSE_IGNORE_PROCESSES = 0x0008; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getParseError() { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mParseError; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Package parsePackage(File sourceFile, String destFileName, 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayMetrics metrics, int flags) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_SUCCEEDED; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = sourceFile.getPath(); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!sourceFile.isFile()) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Skipping dir: " + mArchiveSourcePath); 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isPackageFilename(sourceFile.getName()) 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (flags&PARSE_MUST_BE_APK) != 0) { 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) == 0) { 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We expect to have non-.apk files in the system dir, 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so don't warn about them. 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d( 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Scanning package: " + mArchiveSourcePath); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean assetError = true; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 334b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project int cookie = assmgr.addAssetPath(mArchiveSourcePath); 335b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if(cookie != 0) { 336b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assetError = false; 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath); 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to read AndroidManifest.xml of " 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mArchiveSourcePath, e); 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(assetError) { 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST; 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] errorText = new String[1]; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Package pkg = null; 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Exception errorException = null; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXXX todo: need to figure out correct configuration. 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = new Resources(assmgr, metrics, null); 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg = parsePackage(res, parser, flags, errorText); 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project errorException = e; 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (errorException != null) { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, mArchiveSourcePath, errorException); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, mArchiveSourcePath + " (at " 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getPositionDescription() 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "): " + errorText[0]); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParseError == PackageManager.INSTALL_SUCCEEDED) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.applicationInfo.sourceDir = destFileName; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.applicationInfo.publicSourceDir = destFileName; 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean collectCertificates(Package pkg, int flags) { 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<byte[]> readBufferRef; 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer = null; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = mReadBuffer; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBufferRef != null) { 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = null; 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = readBufferRef.get(); 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBuffer == null) { 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = new byte[8192]; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = new WeakReference<byte[]>(readBuffer); 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarFile jarFile = new JarFile(mArchiveSourcePath); 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] certs = null; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this package comes from the system image, then we 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can trust it... we'll just use the AndroidManifest.xml 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to retrieve its signatures, not validating all of the 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // files. 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml"); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = loadCertificates(jarFile, jarEntry, readBuffer); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs == null) { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarEntry.getName() + "; ignoring!"); 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " certs=" + (certs != null ? certs.length : 0)); 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, " Public key: " 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + certs[i].getPublicKey().getEncoded() 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + certs[i].getPublicKey()); 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Enumeration entries = jarFile.entries(); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (entries.hasMoreElements()) { 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarEntry je = (JarEntry)entries.nextElement(); 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.isDirectory()) continue; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.getName().startsWith("META-INF/")) continue; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] localCerts = loadCertificates(jarFile, je, 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer); 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName() 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": certs=" + certs + " (" 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (certs != null ? certs.length : 0) + ")"); 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localCerts == null) { 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (certs == null) { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = localCerts; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ensure all certificates match. 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<certs.length; i++) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean found = false; 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<localCerts.length; j++) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs[i] != null && 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].equals(localCerts[j])) { 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project found = true; 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!found || certs.length != localCerts.length) { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has mismatched certificates at entry " 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = readBufferRef; 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null && certs.length > 0) { 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = new Signature[certs.length]; 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures[i] = new Signature( 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].getEncoded()); 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates; ignoring!"); 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CertificateEncodingException e) { 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String parsePackageName(String packageFilePath, int flags) { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cookie = assmgr.addAssetPath(packageFilePath); 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to read AndroidManifest.xml of " 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageFilePath, e); 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String errors[] = new String[1]; 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = null; 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = parsePackageName(parser, attrs, flags, errors); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, packageFilePath, e); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException e) { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, packageFilePath, e); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName == null) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "parsePackageName error: " + errors[0]); 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return packageName; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String validateName(String name, boolean requiresSeparator) { 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = name.length(); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasSep = false; 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean front = true; 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final char c = name.charAt(i); 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = false; 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!front) { 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= '0' && c <= '9') || c == '_') { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasSep = true; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = true; 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "bad character '" + c + "'"; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasSep || !requiresSeparator 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? null : "must have at least one '.' separator"; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String parsePackageName(XmlPullParser parser, 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs, int flags, String[] outError) 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException, XmlPullParserException { 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.START_TAG 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type != parser.END_DOCUMENT) { 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != parser.START_TAG) { 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No start tag found"; 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v( 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Root element name: '" + parser.getName() + "'"); 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parser.getName().equals("manifest")) { 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No <manifest> tag"; 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = attrs.getAttributeValue(null, "package"); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null || pkgName.length() == 0) { 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not specify package"; 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(pkgName, true); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad package name \"" 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkgName + "\": " + nameError; 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkgName.intern(); 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temporary. 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public Signature stringToSignature(String str) { 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = str.length(); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] sig = new byte[N]; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sig[i] = (byte)str.charAt(i); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Signature(sig); 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Package parsePackage( 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res, XmlResourceParser parser, int flags, String[] outError) 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = null; 6321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = null; 6331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = null; 6341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = null; 6351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = parsePackageName(parser, attrs, flags, outError); 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null) { 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Package pkg = new Package(pkgName); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean foundApp = false; 645851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionCode = sa.getInteger( 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_versionCode, 0); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionName = sa.getNonResourceString( 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_versionName); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg.mVersionName != null) { 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionName = pkg.mVersionName.intern(); 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = sa.getNonResourceString( 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_sharedUserId); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(str, true); 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad sharedUserId name \"" 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + str + "\": " + nameError; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserId = str.intern(); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserLabel = sa.getResourceId( 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("application")) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (foundApp) { 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (RIGID_PARSER) { 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> has more than one <application>"; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "<manifest> has more than one <application>"); 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project foundApp = true; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseApplication(pkg, res, parser, attrs, flags, outError)) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-group")) { 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) { 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission")) { 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermission(pkg, res, parser, attrs, outError) == null) { 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-tree")) { 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) { 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-permission")) { 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission); 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString( 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission_name); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null && !pkg.requestedPermissions.contains(name)) { 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.requestedPermissions.add(name); 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-configuration")) { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ConfigurationInfo cPref = new ConfigurationInfo(); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration); 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqTouchScreen = sa.getInt( 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen, 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.TOUCHSCREEN_UNDEFINED); 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqKeyboardType = sa.getInt( 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType, 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.KEYBOARD_UNDEFINED); 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard, 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqNavigation = sa.getInt( 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation, 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.NAVIGATION_UNDEFINED); 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav, 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV; 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.configPreferences.add(cPref); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 751851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else if (tagName.equals("uses-sdk")) { 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSdkVersion > 0) { 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesSdk); 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 756851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int minVers = 0; 757851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String minCode = null; 758851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int targetVers = 0; 759851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String targetCode = null; 760851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 761851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn TypedValue val = sa.peekValue( 762851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion); 763851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 764851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 765851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 766851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 767851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 768851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn minVers = val.data; 769851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 770851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 771851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 772851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn val = sa.peekValue( 773851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion); 774851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 775851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 776851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 777851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 778851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 779851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetVers = val.data; 780851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 781851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 782851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 783851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int maxVers = sa.getInt( 784851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_maxSdkVersion, 785851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mSdkVersion); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (targetCode != null) { 790851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (!targetCode.equals(mSdkCodename)) { 791851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (mSdkCodename != null) { 792851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 793851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " (current platform is " + mSdkCodename + ")"; 794851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 795851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 796851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " but this is a release platform."; 797851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 798851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 799851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn return null; 800851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 801851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If the code matches, it definitely targets this SDK. 802a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion 803a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; 804a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } else { 805a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion = targetVers; 806851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 807851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 808851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (minVers > mSdkVersion) { 809851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires newer sdk version #" + minVers 810851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " (current version is #" + mSdkVersion + ")"; 811851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 812851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn return null; 813851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 814851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 815851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (maxVers < mSdkVersion) { 816851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires older sdk version #" + maxVers 817851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " (current version is #" + mSdkVersion + ")"; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("instrumentation")) { 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parseInstrumentation(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("eat-comment")) { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Just skip this tag 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (RIGID_PARSER) { 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <manifest>: " 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8389189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 8399189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 8409189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima } else if (tagName.equals("supports-density")) { 8419189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima sa = res.obtainAttributes(attrs, 8429189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima com.android.internal.R.styleable.AndroidManifestSupportsDensity); 8439189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 8449189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima int density = sa.getInteger( 8459189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima com.android.internal.R.styleable.AndroidManifestSupportsDensity_density, -1); 8469189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 8479189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima sa.recycle(); 8489189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 8499189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima if (density != -1 && !pkg.supportsDensityList.contains(density)) { 8509189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima pkg.supportsDensityList.add(density); 8519189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima } 8529189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 8539189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima XmlUtils.skipCurrentTag(parser); 8549189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 8559189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima } else if (tagName.equals("expandable")) { 8569189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima pkg.expandable = true; 8579189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima XmlUtils.skipCurrentTag(parser); 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Bad element under <manifest>: " 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName()); 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!foundApp && pkg.instrumentation.size() == 0) { 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not contain an <application> or <instrumentation>"; 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY; 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 871a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final int NP = PackageParser.NEW_PERMISSIONS.length; 872a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn for (int ip=0; ip<NP; ip++) { 873a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final PackageParser.NewPermissionInfo npi 874a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = PackageParser.NEW_PERMISSIONS[ip]; 875a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) { 876a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn break; 877a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 878a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (!pkg.requestedPermissions.contains(npi.name)) { 879a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn Log.i(TAG, "Impliciting adding " + npi.name + " to old pkg " 880a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn + pkg.packageName); 881a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.requestedPermissions.add(npi.name); 882a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 883851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 884851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg.usesLibraries.size() > 0) { 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.usesLibraryFiles = new String[pkg.usesLibraries.size()]; 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.usesLibraries.toArray(pkg.usesLibraryFiles); 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8899189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima // TODO: enable all density & expandable if target sdk is higher than donut 8909189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 8918d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima int size = pkg.supportsDensityList.size(); 8928d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima if (size > 0) { 8938d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima int densities[] = pkg.supportsDensities = new int[size]; 8948d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima List<Integer> densityList = pkg.supportsDensityList; 8958d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima for (int i = 0; i < size; i++) { 8968d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima densities[i] = densityList.get(i); 8978d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima } 8988d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima } 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildClassName(String pkg, CharSequence clsSeq, 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clsSeq == null || clsSeq.length() <= 0) { 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Empty class name in package " + pkg; 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cls = clsSeq.toString(); 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = cls.charAt(0); 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + cls).intern(); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cls.indexOf('.') < 0) { 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder b = new StringBuilder(pkg); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append('.'); 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append(cls); 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b.toString().intern(); 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c >= 'a' && c <= 'z') { 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cls.intern(); 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad class name " + cls + " in package " + pkg; 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildCompoundName(String pkg, 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String type, String[] outError) { 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String proc = procSeq.toString(); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = proc.charAt(0); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg != null && c == ':') { 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (proc.length() < 2) { 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad " + type + " name " + proc + " in package " + pkg 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": must be at least two characters"; 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String subName = proc.substring(1); 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(subName, false); 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null) { 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + proc).intern(); 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(proc, true); 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"system".equals(proc)) { 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return proc.intern(); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildProcessName(String pkg, String defProc, 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, int flags, String[] separateProcesses, 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) { 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc != null ? defProc : pkg; 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (separateProcesses != null) { 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=separateProcesses.length-1; i>=0; i--) { 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String sp = separateProcesses[i]; 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) { 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null || procSeq.length() <= 0) { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buildCompoundName(pkg, procSeq, "package", outError); 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildTaskAffinityName(String pkg, String defProc, 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String[] outError) { 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null) { 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq.length() <= 0) { 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buildCompoundName(pkg, procSeq, "taskAffinity", outError); 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PermissionGroup parsePermissionGroup(Package owner, Resources res, 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup perm = new PermissionGroup(owner); 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup); 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-group>", sa, 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_name, 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_label, 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon)) { 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_description, 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm, 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissionGroups.add(perm); 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermission(Package owner, Resources res, 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission); 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission>", sa, 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_name, 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_label, 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_icon)) { 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = sa.getNonResourceString( 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup); 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.group != null) { 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = perm.info.group.intern(); 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_description, 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = sa.getInt( 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel, 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.protectionLevel == -1) { 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission> does not specify protectionLevel"; 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission>", perm, 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissions.add(perm); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermissionTree(Package owner, Resources res, 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree); 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-tree>", sa, 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_name, 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_label, 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_icon)) { 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = perm.info.name.indexOf('.'); 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index > 0) { 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = perm.info.name.indexOf('.', index+1); 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission-tree> name has less than three segments: " 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + perm.info.name; 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = 0; 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL; 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.tree = true; 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm, 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissions.add(perm); 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Instrumentation parseInstrumentation(Package owner, Resources res, 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation); 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseInstrumentationArgs == null) { 11241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError, 11251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_name, 11261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_label, 11271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_icon); 11281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.tag = "<instrumentation>"; 11291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 11301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 11311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.sa = sa; 11321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 11331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Instrumentation a = new Instrumentation(mParseInstrumentationArgs, 11341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn new InstrumentationInfo()); 11351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage); 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.targetPackage = str != null ? str.intern() : null; 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.handleProfiling = sa.getBoolean( 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling, 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.functionalTest = sa.getBoolean( 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest, 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.info.targetPackage == null) { 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<instrumentation> does not specify targetPackage"; 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a, 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.instrumentation.add(a); 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseApplication(Package owner, Resources res, 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ApplicationInfo ai = owner.applicationInfo; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String pkgName = owner.applicationInfo.packageName; 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication); 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString( 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_name); 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null) { 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.className = buildClassName(pkgName, name, outError); 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai.className == null) { 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String manageSpaceActivity = sa.getNonResourceString( 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (manageSpaceActivity != null) { 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity, 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError); 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1200181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate boolean allowBackup = sa.getBoolean( 1201181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_allowBackup, true); 1202181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate if (allowBackup) { 1203181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate ai.flags |= ApplicationInfo.FLAG_ALLOW_BACKUP; 1204181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate String backupAgent = sa.getNonResourceString( 1205181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate com.android.internal.R.styleable.AndroidManifestApplication_backupAgent); 1206181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate if (backupAgent != null) { 1207181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate ai.backupAgentName = buildClassName(pkgName, backupAgent, outError); 1208181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate Log.v(TAG, "android:backupAgent = " + ai.backupAgentName 1209181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate + " from " + pkgName + "+" + backupAgent); 1210181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate } 1211181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate } 1212181fafaf48208978b8ba2022683ffa78aaeddde1Christopher Tate 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_label); 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (ai.labelRes=v.resourceId) == 0) { 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.nonLocalizedLabel = v.coerceToString(); 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.icon = sa.getResourceId( 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_icon, 0); 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.theme = sa.getResourceId( 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_theme, 0); 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.descriptionRes = sa.getResourceId( 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_description, 0); 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_persistent, 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_PERSISTENT; 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_debuggable, 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE; 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_hasCode, 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_HAS_CODE; 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting, 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING; 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData, 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA; 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1258ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn if (sa.getBoolean( 1259ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_testOnly, 1260e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn false)) { 1261ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn ai.flags |= ApplicationInfo.FLAG_TEST_ONLY; 1262ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } 1263ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_permission); 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.permission = (str != null && str.length() > 0) ? str.intern() : null; 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName, 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str, outError); 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] == null) { 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.processName = buildProcessName(ai.packageName, null, sa.getNonResourceString( 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_process), 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags, mSeparateProcesses, outError); 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.enabled = sa.getBoolean(com.android.internal.R.styleable.AndroidManifestApplication_enabled, true); 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int innerDepth = parser.getDepth(); 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > innerDepth)) { 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("activity")) { 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false); 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("receiver")) { 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true); 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.receivers.add(a); 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("service")) { 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Service s = parseService(owner, res, parser, attrs, flags, outError); 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.services.add(s); 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("provider")) { 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider p = parseProvider(owner, res, parser, attrs, flags, outError); 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) { 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.providers.add(p); 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("activity-alias")) { 13361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError); 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note: application meta-data is stored off to the side, so it can 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remain null in the primary copy (we like to avoid extra copies because 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it can be large) 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData, 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-library")) { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary); 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String lname = sa.getNonResourceString( 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary_name); 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lname != null && !owner.usesLibraries.contains(lname)) { 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.usesLibraries.add(lname); 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <application>: " + tagName); 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <application>: " + tagName; 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo, 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError, String tag, TypedArray sa, 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nameRes, int labelRes, int iconRes) { 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString(nameRes); 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = tag + " does not specify android:name"; 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.name 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = buildClassName(owner.applicationInfo.packageName, name, outError); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.name == null) { 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iconVal = sa.getResourceId(iconRes, 0); 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iconVal != 0) { 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = iconVal; 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = null; 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue(labelRes); 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.packageName = owner.packageName; 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseComponentInfo(Package owner, int flags, 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentInfo outInfo, String[] outError, String tag, TypedArray sa, 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nameRes, int labelRes, int iconRes, int processRes, 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int enabledRes) { 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, outInfo, outError, tag, sa, 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nameRes, labelRes, iconRes)) { 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (processRes != 0) { 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.processName = buildProcessName(owner.applicationInfo.packageName, 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.applicationInfo.processName, sa.getNonResourceString(processRes), 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags, mSeparateProcesses, outError); 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.enabled = sa.getBoolean(enabledRes, true); 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return outError[0] == null; 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivity(Package owner, Resources res, 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError, 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean receiver) throws XmlPullParserException, IOException { 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity); 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityArgs == null) { 14431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = new ParseComponentArgs(owner, outError, 14441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_name, 14451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_label, 14461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_icon, 14471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 14481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_process, 14491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_enabled); 14501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 14511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 14521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>"; 14531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.sa = sa; 14541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.flags = flags; 14551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 14561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityArgs, new ActivityInfo()); 14571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported); 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported, false); 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.theme = sa.getResourceId( 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_theme, 0); 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_permission); 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = owner.applicationInfo.permission; 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity); 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName, 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.applicationInfo.taskAffinity, str, outError); 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags = 0; 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_multiprocess, 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS; 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch, 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH; 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch, 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH; 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_noHistory, 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_NO_HISTORY; 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState, 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE; 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded, 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED; 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents, 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS; 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting, 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) { 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING; 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!receiver) { 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = sa.getInt( 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_launchMode, 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.LAUNCH_MULTIPLE); 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.screenOrientation = sa.getInt( 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation, 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = sa.getInt( 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_configChanges, 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.softInputMode = sa.getInt( 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode, 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE; 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = 0; 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) { 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Intent filter for activity " + intent 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " defines no actions"); 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <receiver>: " + parser.getName()); 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <activity>: " + parser.getName()); 15919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <receiver>: " + parser.getName(); 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <activity>: " + parser.getName(); 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivityAlias(Package owner, Resources res, 16121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 16131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn throws XmlPullParserException, IOException { 16149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 16159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias); 16169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String targetActivity = sa.getNonResourceString( 16189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity); 16199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 16209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> does not specify android:targetActivity"; 16219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity = buildClassName(owner.applicationInfo.packageName, 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity, outError); 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityAliasArgs == null) { 16331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs = new ParseComponentArgs(owner, outError, 16341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_name, 16351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_label, 16361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_icon, 16371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 16381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 0, 16391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled); 16401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.tag = "<activity-alias>"; 16411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 16421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 16431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.sa = sa; 16441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.flags = flags; 16451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 16469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity target = null; 16479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = owner.activities.size(); 16499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NA; i++) { 16509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity t = owner.activities.get(i); 16519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity.equals(t.info.name)) { 16529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target = t; 16539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 16549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == null) { 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> target activity " + targetActivity 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " not found in manifest"; 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ActivityInfo info = new ActivityInfo(); 16651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.targetActivity = targetActivity; 16661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.configChanges = target.info.configChanges; 16671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.flags = target.info.flags; 16681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.icon = target.info.icon; 16691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.labelRes = target.info.labelRes; 16701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.nonLocalizedLabel = target.info.nonLocalizedLabel; 16711d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.launchMode = target.info.launchMode; 16721d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.processName = target.info.processName; 16731d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.screenOrientation = target.info.screenOrientation; 16741d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.taskAffinity = target.info.taskAffinity; 16751d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.theme = target.info.theme; 16761d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 16771d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityAliasArgs, info); 16781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported); 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false); 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_permission); 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) { 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Intent filter for activity alias " + intent 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " defines no actions"); 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName()); 17329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 17339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 17349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <activity-alias>: " + parser.getName(); 17369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 17419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 17429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 17459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Provider parseProvider(Package owner, Resources res, 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider); 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseProviderArgs == null) { 17541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = new ParseComponentArgs(owner, outError, 17551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_name, 17561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_label, 17571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_icon, 17581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 17591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_process, 17601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_enabled); 17611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.tag = "<provider>"; 17621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 17631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 17641d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.sa = sa; 17651d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.flags = flags; 17661d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 17671d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Provider p = new Provider(mParseProviderArgs, new ProviderInfo()); 17681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.exported = sa.getBoolean( 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_exported, true); 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cpname = sa.getNonResourceString( 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_authorities); 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.isSyncable = sa.getBoolean( 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_syncable, 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission = sa.getNonResourceString( 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_permission); 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = sa.getNonResourceString( 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_readPermission); 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = owner.applicationInfo.permission; 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_writePermission); 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = owner.applicationInfo.permission; 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.grantUriPermissions = sa.getBoolean( 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions, 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.multiprocess = sa.getBoolean( 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_multiprocess, 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.initOrder = sa.getInt( 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_initOrder, 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpname == null) { 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<provider> does not incude authorities attribute"; 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.authority = cpname.intern(); 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseProviderTags(res, parser, attrs, p, outError)) { 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseProviderTags(Resources res, 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider outInfo, String[] outError) 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("grant-uri-permission")) { 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission); 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher pa = null; 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = sa.getNonResourceString( 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path); 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL); 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix); 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX); 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern); 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pa != null) { 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.info.uriPermissionPatterns == null) { 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = new PatternMatcher[1]; 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns[0] = pa; 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = outInfo.info.uriPermissionPatterns.length; 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher[] newp = new PatternMatcher[N+1]; 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N); 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newp[N] = pa; 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = newp; 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.grantUriPermissions = true; 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 18969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 18979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <provider>: " 18989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName()); 18999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 19009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <provider>: " 19039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 19049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 19059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 19089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Service parseService(Package owner, Resources res, 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService); 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseServiceArgs == null) { 19171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = new ParseComponentArgs(owner, outError, 19181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_name, 19191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_label, 19201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_icon, 19211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 19221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_process, 19231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_enabled); 19241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.tag = "<service>"; 19251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 19261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 19271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.sa = sa; 19281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.flags = flags; 19291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 19301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Service s = new Service(mParseServiceArgs, new ServiceInfo()); 19311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported); 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = sa.getBoolean( 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported, false); 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = sa.getNonResourceString( 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_permission); 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = owner.applicationInfo.permission; 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = str.length() > 0 ? str.toString().intern() : null; 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceIntentInfo intent = new ServiceIntentInfo(s); 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) { 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.intents.add(intent); 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData, 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <service>: " 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName()); 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <service>: " 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = s.intents.size() > 0; 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s; 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseAllMetaData(Resources res, 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String tag, 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Component outInfo, String[] outError) 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under " + tag + ": " 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName()); 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under " + tag + ": " 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle parseMetaData(Resources res, 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle data, String[] outError) 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData); 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == null) { 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = new Bundle(); 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString( 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_name); 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:name attribute"; 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean success = true; 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_resource); 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && v.resourceId != 0) { 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Meta data ref " + name + ": " + v); 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.resourceId); 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = sa.peekValue( 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_value); 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Meta data " + name + ": " + v); 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null) { 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v.type == TypedValue.TYPE_STRING) { 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence cs = v.coerceToString(); 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putString(name, cs != null ? cs.toString() : null); 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) { 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putBoolean(name, v.data != 0); 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type >= TypedValue.TYPE_FIRST_INT 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && v.type <= TypedValue.TYPE_LAST_INT) { 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.data); 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_FLOAT) { 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putFloat(name, v.getFloat()); 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types"); 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types"; 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:value or android:resource attribute"; 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String ANDROID_RESOURCES 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = "http://schemas.android.com/apk/res/android"; 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseIntent(Resources res, 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentInfo outInfo, String[] outError, boolean isActivity) 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter); 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int priority = sa.getInt( 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0); 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) { 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Activity with priority > 0, forcing to 0 at " 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getPositionDescription()); 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project priority = 0; 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.setPriority(priority); 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_label); 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = sa.getResourceId( 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0); 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nodeName = parser.getName(); 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nodeName.equals("action")) { 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addAction(value); 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("category")) { 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addCategory(value); 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("data")) { 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData); 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = sa.getNonResourceString( 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_mimeType); 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataType(str); 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IntentFilter.MalformedMimeTypeException e) { 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = e.toString(); 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_scheme); 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataScheme(str); 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String host = sa.getNonResourceString( 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_host); 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String port = sa.getNonResourceString( 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_port); 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (host != null) { 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataAuthority(host, port); 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_path); 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL); 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_pathPrefix); 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX); 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_pathPattern); 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!RIGID_PARSER) { 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <intent-filter>: " + parser.getName()); 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <intent-filter>: " + parser.getName(); 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT); 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cats = ""; 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<String> it = outInfo.categoriesIterator(); 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it != null && it.hasNext()) { 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cats += " " + it.next(); 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Intent d=" + 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault + ", cat=" + cats); 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Package { 22299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String packageName; 22309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For now we only support one application per package. 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ApplicationInfo applicationInfo = new ApplicationInfo(); 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Permission> permissions = new ArrayList<Permission>(0); 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0); 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> activities = new ArrayList<Activity>(0); 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> receivers = new ArrayList<Activity>(0); 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Provider> providers = new ArrayList<Provider>(0); 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Service> services = new ArrayList<Service>(0); 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0); 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> requestedPermissions = new ArrayList<String>(); 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> usesLibraries = new ArrayList<String>(); 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] usesLibraryFiles = null; 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We store the application meta-data independently to avoid multiple unwanted references 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle mAppMetaData = null; 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22508d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima public final ArrayList<Integer> supportsDensityList = new ArrayList<Integer>(); 22518d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima public int[] supportsDensities = null; 22528d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima 22539189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima // If the application's window is expandable. 22549189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima public boolean expandable; 22559189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is a 3rd party app, this is the path of the zip file. 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mPath; 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version code declared for this package. 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mVersionCode; 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version name declared for this package. 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mVersionName; 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user id that this package wants to use. 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mSharedUserId; 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user label that this package wants to use. 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mSharedUserLabel; 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Signatures that were read from the package. 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Signature mSignatures[]; 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For use by package manager service for quick lookup of 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preferred up order. 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mPreferredOrder = 0; 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Additional data supplied by callers. 22799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object mExtras; 22809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications hardware preferences 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<ConfigurationInfo> configPreferences = 22859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ArrayList<ConfigurationInfo>(); 22869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Package(String _name) { 22889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = _name; 22899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.packageName = _name; 22909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.uid = -1; 22919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 22949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Package{" 22959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 22969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + packageName + "}"; 22979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Component<II extends IntentInfo> { 23019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Package owner; 23021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ArrayList<II> intents; 23031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ComponentName component; 23041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final String componentShortName; 23059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle metaData; 23069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Package _owner) { 23089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = _owner; 23091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = null; 23101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn component = null; 23111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = null; 23121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) { 23151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = args.owner; 23161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = new ArrayList<II>(0); 23171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn String name = args.sa.getNonResourceString(args.nameRes); 23181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (name == null) { 23191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn component = null; 23201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = null; 23211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not specify android:name"; 23221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 23231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.name 23261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn = buildClassName(owner.applicationInfo.packageName, name, args.outError); 23271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outInfo.name == null) { 23281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn component = null; 23291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = null; 23301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not have valid android:name"; 23311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 23321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn component = new ComponentName(owner.applicationInfo.packageName, 23351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.name); 23361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = component.flattenToShortString(); 23371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int iconVal = args.sa.getResourceId(args.iconRes, 0); 23391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (iconVal != 0) { 23401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.icon = iconVal; 23411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = null; 23421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedValue v = args.sa.peekValue(args.labelRes); 23451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 23461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = v.coerceToString(); 23471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.packageName = owner.packageName; 23501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParseComponentArgs args, final ComponentInfo outInfo) { 23531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn this(args, (PackageItemInfo)outInfo); 23541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.outError[0] != null) { 23551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 23561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23581d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.processRes != 0) { 23591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.processName = buildProcessName(owner.applicationInfo.packageName, 23601d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner.applicationInfo.processName, args.sa.getNonResourceString(args.processRes), 23611d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.flags, args.sepProcesses, args.outError); 23621d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23631d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.enabled = args.sa.getBoolean(args.enabledRes, true); 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Component<II> clone) { 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = clone.owner; 23681d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = clone.intents; 23691d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn component = clone.component; 23701d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = clone.componentShortName; 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project metaData = clone.metaData; 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Permission extends Component<IntentInfo> { 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionInfo info; 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean tree; 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup group; 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner) { 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionInfo(); 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner, PermissionInfo _info) { 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Permission{" 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class PermissionGroup extends Component<IntentInfo> { 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionGroupInfo info; 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner) { 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 24029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionGroupInfo(); 24039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner, PermissionGroupInfo _info) { 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "PermissionGroup{" 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static boolean copyNeeded(int flags, Package p, Bundle metaData) { 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (metaData != null || p.mAppMetaData != null)) { 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0 24239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && p.usesLibraryFiles != null) { 24249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 24259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24268d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0 24279189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima && p.supportsDensities != null) { 24289189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima return true; 24299189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima } 24309189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima if ((flags & PackageManager.GET_EXPANDABLE) != 0) { 24318d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima return true; 24328d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima } 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ApplicationInfo generateApplicationInfo(Package p, int flags) { 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p, null)) { 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.applicationInfo; 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copy so we can store the metadata/libraries safely 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = new ApplicationInfo(p.applicationInfo); 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0) { 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = p.mAppMetaData; 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) { 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.sharedLibraryFiles = p.usesLibraryFiles; 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24508d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0) { 24518d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima ai.supportsDensities = p.supportsDensities; 24528d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima } 24539189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima if ((flags & PackageManager.GET_EXPANDABLE) != 0) { 24549189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima ai.expandable = p.expandable; 24559189cabb0b6c6c28232fe6f412b7ba7a37352a6aMitsuru Oshima } 24569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 24579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionInfo generatePermissionInfo( 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission p, int flags) { 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = new PermissionInfo(p.info); 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionGroupInfo generatePermissionGroupInfo( 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup pg, int flags) { 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pg == null) return null; 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pg.info; 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info); 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.metaData = pg.metaData; 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pgi; 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Activity extends Component<ActivityIntentInfo> { 24821d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ActivityInfo info; 24839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Activity(final ParseComponentArgs args, final ActivityInfo _info) { 24851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 24861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 24871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 24889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Activity{" 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + component.flattenToString() + "}"; 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ActivityInfo generateActivityInfo(Activity a, 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) return null; 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, a.owner, a.metaData)) { 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a.info; 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo ai = new ActivityInfo(a.info); 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = a.metaData; 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.applicationInfo = generateApplicationInfo(a.owner, flags); 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Service extends Component<ServiceIntentInfo> { 25111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ServiceInfo info; 25129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Service(final ParseComponentArgs args, final ServiceInfo _info) { 25141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 25151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 25161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Service{" 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + component.flattenToString() + "}"; 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ServiceInfo generateServiceInfo(Service s, int flags) { 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) return null; 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, s.owner, s.metaData)) { 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s.info; 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = new ServiceInfo(s.info); 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.metaData = s.metaData; 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.applicationInfo = generateApplicationInfo(s.owner, flags); 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return si; 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Provider extends Component { 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ProviderInfo info; 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean syncable; 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Provider(final ParseComponentArgs args, final ProviderInfo _info) { 25431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 25441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 25451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project syncable = false; 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Provider(Provider existingProvider) { 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(existingProvider); 25519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.info = existingProvider.info; 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.syncable = existingProvider.syncable; 25539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Provider{" 25579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ProviderInfo generateProviderInfo(Provider p, 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p.owner, p.metaData) 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || p.info.uriPermissionPatterns == null)) { 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProviderInfo pi = new ProviderInfo(p.info); 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) { 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.uriPermissionPatterns = null; 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = generateApplicationInfo(p.owner, flags); 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Instrumentation extends Component { 25811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final InstrumentationInfo info; 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) { 25841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 25851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Instrumentation{" 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + component.flattenToString() + "}"; 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final InstrumentationInfo generateInstrumentationInfo( 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Instrumentation i, int flags) { 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == null) return null; 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i.info; 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = new InstrumentationInfo(i.info); 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ii.metaData = i.metaData; 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ii; 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class IntentInfo extends IntentFilter { 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasDefault; 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int labelRes; 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedLabel; 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int icon; 26119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ActivityIntentInfo extends IntentInfo { 26149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Activity activity; 26159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActivityIntentInfo(Activity _activity) { 26179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project activity = _activity; 26189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 26219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ActivityIntentInfo{" 26229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 26239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + activity.info.name + "}"; 26249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ServiceIntentInfo extends IntentInfo { 26289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Service service; 26299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ServiceIntentInfo(Service _service) { 26319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service = _service; 26329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 26359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ServiceIntentInfo{" 26369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 26379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + service.info.name + "}"; 26389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2641