Android O/P/Q 版本如何預裝 APK

一.預置可卸載APK,恢復出廠設置以後不可以恢復,將apk預置到data/app目錄下

android o 版本以後google 加入了patch,不允許預置apk到data/app目錄下,

只允許使用 adb install 的方式來安裝apk到data/app目錄下,需要將其roll back 回以前的版本,

frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -11394,6 +11394,10 @@
                                     + " but expected at " + known.codePathString
                                     + "; ignoring.");
                         }
                    } /*else {
+                        throw new PackageManagerException(INSTALL_FAILED_INVALID_INSTALL_LOCATION,
+                                "Application package " + pkg.packageName
+                                + " not found; ignoring.");
                     }*/
                 }
             }

然後用下列方法可以完成預置:

(1)在 packages/apps 下面以需要預置的 APK 名字創建文件夾,以預置一個名爲Test的APK爲例

(2)將 Test.apk 放到 packages/apps/Test 下面

(3)在 packages/apps/Test 下面創建文件 Android.mk,文件內容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
# LOCAL_PRIVILEGED_MODULE := true
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

(4)打開文件 device\mediatek\common\device.mk
將 Test 添加到 PRODUCT_PACKAGES 裏面。
PRODUCT_PACKAGES += Test

(5)重新 build 整個工程
注意:這個比不能卸載的多了一句
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

二.預置APK使得用戶可以卸載,並且恢復出廠設置時能夠恢復,將apk預置到 vendor/operator/app 目錄下

如果apk是v1簽名方式,按照如下方式預置:
(1)在 vendor\mediatek\proprietary\packages\3rd-party下面以需要預置的 APK 名字創建文件夾,以預置一個名爲Wechat.apk爲例

(2) 將Wechat.apk 放入vendor\mediatek\proprietary\packages\3rd-party\Wechat下面

(3)在vendor\mediatek\proprietary\packages\3rd-party\Wechat 下面創建文件 Android.mk,文件內容如下

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Wechat
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := Wechat.apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/vendor/operator/app
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE_OWNER := mtk
include $(BUILD_PREBUILT)

(4)打開文件device\mediatek\common\device.mk
將 Wechat 添加到 PRODUCT_PACKAGES 裏面。
PRODUCT_PACKAGES += Wechat

(5)然後重新build整個工程

注意:需要確保MTK_CTA_SET宏是打開的,會定義屬性值persist.vendor.pms_removable=1,

MTK_CTA_SET和這個屬性值不是強相關的,可以分離,

然後在**/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt**

這個白名單文件中加入需要卸載的apk的包名

如果是apk是V2簽名方式:

(1)在任意一個apk的目錄下(Xunfei)的Android.mk的文件中添加如下內容:

$(shell mkdir $(TARGET_OUT)/vendor/operator/app/Facebook)
$(shell cp $(LOCAL_PATH)/Facebook.apk $(TARGET_OUT)/vendor/operator/app/Facebook)

(2)將該Facebook.apk放入任意一個apk目錄中,比如放入Xunfei這個目錄中

(3)打開文件device\mediatek\common\device.mk
將 Facebook 添加到 PRODUCT_PACKAGES 裏面。
PRODUCT_PACKAGES += Facebook

(4)然後重新build整個工程
注意:
(4.1)需要確保 MTK_CTA_SET 宏是打開的,會定義屬性值 persist.vendor.pms_removable=1,

MTK_CTA_SET 和這個屬性值不是強相關的,可以分離,

然後在/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_vendor_list.txt這個白名單文件中加入需要卸載的apk的包名

(4.2)這種方式預置facebook,facebook可以成功預置進手機,但是點擊手機的時候會報出

avc:denied,selinux權限異常的情況,可以通過在相應的te文件中加入allow語句

三.預置APK使得用戶可以卸載,並且恢復出廠設置時能夠恢復,將apk預置到 system/app 目錄下

(1) 在 packages/apps 下面以需要預置的 APK 名字創建文件夾,以預置一個名爲Test的APK爲例

(2) 將 Test.apk 放到 packages/apps/Test 下面

(3) 在 packages/apps/Test 下面創建文件 Android.mk,文件內容如下:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := Test
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
include $(BUILD_PREBUILT)

(4) 打開文件 device\mediatek\common\device.mk
將 Test 添加到 PRODUCT_PACKAGES 裏面。
PRODUCT_PACKAGES += Test

(5) 重新 build 整個工程

注意:
(1)需要確保 MTK_CTA_SET 宏是打開的,會定義屬性值 persist.vendor.pms_removable=1,

MTK_CTA_SET和這個屬性值不是強相關的,可以分離,然後在

/vendor/mediatek/proprietary/frameworks/base/data/etc/pms_sysapp_removable_system_list.txt這個白名單文件中加入需要卸載的apk的包名

(2)修改如下代碼:

8776    private PackageParser.Package addForInitLI(PackageParser.Package pkg,
8777            @ParseFlags int parseFlags, @ScanFlags int scanFlags, long currentTime,
8778            @Nullable UserHandle user)
8779                    throws PackageManagerException {
8780        final boolean scanSystemPartition = ((parseFlags & PackageParser.PARSE_IS_SYSTEM_DIR) != 0)
8781                // M:operator app also is removable and not system flag
8782                || sPmsExt.isRemovableSysApp(pkg.packageName) && pkg.codePath.contains("/system/") ;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章