PackageParser.java revision a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3d
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 */ 77a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn public static final PackageParser.NewPermissionInfo NEW_PERMISSIONS[] = new PackageParser.NewPermissionInfo[] { 78a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn new PackageParser.NewPermissionInfo(android.Manifest.permission.WRITE_SDCARD, 79a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn android.os.Build.VERSION_CODES.DONUT, 80a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn 0) 81a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn }; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String mArchiveSourcePath; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private String[] mSeparateProcesses; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mSdkVersion; 86851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn private String mSdkCodename; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int mParseError = PackageManager.INSTALL_SUCCEEDED; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final Object mSync = new Object(); 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static WeakReference<byte[]> mReadBuffer; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParsePackageItemArgs { 941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final Package owner; 951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] outError; 961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int nameRes; 971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int labelRes; 981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int iconRes; 991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn String tag; 1011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedArray sa; 1021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParsePackageItemArgs(Package _owner, String[] _outError, 1041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int _nameRes, int _labelRes, int _iconRes) { 1051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = _owner; 1061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outError = _outError; 1071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn nameRes = _nameRes; 1081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn labelRes = _labelRes; 1091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn iconRes = _iconRes; 1101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn static class ParseComponentArgs extends ParsePackageItemArgs { 1141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final String[] sepProcesses; 1151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int processRes; 1161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn final int enabledRes; 1171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int flags; 1181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ParseComponentArgs(Package _owner, String[] _outError, 1201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int _nameRes, int _labelRes, int _iconRes, 1211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn String[] _sepProcesses, int _processRes,int _enabledRes) { 1221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(_owner, _outError, _nameRes, _labelRes, _iconRes); 1231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn sepProcesses = _sepProcesses; 1241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn processRes = _processRes; 1251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn enabledRes = _enabledRes; 1261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 1281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParsePackageItemArgs mParseInstrumentationArgs; 1301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityArgs; 1311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseActivityAliasArgs; 1321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseServiceArgs; 1331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn private ParseComponentArgs mParseProviderArgs; 1341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** If set to true, we will only allow package files that exactly match 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the DTD. Otherwise, we try to get as much from the package as we 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * can without failing. This should normally be set to false, to 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * support extensions to the DTD in future versions. */ 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean RIGID_PARSER = false; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String TAG = "PackageParser"; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PackageParser(String archiveSourcePath) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = archiveSourcePath; 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSeparateProcesses(String[] procs) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSeparateProcesses = procs; 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 151851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn public void setSdkVersion(int sdkVersion, String codename) { 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mSdkVersion = sdkVersion; 153851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mSdkCodename = codename; 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final boolean isPackageFilename(String name) { 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return name.endsWith(".apk"); 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Generate and return the {@link PackageInfo} for a parsed package. 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param p the parsed package. 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param flags indicating which optional information is included. 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static PackageInfo generatePackageInfo(PackageParser.Package p, 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int gids[], int flags) { 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PackageInfo pi = new PackageInfo(); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.packageName = p.packageName; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionCode = p.mVersionCode; 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.versionName = p.mVersionName; 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserId = p.mSharedUserId; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.sharedUserLabel = p.mSharedUserLabel; 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = p.applicationInfo; 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_GIDS) != 0) { 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.gids = gids; 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_CONFIGURATIONS) != 0) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.configPreferences.size(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.configPreferences = new ConfigurationInfo[N]; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.configPreferences[i] = p.configPreferences.get(i); 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_ACTIVITIES) != 0) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.activities.size(); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.activities = new ActivityInfo[N]; 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.activities.get(i); 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.activities[i] = generateActivityInfo(p.activities.get(i), flags); 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_RECEIVERS) != 0) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.receivers.size(); 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.receivers = new ActivityInfo[N]; 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Activity activity = p.receivers.get(i); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (activity.info.enabled 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.receivers[i] = generateActivityInfo(p.receivers.get(i), flags); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SERVICES) != 0) { 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.services.size(); 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.services = new ServiceInfo[N]; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Service service = p.services.get(i); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (service.info.enabled 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.services[i] = generateServiceInfo(p.services.get(i), flags); 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PROVIDERS) != 0) { 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.providers.size(); 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.providers = new ProviderInfo[N]; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Provider provider = p.providers.get(i); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (provider.info.enabled 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || (flags&PackageManager.GET_DISABLED_COMPONENTS) != 0) { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.providers[i] = generateProviderInfo(p.providers.get(i), flags); 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_INSTRUMENTATION) != 0) { 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.instrumentation.size(); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation = new InstrumentationInfo[N]; 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.instrumentation[i] = generateInstrumentationInfo( 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.instrumentation.get(i), flags); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_PERMISSIONS) != 0) { 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.permissions.size(); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions = new PermissionInfo[N]; 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.permissions[i] = generatePermissionInfo(p.permissions.get(i), flags); 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project N = p.requestedPermissions.size(); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions = new String[N]; 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.requestedPermissions[i] = p.requestedPermissions.get(i); 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_SIGNATURES) != 0) { 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int N = p.mSignatures.length; 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (N > 0) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.signatures = new Signature[N]; 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(p.mSignatures, 0, pi.signatures, 0, N); 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Certificate[] loadCertificates(JarFile jarFile, JarEntry je, 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We must read the stream for the JarEntry to retrieve 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // its certificates. 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InputStream is = jarFile.getInputStream(je); 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (is.read(readBuffer, 0, readBuffer.length) != -1) { 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // not using 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is.close(); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return je != null ? je.getCertificates() : null; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + je.getName() + " in " 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarFile.getName(), e); 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int PARSE_IS_SYSTEM = 0x0001; 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int PARSE_CHATTY = 0x0002; 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int PARSE_MUST_BE_APK = 0x0004; 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static int PARSE_IGNORE_PROCESSES = 0x0008; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getParseError() { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mParseError; 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Package parsePackage(File sourceFile, String destFileName, 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DisplayMetrics metrics, int flags) { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_SUCCEEDED; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mArchiveSourcePath = sourceFile.getPath(); 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!sourceFile.isFile()) { 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Skipping dir: " + mArchiveSourcePath); 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isPackageFilename(sourceFile.getName()) 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (flags&PARSE_MUST_BE_APK) != 0) { 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) == 0) { 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We expect to have non-.apk files in the system dir, 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // so don't warn about them. 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Skipping non-package file: " + mArchiveSourcePath); 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NOT_APK; 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_CHATTY) != 0 && Config.LOGD) Log.d( 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Scanning package: " + mArchiveSourcePath); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean assetError = true; 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 332b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project int cookie = assmgr.addAssetPath(mArchiveSourcePath); 333b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if(cookie != 0) { 334b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assetError = false; 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Failed adding asset path:"+mArchiveSourcePath); 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to read AndroidManifest.xml of " 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + mArchiveSourcePath, e); 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if(assetError) { 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_MANIFEST; 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] errorText = new String[1]; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Package pkg = null; 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Exception errorException = null; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXXX todo: need to figure out correct configuration. 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res = new Resources(assmgr, metrics, null); 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg = parsePackage(res, parser, flags, errorText); 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project errorException = e; 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg == null) { 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (errorException != null) { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, mArchiveSourcePath, errorException); 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, mArchiveSourcePath + " (at " 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getPositionDescription() 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + "): " + errorText[0]); 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mParseError == PackageManager.INSTALL_SUCCEEDED) { 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser.close(); 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr.close(); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.applicationInfo.sourceDir = destFileName; 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.applicationInfo.publicSourceDir = destFileName; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean collectCertificates(Package pkg, int flags) { 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = null; 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WeakReference<byte[]> readBufferRef; 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] readBuffer = null; 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = mReadBuffer; 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBufferRef != null) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = null; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = readBufferRef.get(); 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (readBuffer == null) { 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer = new byte[8192]; 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBufferRef = new WeakReference<byte[]>(readBuffer); 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarFile jarFile = new JarFile(mArchiveSourcePath); 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] certs = null; 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this package comes from the system image, then we 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // can trust it... we'll just use the AndroidManifest.xml 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // to retrieve its signatures, not validating all of the 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // files. 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarEntry jarEntry = jarFile.getJarEntry("AndroidManifest.xml"); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = loadCertificates(jarFile, jarEntry, readBuffer); 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs == null) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + jarEntry.getName() + "; ignoring!"); 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + mArchiveSourcePath + ": entry=" + jarEntry 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " certs=" + (certs != null ? certs.length : 0)); 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null) { 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, " Public key: " 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + certs[i].getPublicKey().getEncoded() 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + certs[i].getPublicKey()); 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Enumeration entries = jarFile.entries(); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (entries.hasMoreElements()) { 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JarEntry je = (JarEntry)entries.nextElement(); 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.isDirectory()) continue; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (je.getName().startsWith("META-INF/")) continue; 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Certificate[] localCerts = loadCertificates(jarFile, je, 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project readBuffer); 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.i(TAG, "File " + mArchiveSourcePath + " entry " + je.getName() 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": certs=" + certs + " (" 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + (certs != null ? certs.length : 0) + ")"); 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (localCerts == null) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates at entry " 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (certs == null) { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs = localCerts; 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Ensure all certificates match. 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<certs.length; i++) { 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean found = false; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j=0; j<localCerts.length; j++) { 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs[i] != null && 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].equals(localCerts[j])) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project found = true; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!found || certs.length != localCerts.length) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has mismatched certificates at entry " 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + je.getName() + "; ignoring!"); 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jarFile.close(); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (mSync) { 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mReadBuffer = readBufferRef; 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (certs != null && certs.length > 0) { 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = certs.length; 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures = new Signature[certs.length]; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSignatures[i] = new Signature( 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project certs[i].getEncoded()); 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "Package " + pkg.packageName 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " has no certificates; ignoring!"); 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_NO_CERTIFICATES; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (CertificateEncodingException e) { 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (RuntimeException e) { 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Exception reading " + mArchiveSourcePath, e); 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static String parsePackageName(String packageFilePath, int flags) { 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlResourceParser parser = null; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AssetManager assmgr = null; 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assmgr = new AssetManager(); 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int cookie = assmgr.addAssetPath(packageFilePath); 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project parser = assmgr.openXmlResourceParser(cookie, "AndroidManifest.xml"); 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (Exception e) { 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unable to read AndroidManifest.xml of " 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + packageFilePath, e); 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String errors[] = new String[1]; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String packageName = null; 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = parsePackageName(parser, attrs, flags, errors); 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IOException e) { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, packageFilePath, e); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (XmlPullParserException e) { 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, packageFilePath, e); 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } finally { 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser != null) parser.close(); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (assmgr != null) assmgr.close(); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (packageName == null) { 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.e(TAG, "parsePackageName error: " + errors[0]); 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return packageName; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String validateName(String name, boolean requiresSeparator) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = name.length(); 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean hasSep = false; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean front = true; 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final char c = name.charAt(i); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) { 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = false; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!front) { 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((c >= '0' && c <= '9') || c == '_') { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasSep = true; 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project front = true; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "bad character '" + c + "'"; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hasSep || !requiresSeparator 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ? null : "must have at least one '.' separator"; 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String parsePackageName(XmlPullParser parser, 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs, int flags, String[] outError) 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws IOException, XmlPullParserException { 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.START_TAG 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && type != parser.END_DOCUMENT) { 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type != parser.START_TAG) { 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No start tag found"; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_CHATTY) != 0 && Config.LOGV) Log.v( 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TAG, "Root element name: '" + parser.getName() + "'"); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parser.getName().equals("manifest")) { 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No <manifest> tag"; 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = attrs.getAttributeValue(null, "package"); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null || pkgName.length() == 0) { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not specify package"; 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(pkgName, true); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad package name \"" 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkgName + "\": " + nameError; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkgName.intern(); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Temporary. 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static public Signature stringToSignature(String str) { 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = str.length(); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte[] sig = new byte[N]; 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<N; i++) { 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sig[i] = (byte)str.charAt(i); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new Signature(sig); 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Package parsePackage( 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Resources res, XmlResourceParser parser, int flags, String[] outError) 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AttributeSet attrs = parser; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = null; 6301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = null; 6311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = null; 6321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = null; 6331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String pkgName = parsePackageName(parser, attrs, flags, outError); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkgName == null) { 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME; 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final Package pkg = new Package(pkgName); 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean foundApp = false; 643851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionCode = sa.getInteger( 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_versionCode, 0); 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionName = sa.getNonResourceString( 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_versionName); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg.mVersionName != null) { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mVersionName = pkg.mVersionName.intern(); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = sa.getNonResourceString( 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_sharedUserId); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(str, true); 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"android".equals(pkgName)) { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> specifies bad sharedUserId name \"" 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + str + "\": " + nameError; 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID; 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserId = str.intern(); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.mSharedUserLabel = sa.getResourceId( 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifest_sharedUserLabel, 0); 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("application")) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (foundApp) { 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (RIGID_PARSER) { 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> has more than one <application>"; 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "<manifest> has more than one <application>"); 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project foundApp = true; 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseApplication(pkg, res, parser, attrs, flags, outError)) { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-group")) { 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionGroup(pkg, res, parser, attrs, outError) == null) { 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission")) { 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermission(pkg, res, parser, attrs, outError) == null) { 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("permission-tree")) { 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parsePermissionTree(pkg, res, parser, attrs, outError) == null) { 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-permission")) { 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission); 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString( 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesPermission_name); 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null && !pkg.requestedPermissions.contains(name)) { 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.requestedPermissions.add(name); 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-configuration")) { 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ConfigurationInfo cPref = new ConfigurationInfo(); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqTouchScreen = sa.getInt( 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqTouchScreen, 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.TOUCHSCREEN_UNDEFINED); 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqKeyboardType = sa.getInt( 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqKeyboardType, 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.KEYBOARD_UNDEFINED); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqHardKeyboard, 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_HARD_KEYBOARD; 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqNavigation = sa.getInt( 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqNavigation, 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Configuration.NAVIGATION_UNDEFINED); 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesConfiguration_reqFiveWayNav, 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cPref.reqInputFeatures |= ConfigurationInfo.INPUT_FEATURE_FIVE_WAY_NAV; 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.configPreferences.add(cPref); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else if (tagName.equals("uses-sdk")) { 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mSdkVersion > 0) { 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesSdk); 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 754851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int minVers = 0; 755851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String minCode = null; 756851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int targetVers = 0; 757851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn String targetCode = null; 758851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 759851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn TypedValue val = sa.peekValue( 760851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_minSdkVersion); 761851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 762851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 763851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 764851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 765851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 766851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn minVers = val.data; 767851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 768851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 769851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 770851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn val = sa.peekValue( 771851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_targetSdkVersion); 772851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val != null) { 773851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (val.type == TypedValue.TYPE_STRING && val.string != null) { 774851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetCode = minCode = val.string.toString(); 775851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 776851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If it's not a string, it's an integer. 777851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn targetVers = val.data; 778851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 779851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 780851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 781851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn int maxVers = sa.getInt( 782851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn com.android.internal.R.styleable.AndroidManifestUsesSdk_maxSdkVersion, 783851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mSdkVersion); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 787851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (targetCode != null) { 788851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (!targetCode.equals(mSdkCodename)) { 789851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (mSdkCodename != null) { 790851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 791851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " (current platform is " + mSdkCodename + ")"; 792851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } else { 793851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires development platform " + targetCode 794851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " but this is a release platform."; 795851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 796851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 797851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn return null; 798851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 799851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn // If the code matches, it definitely targets this SDK. 800a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion 801a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = android.os.Build.VERSION_CODES.CUR_DEVELOPMENT; 802a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } else { 803a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.applicationInfo.targetSdkVersion = targetVers; 804851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 805851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 806851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (minVers > mSdkVersion) { 807851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires newer sdk version #" + minVers 808851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " (current version is #" + mSdkVersion + ")"; 809851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 810851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn return null; 811851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 812851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 813851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn if (maxVers < mSdkVersion) { 814851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn outError[0] = "Requires older sdk version #" + maxVers 815851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn + " (current version is #" + mSdkVersion + ")"; 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_FAILED_OLDER_SDK; 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("instrumentation")) { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parseInstrumentation(pkg, res, parser, attrs, outError) == null) { 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("eat-comment")) { 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Just skip this tag 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (RIGID_PARSER) { 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <manifest>: " 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Bad element under <manifest>: " 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName()); 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!foundApp && pkg.instrumentation.size() == 0) { 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<manifest> does not contain an <application> or <instrumentation>"; 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_EMPTY; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final int NP = PackageParser.NEW_PERMISSIONS.length; 850a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn for (int ip=0; ip<NP; ip++) { 851a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn final PackageParser.NewPermissionInfo npi 852a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn = PackageParser.NEW_PERMISSIONS[ip]; 853a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (pkg.applicationInfo.targetSdkVersion >= npi.sdkVersion) { 854a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn break; 855a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 856a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn if (!pkg.requestedPermissions.contains(npi.name)) { 857a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn Log.i(TAG, "Impliciting adding " + npi.name + " to old pkg " 858a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn + pkg.packageName); 859a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn pkg.requestedPermissions.add(npi.name); 860a96cbb435d7b2197ab2b61fd98d14cbd6e0c5c3dDianne Hackborn } 861851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn } 862851a54143c15a1c33361efae2db3f7f45059b472Dianne Hackborn 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg.usesLibraries.size() > 0) { 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.usesLibraryFiles = new String[pkg.usesLibraries.size()]; 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pkg.usesLibraries.toArray(pkg.usesLibraryFiles); 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8688d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima int size = pkg.supportsDensityList.size(); 8698d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima if (size > 0) { 8708d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima int densities[] = pkg.supportsDensities = new int[size]; 8718d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima List<Integer> densityList = pkg.supportsDensityList; 8728d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima for (int i = 0; i < size; i++) { 8738d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima densities[i] = densityList.get(i); 8748d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima } 8758d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima } 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildClassName(String pkg, CharSequence clsSeq, 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (clsSeq == null || clsSeq.length() <= 0) { 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Empty class name in package " + pkg; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cls = clsSeq.toString(); 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = cls.charAt(0); 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c == '.') { 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + cls).intern(); 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cls.indexOf('.') < 0) { 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project StringBuilder b = new StringBuilder(pkg); 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append('.'); 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project b.append(cls); 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b.toString().intern(); 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c >= 'a' && c <= 'z') { 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cls.intern(); 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad class name " + cls + " in package " + pkg; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildCompoundName(String pkg, 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String type, String[] outError) { 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String proc = procSeq.toString(); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project char c = proc.charAt(0); 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pkg != null && c == ':') { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (proc.length() < 2) { 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad " + type + " name " + proc + " in package " + pkg 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + ": must be at least two characters"; 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String subName = proc.substring(1); 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(subName, false); 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null) { 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (pkg + proc).intern(); 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nameError = validateName(proc, true); 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nameError != null && !"system".equals(proc)) { 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Invalid " + type + " name " + proc + " in package " 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + pkg + ": " + nameError; 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return proc.intern(); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildProcessName(String pkg, String defProc, 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, int flags, String[] separateProcesses, 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError) { 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IGNORE_PROCESSES) != 0 && !"system".equals(procSeq)) { 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc != null ? defProc : pkg; 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (separateProcesses != null) { 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=separateProcesses.length-1; i>=0; i--) { 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String sp = separateProcesses[i]; 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sp.equals(pkg) || sp.equals(defProc) || sp.equals(procSeq)) { 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pkg; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null || procSeq.length() <= 0) { 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buildCompoundName(pkg, procSeq, "package", outError); 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static String buildTaskAffinityName(String pkg, String defProc, 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence procSeq, String[] outError) { 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq == null) { 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return defProc; 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (procSeq.length() <= 0) { 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return buildCompoundName(pkg, procSeq, "taskAffinity", outError); 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private PermissionGroup parsePermissionGroup(Package owner, Resources res, 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup perm = new PermissionGroup(owner); 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-group>", sa, 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_name, 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_label, 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_icon)) { 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionGroup_description, 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-group>", perm, 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissionGroups.add(perm); 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermission(Package owner, Resources res, 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission); 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission>", sa, 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_name, 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_label, 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_icon)) { 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 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 perm.info.group = sa.getNonResourceString( 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_permissionGroup); 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.group != null) { 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.group = perm.info.group.intern(); 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = sa.getResourceId( 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_description, 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = sa.getInt( 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermission_protectionLevel, 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo.PROTECTION_NORMAL); 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (perm.info.protectionLevel == -1) { 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission> does not specify protectionLevel"; 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission>", perm, 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.permissions.add(perm); 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Permission parsePermissionTree(Package owner, Resources res, 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission perm = new Permission(owner); 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree); 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, perm.info, outError, 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "<permission-tree>", sa, 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_name, 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_label, 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestPermissionTree_icon)) { 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 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 sa.recycle(); 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int index = perm.info.name.indexOf('.'); 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index > 0) { 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project index = perm.info.name.indexOf('.', index+1); 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (index < 0) { 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<permission-tree> name has less than three segments: " 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + perm.info.name; 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.descriptionRes = 0; 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.info.protectionLevel = PermissionInfo.PROTECTION_NORMAL; 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project perm.tree = true; 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<permission-tree>", perm, 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 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 owner.permissions.add(perm); 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return perm; 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Instrumentation parseInstrumentation(Package owner, Resources res, 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String[] outError) 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation); 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseInstrumentationArgs == null) { 11011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs = new ParsePackageItemArgs(owner, outError, 11021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_name, 11031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_label, 11041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestInstrumentation_icon); 11051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.tag = "<instrumentation>"; 11061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 11071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 11081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseInstrumentationArgs.sa = sa; 11091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 11101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Instrumentation a = new Instrumentation(mParseInstrumentationArgs, 11111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn new InstrumentationInfo()); 11121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_targetPackage); 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.targetPackage = str != null ? str.intern() : null; 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.handleProfiling = sa.getBoolean( 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_handleProfiling, 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.functionalTest = sa.getBoolean( 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestInstrumentation_functionalTest, 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a.info.targetPackage == null) { 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<instrumentation> does not specify targetPackage"; 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseAllMetaData(res, parser, attrs, "<instrumentation>", a, 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) { 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.instrumentation.add(a); 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseApplication(Package owner, Resources res, 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final ApplicationInfo ai = owner.applicationInfo; 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final String pkgName = owner.applicationInfo.packageName; 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication); 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString( 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_name); 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name != null) { 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.className = buildClassName(pkgName, name, outError); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (ai.className == null) { 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String manageSpaceActivity = sa.getNonResourceString( 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_manageSpaceActivity); 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (manageSpaceActivity != null) { 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.manageSpaceActivityName = buildClassName(pkgName, manageSpaceActivity, 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError); 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_label); 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (ai.labelRes=v.resourceId) == 0) { 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.nonLocalizedLabel = v.coerceToString(); 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.icon = sa.getResourceId( 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_icon, 0); 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.theme = sa.getResourceId( 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_theme, 0); 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.descriptionRes = sa.getResourceId( 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_description, 0); 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PARSE_IS_SYSTEM) != 0) { 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_persistent, 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_PERSISTENT; 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_debuggable, 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_DEBUGGABLE; 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_hasCode, 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_HAS_CODE; 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowTaskReparenting, 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING; 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_allowClearUserData, 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project true)) { 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.flags |= ApplicationInfo.FLAG_ALLOW_CLEAR_USER_DATA; 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1222ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn if (sa.getBoolean( 1223ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn com.android.internal.R.styleable.AndroidManifestApplication_testOnly, 1224e7fe35b88aa77766d322b8a683995a2bdae6210dDianne Hackborn false)) { 1225ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn ai.flags |= ApplicationInfo.FLAG_TEST_ONLY; 1226ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn } 1227ade3ecad94d1f4431576f53bae26c35efbf7a2c9Dianne Hackborn 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_permission); 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.permission = (str != null && str.length() > 0) ? str.intern() : null; 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_taskAffinity); 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.taskAffinity = buildTaskAffinityName(ai.packageName, ai.packageName, 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str, outError); 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] == null) { 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.processName = buildProcessName(ai.packageName, null, sa.getNonResourceString( 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestApplication_process), 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags, mSeparateProcesses, outError); 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.enabled = sa.getBoolean(com.android.internal.R.styleable.AndroidManifestApplication_enabled, true); 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int innerDepth = parser.getDepth(); 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > innerDepth)) { 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String tagName = parser.getName(); 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (tagName.equals("activity")) { 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity a = parseActivity(owner, res, parser, attrs, flags, outError, false); 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.activities.add(a); 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("receiver")) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity a = parseActivity(owner, res, parser, attrs, flags, outError, true); 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) { 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.receivers.add(a); 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("service")) { 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Service s = parseService(owner, res, parser, attrs, flags, outError); 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) { 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.services.add(s); 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("provider")) { 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider p = parseProvider(owner, res, parser, attrs, flags, outError); 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) { 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.providers.add(p); 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("activity-alias")) { 13001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = parseActivityAlias(owner, res, parser, attrs, flags, outError); 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 (parser.getName().equals("meta-data")) { 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // note: application meta-data is stored off to the side, so it can 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // remain null in the primary copy (we like to avoid extra copies because 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // it can be large) 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((owner.mAppMetaData = parseMetaData(res, parser, attrs, owner.mAppMetaData, 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (tagName.equals("uses-library")) { 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary); 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String lname = sa.getNonResourceString( 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestUsesLibrary_name); 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (lname != null && !owner.usesLibraries.contains(lname)) { 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.usesLibraries.add(lname); 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13338d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima } else if (tagName.equals("supports-density")) { 13348d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima sa = res.obtainAttributes(attrs, 13358d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima com.android.internal.R.styleable.AndroidManifestSupportsDensity); 13368d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima 13378d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima int density = sa.getInteger( 13388d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima com.android.internal.R.styleable.AndroidManifestSupportsDensity_density, -1); 13398d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima 13408d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima sa.recycle(); 13418d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima 13428d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima if (density != -1 && !owner.supportsDensityList.contains(density)) { 13438d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima owner.supportsDensityList.add(density); 13448d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima } 13458d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima 13468d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima XmlUtils.skipCurrentTag(parser); 13478d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <application>: " + tagName); 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <application>: " + tagName; 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mParseError = PackageManager.INSTALL_PARSE_FAILED_MANIFEST_MALFORMED; 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parsePackageItemInfo(Package owner, PackageItemInfo outInfo, 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String[] outError, String tag, TypedArray sa, 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nameRes, int labelRes, int iconRes) { 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString(nameRes); 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = tag + " does not specify android:name"; 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.name 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = buildClassName(owner.applicationInfo.packageName, name, outError); 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.name == null) { 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iconVal = sa.getResourceId(iconRes, 0); 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iconVal != 0) { 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = iconVal; 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = null; 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue(labelRes); 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.packageName = owner.packageName; 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseComponentInfo(Package owner, int flags, 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ComponentInfo outInfo, String[] outError, String tag, TypedArray sa, 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nameRes, int labelRes, int iconRes, int processRes, 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int enabledRes) { 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parsePackageItemInfo(owner, outInfo, outError, tag, sa, 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project nameRes, labelRes, iconRes)) { 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (processRes != 0) { 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.processName = buildProcessName(owner.applicationInfo.packageName, 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.applicationInfo.processName, sa.getNonResourceString(processRes), 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project flags, mSeparateProcesses, outError); 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.enabled = sa.getBoolean(enabledRes, true); 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return outError[0] == null; 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivity(Package owner, Resources res, 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError, 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean receiver) throws XmlPullParserException, IOException { 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity); 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityArgs == null) { 14221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs = new ParseComponentArgs(owner, outError, 14231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_name, 14241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_label, 14251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_icon, 14261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 14271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_process, 14281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivity_enabled); 14291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 14301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 14311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.tag = receiver ? "<receiver>" : "<activity>"; 14321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.sa = sa; 14331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityArgs.flags = flags; 14341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 14351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityArgs, new ActivityInfo()); 14361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported); 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_exported, false); 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.theme = sa.getResourceId( 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_theme, 0); 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_permission); 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = owner.applicationInfo.permission; 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_taskAffinity); 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.taskAffinity = buildTaskAffinityName(owner.applicationInfo.packageName, 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner.applicationInfo.taskAffinity, str, outError); 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags = 0; 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_multiprocess, 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_MULTIPROCESS; 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_finishOnTaskLaunch, 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_FINISH_ON_TASK_LAUNCH; 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_clearTaskOnLaunch, 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH; 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 14859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_noHistory, 14869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 14879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_NO_HISTORY; 14889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 14919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_alwaysRetainTaskState, 14929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 14939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALWAYS_RETAIN_TASK_STATE; 14949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 14979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_stateNotNeeded, 14989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 14999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_STATE_NOT_NEEDED; 15009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_excludeFromRecents, 15049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false)) { 15059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS; 15069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sa.getBoolean( 15099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_allowTaskReparenting, 15109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (owner.applicationInfo.flags&ApplicationInfo.FLAG_ALLOW_TASK_REPARENTING) != 0)) { 15119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.flags |= ActivityInfo.FLAG_ALLOW_TASK_REPARENTING; 15129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!receiver) { 15159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = sa.getInt( 15169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_launchMode, 15179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.LAUNCH_MULTIPLE); 15189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.screenOrientation = sa.getInt( 15199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_screenOrientation, 15209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 15219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = sa.getInt( 15229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_configChanges, 15239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 15249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.softInputMode = sa.getInt( 15259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivity_windowSoftInputMode, 15269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 15279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.launchMode = ActivityInfo.LAUNCH_MULTIPLE; 15299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.configChanges = 0; 15309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 15339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 15359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 15399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 15409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 15419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 15429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 15439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 15449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 15459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 15489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 15499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, !receiver)) { 15509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 15539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Intent filter for activity " + intent 15549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " defines no actions"); 15559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 15579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 15599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 15609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 15619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 15659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 15669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 15679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <receiver>: " + parser.getName()); 15689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <activity>: " + parser.getName()); 15709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 15729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 15739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (receiver) { 15759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <receiver>: " + parser.getName(); 15769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <activity>: " + parser.getName(); 15789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 15809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 15849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 15859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 15889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 15899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Activity parseActivityAlias(Package owner, Resources res, 15911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 15921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn throws XmlPullParserException, IOException { 15939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 15949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias); 15959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 15969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String targetActivity = sa.getNonResourceString( 15979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_targetActivity); 15989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 15999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> does not specify android:targetActivity"; 16009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity = buildClassName(owner.applicationInfo.packageName, 16059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project targetActivity, outError); 16069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity == null) { 16079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseActivityAliasArgs == null) { 16121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs = new ParseComponentArgs(owner, outError, 16131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_name, 16141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_label, 16151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_icon, 16161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 16171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 0, 16181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestActivityAlias_enabled); 16191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.tag = "<activity-alias>"; 16201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 16211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 16221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.sa = sa; 16231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseActivityAliasArgs.flags = flags; 16241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 16259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity target = null; 16269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int NA = owner.activities.size(); 16289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i=0; i<NA; i++) { 16299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Activity t = owner.activities.get(i); 16309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (targetActivity.equals(t.info.name)) { 16319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target = t; 16329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 16339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == null) { 16379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<activity-alias> target activity " + targetActivity 16389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " not found in manifest"; 16399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn ActivityInfo info = new ActivityInfo(); 16441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.targetActivity = targetActivity; 16451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.configChanges = target.info.configChanges; 16461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.flags = target.info.flags; 16471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.icon = target.info.icon; 16481d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.labelRes = target.info.labelRes; 16491d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.nonLocalizedLabel = target.info.nonLocalizedLabel; 16501d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.launchMode = target.info.launchMode; 16511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.processName = target.info.processName; 16521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.screenOrientation = target.info.screenOrientation; 16531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.taskAffinity = target.info.taskAffinity; 16541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.theme = target.info.theme; 16551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 16561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Activity a = new Activity(mParseActivityAliasArgs, info); 16571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 16589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 16639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported); 16649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 16659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = sa.getBoolean( 16669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_exported, false); 16679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str; 16709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 16719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestActivityAlias_permission); 16729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 16739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.permission = str.length() > 0 ? str.toString().intern() : null; 16749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 16779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outError[0] != null) { 16799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 16839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 16849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 16859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 16869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 16879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 16889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 16899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 16919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 16929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityIntentInfo intent = new ActivityIntentInfo(a); 16939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, true)) { 16949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 16959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 16969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (intent.countActions() == 0) { 16979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Intent filter for activity alias " + intent 16989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " defines no actions"); 16999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.intents.add(intent); 17019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 17039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((a.metaData=parseMetaData(res, parser, attrs, a.metaData, 17049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 17059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 17099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 17109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <activity-alias>: " + parser.getName()); 17119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 17129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 17139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <activity-alias>: " + parser.getName(); 17159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 17209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project a.info.exported = a.intents.size() > 0; 17219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a; 17249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Provider parseProvider(Package owner, Resources res, 17279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 17289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 17299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 17309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider); 17319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseProviderArgs == null) { 17331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs = new ParseComponentArgs(owner, outError, 17341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_name, 17351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_label, 17361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_icon, 17371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 17381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_process, 17391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestProvider_enabled); 17401d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.tag = "<provider>"; 17411d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 17421d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 17431d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.sa = sa; 17441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseProviderArgs.flags = flags; 17451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 17461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Provider p = new Provider(mParseProviderArgs, new ProviderInfo()); 17471d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 17489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 17499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 17509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.exported = sa.getBoolean( 17539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_exported, true); 17549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cpname = sa.getNonResourceString( 17569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_authorities); 17579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.isSyncable = sa.getBoolean( 17599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_syncable, 17609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 17619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String permission = sa.getNonResourceString( 17639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_permission); 17649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = sa.getNonResourceString( 17659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_readPermission); 17669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 17679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 17689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 17709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = owner.applicationInfo.permission; 17719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.readPermission = 17739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 17749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 17769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_writePermission); 17779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 17789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = permission; 17799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 17819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = owner.applicationInfo.permission; 17829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 17839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.writePermission = 17849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str.length() > 0 ? str.toString().intern() : null; 17859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 17869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.grantUriPermissions = sa.getBoolean( 17889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_grantUriPermissions, 17899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 17909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.multiprocess = sa.getBoolean( 17929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_multiprocess, 17939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project false); 17949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.initOrder = sa.getInt( 17969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestProvider_initOrder, 17979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 0); 17989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 18009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cpname == null) { 18029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<provider> does not incude authorities attribute"; 18039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project p.info.authority = cpname.intern(); 18069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseProviderTags(res, parser, attrs, p, outError)) { 18089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 18099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p; 18129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseProviderTags(Resources res, 18159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 18169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Provider outInfo, String[] outError) 18179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 18189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 18199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 18209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 18219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 18229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 18239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 18249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 18259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 18289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 18299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 18309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("grant-uri-permission")) { 18339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 18349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission); 18359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher pa = null; 18379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = sa.getNonResourceString( 18399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission_path); 18409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 18419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_LITERAL); 18429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 18459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPrefix); 18469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 18479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_PREFIX); 18489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 18519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestGrantUriPermission_pathPattern); 18529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 18539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pa = new PatternMatcher(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 18549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 18579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pa != null) { 18599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (outInfo.info.uriPermissionPatterns == null) { 18609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = new PatternMatcher[1]; 18619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns[0] = pa; 18629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final int N = outInfo.info.uriPermissionPatterns.length; 18649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PatternMatcher[] newp = new PatternMatcher[N+1]; 18659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(outInfo.info.uriPermissionPatterns, 0, newp, 0, N); 18669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project newp[N] = pa; 18679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.uriPermissionPatterns = newp; 18689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.info.grantUriPermissions = true; 18709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 18729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 18749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 18759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 18769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <provider>: " 18779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName()); 18789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 18799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 18809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <provider>: " 18829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 18839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 18849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 18879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 18889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Service parseService(Package owner, Resources res, 18909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, String[] outError) 18919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 18929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 18939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService); 18949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 18951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (mParseServiceArgs == null) { 18961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs = new ParseComponentArgs(owner, outError, 18971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_name, 18981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_label, 18991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_icon, 19001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mSeparateProcesses, 19011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_process, 19021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn com.android.internal.R.styleable.AndroidManifestService_enabled); 19031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.tag = "<service>"; 19041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 19051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 19061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.sa = sa; 19071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn mParseServiceArgs.flags = flags; 19081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 19091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn Service s = new Service(mParseServiceArgs, new ServiceInfo()); 19101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outError[0] != null) { 19119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project final boolean setExported = sa.hasValue( 19169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported); 19179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (setExported) { 19189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = sa.getBoolean( 19199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_exported, false); 19209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = sa.getNonResourceString( 19239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestService_permission); 19249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str == null) { 19259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = owner.applicationInfo.permission; 19269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.permission = str.length() > 0 ? str.toString().intern() : null; 19289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 19319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 19339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 19349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 19359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 19369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 19379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 19389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("intent-filter")) { 19429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceIntentInfo intent = new ServiceIntentInfo(s); 19439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!parseIntent(res, parser, attrs, flags, intent, outError, false)) { 19449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.intents.add(intent); 19489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (parser.getName().equals("meta-data")) { 19499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((s.metaData=parseMetaData(res, parser, attrs, s.metaData, 19509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError)) == null) { 19519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 19559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 19569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <service>: " 19579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName()); 19589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 19599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <service>: " 19629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 19639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 19649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!setExported) { 19689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project s.info.exported = s.intents.size() > 0; 19699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s; 19729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseAllMetaData(Resources res, 19759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, String tag, 19769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Component outInfo, String[] outError) 19779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 19789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 19799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 19809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != XmlPullParser.END_DOCUMENT 19819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != XmlPullParser.END_TAG 19829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || parser.getDepth() > outerDepth)) { 19839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == XmlPullParser.END_TAG || type == XmlPullParser.TEXT) { 19849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 19879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (parser.getName().equals("meta-data")) { 19889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((outInfo.metaData=parseMetaData(res, parser, attrs, 19899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.metaData, outError)) == null) { 19909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 19919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 19929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 19939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 19949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 19959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under " + tag + ": " 19969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName()); 19979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 19989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 19999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under " + tag + ": " 20019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getName(); 20029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 20039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 20069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private Bundle parseMetaData(Resources res, 20099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, 20109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Bundle data, String[] outError) 20119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 20129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 20149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData); 20159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == null) { 20179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = new Bundle(); 20189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String name = sa.getNonResourceString( 20219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_name); 20229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (name == null) { 20239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:name attribute"; 20249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 20269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean success = true; 20299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 20319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_resource); 20329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && v.resourceId != 0) { 20339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Meta data ref " + name + ": " + v); 20349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.resourceId); 20359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project v = sa.peekValue( 20379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestMetaData_value); 20389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //Log.i(TAG, "Meta data " + name + ": " + v); 20399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null) { 20409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v.type == TypedValue.TYPE_STRING) { 20419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project CharSequence cs = v.coerceToString(); 20429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putString(name, cs != null ? cs.toString() : null); 20439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_INT_BOOLEAN) { 20449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putBoolean(name, v.data != 0); 20459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type >= TypedValue.TYPE_FIRST_INT 20469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && v.type <= TypedValue.TYPE_LAST_INT) { 20479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putInt(name, v.data); 20489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (v.type == TypedValue.TYPE_FLOAT) { 20499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data.putFloat(name, v.getFloat()); 20509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!RIGID_PARSER) { 20529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 20539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "<meta-data> only supports string, integer, float, color, boolean, and resource reference types"); 20549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> only supports string, integer, float, color, boolean, and resource reference types"; 20569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 20579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 20609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "<meta-data> requires an android:value or android:resource attribute"; 20619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data = null; 20629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 20669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 20689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return data; 20709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static final String ANDROID_RESOURCES 20739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project = "http://schemas.android.com/apk/res/android"; 20749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean parseIntent(Resources res, 20769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlPullParser parser, AttributeSet attrs, int flags, 20779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IntentInfo outInfo, String[] outError, boolean isActivity) 20789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throws XmlPullParserException, IOException { 20799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedArray sa = res.obtainAttributes(attrs, 20819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter); 20829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int priority = sa.getInt( 20849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_priority, 0); 20859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (priority > 0 && isActivity && (flags&PARSE_IS_SYSTEM) == 0) { 20869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Activity with priority > 0, forcing to 0 at " 20879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + parser.getPositionDescription()); 20889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project priority = 0; 20899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.setPriority(priority); 20919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project TypedValue v = sa.peekValue( 20939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_label); 20949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 20959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.nonLocalizedLabel = v.coerceToString(); 20969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 20979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.icon = sa.getResourceId( 20999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestIntentFilter_icon, 0); 21009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int outerDepth = parser.getDepth(); 21049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int type; 21059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while ((type=parser.next()) != parser.END_DOCUMENT 21069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (type != parser.END_TAG || parser.getDepth() > outerDepth)) { 21079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (type == parser.END_TAG || type == parser.TEXT) { 21089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project continue; 21099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String nodeName = parser.getName(); 21129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (nodeName.equals("action")) { 21139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 21149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 21159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 21169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 21179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 21189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 21209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addAction(value); 21229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("category")) { 21239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String value = attrs.getAttributeValue( 21249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ANDROID_RESOURCES, "name"); 21259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (value == null || value == "") { 21269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "No value supplied for <android:name>"; 21279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 21289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 21309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addCategory(value); 21329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (nodeName.equals("data")) { 21349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = res.obtainAttributes(attrs, 21359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData); 21369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String str = sa.getNonResourceString( 21389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_mimeType); 21399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 21419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataType(str); 21429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IntentFilter.MalformedMimeTypeException e) { 21439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = e.toString(); 21449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 21469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 21509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_scheme); 21519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataScheme(str); 21539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String host = sa.getNonResourceString( 21569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_host); 21579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String port = sa.getNonResourceString( 21589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_port); 21599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (host != null) { 21609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataAuthority(host, port); 21619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 21649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_path); 21659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_LITERAL); 21679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 21709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_pathPrefix); 21719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_PREFIX); 21739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project str = sa.getNonResourceString( 21769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project com.android.internal.R.styleable.AndroidManifestData_pathPattern); 21779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (str != null) { 21789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.addDataPath(str, PatternMatcher.PATTERN_SIMPLE_GLOB); 21799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa.recycle(); 21829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 21839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!RIGID_PARSER) { 21849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Problem in package " + mArchiveSourcePath + ":"); 21859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Log.w(TAG, "Unknown element under <intent-filter>: " + parser.getName()); 21869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project XmlUtils.skipCurrentTag(parser); 21879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 21889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outError[0] = "Bad element under <intent-filter>: " + parser.getName(); 21899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 21909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 21929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault = outInfo.hasCategory(Intent.CATEGORY_DEFAULT); 21949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (false) { 21959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project String cats = ""; 21969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Iterator<String> it = outInfo.categoriesIterator(); 21979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project while (it != null && it.hasNext()) { 21989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project cats += " " + it.next(); 21999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.out.println("Intent d=" + 22019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project outInfo.hasDefault + ", cat=" + cats); 22029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 22059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Package { 22089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final String packageName; 22099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For now we only support one application per package. 22119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ApplicationInfo applicationInfo = new ApplicationInfo(); 22129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Permission> permissions = new ArrayList<Permission>(0); 22149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<PermissionGroup> permissionGroups = new ArrayList<PermissionGroup>(0); 22159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> activities = new ArrayList<Activity>(0); 22169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Activity> receivers = new ArrayList<Activity>(0); 22179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Provider> providers = new ArrayList<Provider>(0); 22189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Service> services = new ArrayList<Service>(0); 22199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<Instrumentation> instrumentation = new ArrayList<Instrumentation>(0); 22209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> requestedPermissions = new ArrayList<String>(); 22229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<String> usesLibraries = new ArrayList<String>(); 22249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String[] usesLibraryFiles = null; 22259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // We store the application meta-data independently to avoid multiple unwanted references 22279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle mAppMetaData = null; 22289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22298d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima public final ArrayList<Integer> supportsDensityList = new ArrayList<Integer>(); 22308d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima public int[] supportsDensities = null; 22318d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima 22329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // If this is a 3rd party app, this is the path of the zip file. 22339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mPath; 22349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version code declared for this package. 22369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mVersionCode; 22379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The version name declared for this package. 22399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mVersionName; 22409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user id that this package wants to use. 22429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String mSharedUserId; 22439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The shared user label that this package wants to use. 22459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mSharedUserLabel; 22469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Signatures that were read from the package. 22489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Signature mSignatures[]; 22499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For use by package manager service for quick lookup of 22519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // preferred up order. 22529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int mPreferredOrder = 0; 22539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Additional data supplied by callers. 22559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object mExtras; 22569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 22589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Applications hardware preferences 22599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 22609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ArrayList<ConfigurationInfo> configPreferences = 22619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project new ArrayList<ConfigurationInfo>(); 22629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Package(String _name) { 22649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project packageName = _name; 22659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.packageName = _name; 22669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project applicationInfo.uid = -1; 22679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 22709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Package{" 22719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 22729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + packageName + "}"; 22739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 22759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class Component<II extends IntentInfo> { 22779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Package owner; 22781d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ArrayList<II> intents; 22791d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ComponentName component; 22801d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final String componentShortName; 22819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Bundle metaData; 22829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 22839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Package _owner) { 22849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = _owner; 22851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = null; 22861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn component = null; 22871d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = null; 22881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 22891d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 22901d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParsePackageItemArgs args, final PackageItemInfo outInfo) { 22911d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner = args.owner; 22921d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = new ArrayList<II>(0); 22931d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn String name = args.sa.getNonResourceString(args.nameRes); 22941d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (name == null) { 22951d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn component = null; 22961d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = null; 22971d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not specify android:name"; 22981d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 22991d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23001d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23011d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.name 23021d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn = buildClassName(owner.applicationInfo.packageName, name, args.outError); 23031d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (outInfo.name == null) { 23041d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn component = null; 23051d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = null; 23061d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.outError[0] = args.tag + " does not have valid android:name"; 23071d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 23081d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23091d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23101d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn component = new ComponentName(owner.applicationInfo.packageName, 23111d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.name); 23121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = component.flattenToShortString(); 23131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn int iconVal = args.sa.getResourceId(args.iconRes, 0); 23151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (iconVal != 0) { 23161d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.icon = iconVal; 23171d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = null; 23181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23191d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23201d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn TypedValue v = args.sa.peekValue(args.labelRes); 23211d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (v != null && (outInfo.labelRes=v.resourceId) == 0) { 23221d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.nonLocalizedLabel = v.coerceToString(); 23231d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23241d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23251d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.packageName = owner.packageName; 23261d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23271d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23281d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Component(final ParseComponentArgs args, final ComponentInfo outInfo) { 23291d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn this(args, (PackageItemInfo)outInfo); 23301d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.outError[0] != null) { 23311d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn return; 23321d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23331d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 23341d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn if (args.processRes != 0) { 23351d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.processName = buildProcessName(owner.applicationInfo.packageName, 23361d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn owner.applicationInfo.processName, args.sa.getNonResourceString(args.processRes), 23371d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn args.flags, args.sepProcesses, args.outError); 23381d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn } 23391d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn outInfo.enabled = args.sa.getBoolean(args.enabledRes, true); 23409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Component(Component<II> clone) { 23439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project owner = clone.owner; 23441d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn intents = clone.intents; 23451d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn component = clone.component; 23461d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn componentShortName = clone.componentShortName; 23479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project metaData = clone.metaData; 23489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Permission extends Component<IntentInfo> { 23529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionInfo info; 23539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean tree; 23549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup group; 23559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner) { 23579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 23589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionInfo(); 23599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Permission(Package _owner, PermissionInfo _info) { 23629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 23639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 23649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 23679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Permission{" 23689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 23699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 23709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class PermissionGroup extends Component<IntentInfo> { 23749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final PermissionGroupInfo info; 23759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner) { 23779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 23789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = new PermissionGroupInfo(); 23799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public PermissionGroup(Package _owner, PermissionGroupInfo _info) { 23829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(_owner); 23839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project info = _info; 23849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 23879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "PermissionGroup{" 23889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 23899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 23909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 23939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static boolean copyNeeded(int flags, Package p, Bundle metaData) { 23949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0 23959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && (metaData != null || p.mAppMetaData != null)) { 23969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 23979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 23989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0 23999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && p.usesLibraryFiles != null) { 24009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 24019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24028d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0 24038d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima && p.supportsDensities != null) { 24048d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima return true; 24058d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima } 24069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 24079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static ApplicationInfo generateApplicationInfo(Package p, int flags) { 24109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 24119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p, null)) { 24129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.applicationInfo; 24139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copy so we can store the metadata/libraries safely 24169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ApplicationInfo ai = new ApplicationInfo(p.applicationInfo); 24179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_META_DATA) != 0) { 24189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = p.mAppMetaData; 24199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_SHARED_LIBRARY_FILES) != 0) { 24219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.sharedLibraryFiles = p.usesLibraryFiles; 24229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24238d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima if ((flags & PackageManager.GET_SUPPORTS_DENSITIES) != 0) { 24248d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima ai.supportsDensities = p.supportsDensities; 24258d112675879a2b83197d3b4ae4fb623abd1a1ec3Mitsuru Oshima } 24269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 24279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionInfo generatePermissionInfo( 24309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Permission p, int flags) { 24319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 24329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 24339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 24349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionInfo pi = new PermissionInfo(p.info); 24369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 24379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 24389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final PermissionGroupInfo generatePermissionGroupInfo( 24419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroup pg, int flags) { 24429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pg == null) return null; 24439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 24449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pg.info; 24459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project PermissionGroupInfo pgi = new PermissionGroupInfo(pg.info); 24479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pgi.metaData = pg.metaData; 24489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pgi; 24499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Activity extends Component<ActivityIntentInfo> { 24521d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ActivityInfo info; 24539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Activity(final ParseComponentArgs args, final ActivityInfo _info) { 24551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 24561d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 24571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 24589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24591d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 24609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 24619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Activity{" 24629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 24639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + component.flattenToString() + "}"; 24649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ActivityInfo generateActivityInfo(Activity a, 24689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 24699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (a == null) return null; 24709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, a.owner, a.metaData)) { 24719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return a.info; 24729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 24749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ActivityInfo ai = new ActivityInfo(a.info); 24759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.metaData = a.metaData; 24769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ai.applicationInfo = generateApplicationInfo(a.owner, flags); 24779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ai; 24789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Service extends Component<ServiceIntentInfo> { 24811d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final ServiceInfo info; 24829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24831d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Service(final ParseComponentArgs args, final ServiceInfo _info) { 24841d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 24851d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 24861d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 24879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24881d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 24899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 24909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Service{" 24919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 24929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + component.flattenToString() + "}"; 24939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 24959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 24969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ServiceInfo generateServiceInfo(Service s, int flags) { 24979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (s == null) return null; 24989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, s.owner, s.metaData)) { 24999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return s.info; 25009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 25029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ServiceInfo si = new ServiceInfo(s.info); 25039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.metaData = s.metaData; 25049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project si.applicationInfo = generateApplicationInfo(s.owner, flags); 25059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return si; 25069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Provider extends Component { 25099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final ProviderInfo info; 25109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean syncable; 25119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25121d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Provider(final ParseComponentArgs args, final ProviderInfo _info) { 25131d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 25141d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 25151d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info.applicationInfo = args.owner.applicationInfo; 25169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project syncable = false; 25179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25181d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 25199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Provider(Provider existingProvider) { 25209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(existingProvider); 25219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.info = existingProvider.info; 25229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.syncable = existingProvider.syncable; 25239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 25269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Provider{" 25279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 25289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + info.name + "}"; 25299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final ProviderInfo generateProviderInfo(Provider p, 25339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int flags) { 25349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (p == null) return null; 25359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!copyNeeded(flags, p.owner, p.metaData) 25369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) != 0 25379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || p.info.uriPermissionPatterns == null)) { 25389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return p.info; 25399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Make shallow copies so we can store the metadata safely 25419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ProviderInfo pi = new ProviderInfo(p.info); 25429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.metaData = p.metaData; 25439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags & PackageManager.GET_URI_PERMISSION_PATTERNS) == 0) { 25449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.uriPermissionPatterns = null; 25459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pi.applicationInfo = generateApplicationInfo(p.owner, flags); 25479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return pi; 25489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class Instrumentation extends Component { 25511d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public final InstrumentationInfo info; 25529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25531d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn public Instrumentation(final ParsePackageItemArgs args, final InstrumentationInfo _info) { 25541d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn super(args, _info); 25551d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn info = _info; 25569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25571d442e0d990b581357f33f5463c7c5cb49b551e8Dianne Hackborn 25589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 25599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "Instrumentation{" 25609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 25619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + component.flattenToString() + "}"; 25629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static final InstrumentationInfo generateInstrumentationInfo( 25669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Instrumentation i, int flags) { 25679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (i == null) return null; 25689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((flags&PackageManager.GET_META_DATA) == 0) { 25699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return i.info; 25709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project InstrumentationInfo ii = new InstrumentationInfo(i.info); 25729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ii.metaData = i.metaData; 25739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ii; 25749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public static class IntentInfo extends IntentFilter { 25779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean hasDefault; 25789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int labelRes; 25799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public CharSequence nonLocalizedLabel; 25809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int icon; 25819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ActivityIntentInfo extends IntentInfo { 25849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Activity activity; 25859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ActivityIntentInfo(Activity _activity) { 25879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project activity = _activity; 25889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 25919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ActivityIntentInfo{" 25929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 25939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + activity.info.name + "}"; 25949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 25969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final static class ServiceIntentInfo extends IntentInfo { 25989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Service service; 25999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ServiceIntentInfo(Service _service) { 26019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project service = _service; 26029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 26049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public String toString() { 26059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return "ServiceIntentInfo{" 26069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + Integer.toHexString(System.identityHashCode(this)) 26079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project + " " + service.info.name + "}"; 26089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 26109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2611