From 090c6b1c94f75fb0d2193354ca453d528da0fa99 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Thu, 28 Dec 2017 12:03:28 +0900 Subject: [PATCH] Allow apps in /odm/app and /odm/priv-app /odm is a vendor partition other than /vendor. Both partitions are for HW-specific modules such as HALs. The difference is that /odm is owned by ODM (usually device manufacturer which designs the board), whereas /vendor is owned by SoC manufacturer. In other words, /odm partition is for board-specific customization to the /vendor partition. Since apps can exist in /vendor/app and /vendor/priv-app, the same has to be supported for /odm partition. Bug: 71366495 Test: m -j Teet: cd frameworks/base/tests/OdmApps; atest . Change-Id: I1ec8b22b080efdefd67a45ce9c7aeaa2aef350e0 --- .../java/com/android/server/SystemConfig.java | 9 +++-- .../server/pm/PackageManagerService.java | 38 ++++++++++++++++++- tests/OdmApps/Android.mk | 26 +++++++++++++ tests/OdmApps/AndroidTest.xml | 27 +++++++++++++ tests/OdmApps/app/Android.mk | 22 +++++++++++ tests/OdmApps/app/AndroidManifest.xml | 21 ++++++++++ tests/OdmApps/priv-app/Android.mk | 22 +++++++++++ tests/OdmApps/priv-app/AndroidManifest.xml | 21 ++++++++++ .../com/android/test/odm/app/OdmAppsTest.java | 35 +++++++++++++++++ 9 files changed, 216 insertions(+), 5 deletions(-) create mode 100644 tests/OdmApps/Android.mk create mode 100644 tests/OdmApps/AndroidTest.xml create mode 100644 tests/OdmApps/app/Android.mk create mode 100755 tests/OdmApps/app/AndroidManifest.xml create mode 100644 tests/OdmApps/priv-app/Android.mk create mode 100755 tests/OdmApps/priv-app/AndroidManifest.xml create mode 100644 tests/OdmApps/src/com/android/test/odm/app/OdmAppsTest.java diff --git a/core/java/com/android/server/SystemConfig.java b/core/java/com/android/server/SystemConfig.java index 8b1de2fb886e1..9d4b5aa9fc732 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/core/java/com/android/server/SystemConfig.java @@ -284,8 +284,9 @@ public class SystemConfig { readPermissions(Environment.buildPath( Environment.getVendorDirectory(), "etc", "permissions"), vendorPermissionFlag); - // Allow ODM to customize system configs around libs, features and apps - int odmPermissionFlag = ALLOW_LIBS | ALLOW_FEATURES | ALLOW_APP_CONFIGS; + // Allow ODM to customize system configs as much as Vendor, because /odm is another + // vendor partition other than /vendor. + int odmPermissionFlag = vendorPermissionFlag; readPermissions(Environment.buildPath( Environment.getOdmDirectory(), "etc", "sysconfig"), odmPermissionFlag); readPermissions(Environment.buildPath( @@ -631,7 +632,9 @@ public class SystemConfig { // granting permissions to priv apps in the system partition and vice // versa. boolean vendor = permFile.toPath().startsWith( - Environment.getVendorDirectory().toPath()); + Environment.getVendorDirectory().toPath()) + || permFile.toPath().startsWith( + Environment.getOdmDirectory().toPath()); boolean product = permFile.toPath().startsWith( Environment.getProductDirectory().toPath()); if (vendor) { diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index f12795be658c9..eb9fe9cbd39c2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -2592,7 +2592,7 @@ public class PackageManagerService extends IPackageManager.Stub | SCAN_AS_PRIVILEGED, 0); - // Collected privileged system packages. + // Collect privileged system packages. final File privilegedAppDir = new File(Environment.getRootDirectory(), "priv-app"); scanDirTracedLI(privilegedAppDir, mDefParseFlags @@ -2611,7 +2611,7 @@ public class PackageManagerService extends IPackageManager.Stub | SCAN_AS_SYSTEM, 0); - // Collected privileged vendor packages. + // Collect privileged vendor packages. File privilegedVendorAppDir = new File(Environment.getVendorDirectory(), "priv-app"); try { privilegedVendorAppDir = privilegedVendorAppDir.getCanonicalFile(); @@ -2642,6 +2642,40 @@ public class PackageManagerService extends IPackageManager.Stub | SCAN_AS_VENDOR, 0); + // Collect privileged odm packages. /odm is another vendor partition + // other than /vendor. + File privilegedOdmAppDir = new File(Environment.getOdmDirectory(), + "priv-app"); + try { + privilegedOdmAppDir = privilegedOdmAppDir.getCanonicalFile(); + } catch (IOException e) { + // failed to look up canonical path, continue with original one + } + scanDirTracedLI(privilegedOdmAppDir, + mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags + | SCAN_AS_SYSTEM + | SCAN_AS_VENDOR + | SCAN_AS_PRIVILEGED, + 0); + + // Collect ordinary odm packages. /odm is another vendor partition + // other than /vendor. + File odmAppDir = new File(Environment.getOdmDirectory(), "app"); + try { + odmAppDir = odmAppDir.getCanonicalFile(); + } catch (IOException e) { + // failed to look up canonical path, continue with original one + } + scanDirTracedLI(odmAppDir, + mDefParseFlags + | PackageParser.PARSE_IS_SYSTEM_DIR, + scanFlags + | SCAN_AS_SYSTEM + | SCAN_AS_VENDOR, + 0); + // Collect all OEM packages. final File oemAppDir = new File(Environment.getOemDirectory(), "app"); scanDirTracedLI(oemAppDir, diff --git a/tests/OdmApps/Android.mk b/tests/OdmApps/Android.mk new file mode 100644 index 0000000000000..64fa65325accb --- /dev/null +++ b/tests/OdmApps/Android.mk @@ -0,0 +1,26 @@ +# Copyright (C) 2018 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := OdmAppsTest +LOCAL_MODULE_TAGS := tests +LOCAL_SRC_FILES := $(call all-java-files-under, src) +LOCAL_JAVA_LIBRARIES := tradefed +LOCAL_COMPATIBILITY_SUITE := device-tests +include $(BUILD_HOST_JAVA_LIBRARY) + +include $(call all-makefiles-under,$(LOCAL_PATH)) diff --git a/tests/OdmApps/AndroidTest.xml b/tests/OdmApps/AndroidTest.xml new file mode 100644 index 0000000000000..2f1283850a97c --- /dev/null +++ b/tests/OdmApps/AndroidTest.xml @@ -0,0 +1,27 @@ + + + + + + + + diff --git a/tests/OdmApps/app/Android.mk b/tests/OdmApps/app/Android.mk new file mode 100644 index 0000000000000..9eec0cc4f66fc --- /dev/null +++ b/tests/OdmApps/app/Android.mk @@ -0,0 +1,22 @@ +# Copyright (C) 2018 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_PACKAGE_NAME := TestOdmApp +LOCAL_MODULE_TAGS := tests +LOCAL_COMPATIBILITY_SUITE := device-tests +LOCAL_SDK_VERSION := current +include $(BUILD_PACKAGE) diff --git a/tests/OdmApps/app/AndroidManifest.xml b/tests/OdmApps/app/AndroidManifest.xml new file mode 100755 index 0000000000000..84a9ea84b522e --- /dev/null +++ b/tests/OdmApps/app/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/tests/OdmApps/priv-app/Android.mk b/tests/OdmApps/priv-app/Android.mk new file mode 100644 index 0000000000000..d423133fc9f57 --- /dev/null +++ b/tests/OdmApps/priv-app/Android.mk @@ -0,0 +1,22 @@ +# Copyright (C) 2018 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) +LOCAL_PACKAGE_NAME := TestOdmPrivApp +LOCAL_MODULE_TAGS := tests +LOCAL_COMPATIBILITY_SUITE := device-tests +LOCAL_SDK_VERSION := current +include $(BUILD_PACKAGE) diff --git a/tests/OdmApps/priv-app/AndroidManifest.xml b/tests/OdmApps/priv-app/AndroidManifest.xml new file mode 100755 index 0000000000000..031cf64ea7b17 --- /dev/null +++ b/tests/OdmApps/priv-app/AndroidManifest.xml @@ -0,0 +1,21 @@ + + + + + + diff --git a/tests/OdmApps/src/com/android/test/odm/app/OdmAppsTest.java b/tests/OdmApps/src/com/android/test/odm/app/OdmAppsTest.java new file mode 100644 index 0000000000000..de742b80a372c --- /dev/null +++ b/tests/OdmApps/src/com/android/test/odm/app/OdmAppsTest.java @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.test.odm.apps; + +import com.android.tradefed.testtype.DeviceTestCase; + +public class OdmAppsTest extends DeviceTestCase { + /** + * Test if /odm/app is working + */ + public void testOdmApp() throws Exception { + assertNotNull(getDevice().getAppPackageInfo("com.android.test.odm.app")); + } + + /** + * Test if /odm/priv-app is working + */ + public void testOdmPrivApp() throws Exception { + assertNotNull(getDevice().getAppPackageInfo("com.android.test.odm.privapp")); + } +}