无源码

1、预备第三方apk,以GpsTest.apk为例

2、在/vendor/qcom/目录下创立目录thirdapps,并将GpsTest.apk拷贝到该目录下,同时创立Android.bppreinstall.mk文件

Android13预置第三方运用

Android.bp的内容为

android_app_import {
    name: "GpsTest",
    apk: "GpsTest.apk",
    // 保存apk自己的签名
    presigned: true,
    // 翻开将放到对应分区目录的priv-app文件夹下
    // privileged: true,  
    // 翻开将放到system_ext分区
    // system_ext_specific: true, 
    // 翻开将放到product分区
    // product_specific: true, 
    // 翻开将放到vendor分区
    // proprietary: true,
    // odm分区
    // device_specific: true
    // apk优化,内置三方apk时主张关闭
    dex_preopt: {
        enabled: false,
    },
}

preinstall.mk的内容为

PRODUCT_PACKAGES += GpsTest

然后将GpsTest加入到编译模块,在device/qcom/qssi/base.mk中增加

# include preinstall apps
-include vendor/qcom/thirdapps/preinstall.mk

最后编译刷机验证

有源码

1、将源代码拷贝到/vendor/qcom/thirdapps/目录下,并在源代码中增加Android.bp文件

android_app {
    name: "TestApp1",
    libs: ["telephony-common"],
    static_libs: [
        "com.google.android.material_material",
        "androidx.legacy_legacy-support-core-utils",
    ], 
    srcs: ["**/*.java"],
    platform_apis: true,
    sdk_version: "",
    certificate: "platform",
}

2、将app增加到编译模块,在device/qcom/qssi/base.mk中增加

PRODUCT_PACKAGES += TestApp1

运用预置目录介绍

常见的运用预置分区包含 system、system_ext、product、vendor、odm、data 等。不同的分区下装置路径

所对应的权限和域不相同,如 system,system_ext 归于 system 域,data 首要用于在线装置第三方的应

用,除 data 外其余分区都归于 vendor 域

目录 阐明 补白
system/app 体系核心运用目录,预置到该目录的运用不可卸载,设备康复出厂设置后依然存在。 主张将需求申请体系权限,且重要的运用,预置到该目录。
system/priv-app 同上。 一般运用不引荐预置进该目录。该目录下的运用权限比 system/app 高。
system/preloadapp 第三方运用预置目录,预置到该目录的运用可卸载,设备卸载后康复出厂。 preloadapp 中预置的运用在开机进程中同步多线程扫描装置,可加速开机速度。
system/vital-app 设置时可康复。 预置在该目录和 system/preloadapp 目录下的效果共同。
{PARTITION}/app 体系运用目录,预置到该目录的运用不可卸载,设备康复出厂设置后依然存在。 相较于 system 分区,CTS 会检查预置进vendor、product 分区中的运用 API 是否合规。
{PARTITION}/priv-app 同上。 相较于{PARTITION}/app 目录,此目录中的运用不签署 platform 签名也可获得供货商特别权限。
data/app 第三方运用预置目录,预置到该目录的运用可卸载,设备康复出厂设置不能康复。

上表中界说宏 PARTITION 为 system_ext、product、vendor、odm 中的任意一个分区

android_app_import特点阐明

  • presigned

    是否保存apk自己的签名,假如为true,则签名不变

  • certificate

    签名方法,取值有:

    • platform:平台的核心运用签名,运用该签名的 apk 需求获取 platform signature,例如 Settings,该值运用较多

    • PERSIGNED:源 apk 自带的签名,编译进程不再从头签名

    • testkey:非 user 版别默许签名

    • releasekey:user 版别默许签名

    • shared:运用该签名方法的 apk 需求和 home/contacts 进程共享数据,例如 Launcher

    • media:运用该签名方法的 apk 是 media/download 体系中的一环,例如 Gallery

    一般与presigned配合运用,设置后可运用AOSP自带的keytool可查看apk签名

    keytool -printcert -jarfile GpsTest.apk
    
    Signer #1:
    Signature:
    Owner: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
    Issuer: EMAILADDRESS=android@android.com, CN=Android, OU=Android, O=Android, L=Mountain View, ST=California, C=US
    Serial number: b3998086d056cffa
    Valid from: Wed Apr 16 06:40:50 CST 2008 until: Sun Sep 02 06:40:50 CST 2035
    Certificate fingerprints:
         SHA1: 27:19:6E:38:6B:87:5E:76:AD:F7:00:E7:EA:84:E4:C6:EE:E3:3D:FA
         SHA256: C8:A2:E9:BC:CF:59:7C:2F:B6:DC:66:BE:E2:93:FC:13:F2:FC:47:EC:77:BC:6B:2B:0D:52:C1:1F:51:19:2A:B8
    Signature algorithm name: MD5withRSA (disabled)
    Subject Public Key Algorithm: 2048-bit RSA key
    Version: 3
    
  • privileged

    是否将apk放置到分区对应的priv-app文件夹下

  • system_ext_specific

    是否将apk放到system_ext分区

  • product_specific

    是否将apk放到product分区

  • proprietary

    是否将apk放到vendor分区

  • device_specific

    是否将apk放到odm分区

  • dex_preopt

    apk dex优化,内置三方apk时主张关闭

  • overrides

    掩盖默许运用,该值为一个数组,表示该apk将替换指定的apk运用,例如:overrides: [“Home”, “Launcher2”]

  • required

    需求的依靠的本地库,例如:

    required: [
            "libDehaze",
            "libfbextraction",
            "libimageblend",
        ]
    
  • optional_uses_libs

    apk在运行时非有必要依靠的库,例如:

    optional_uses_libs: ["org.apache.http.legacy"]
    
  • platform_apis

    当 platform_apis 为 true 时,sdk_version 有必要为空。这种情况下咱们的 app 会运用平台 API 进行编译而不是 SDK,这样咱们的 App 就能访问到非 SDK API 了

  • used_libs

    apk在运行时有必要依靠的库,例如:

    uses_libs: ["org.apache.http.legacy"]
    

权限处理

将运用预置到/system/priv-app目录时,需求装备相应权限,否则会无法开机

// privapp-permissions.xml 文件只要在与特权运用坐落同一分区时才能授予或回绝授予该运用权限。
// 例如,假如 /vendor 分区上的运用请求特许权限,则只能由相同坐落 /vendor 上的 privapp-permissions.xml
// 文件来赞同或回绝该请求。
// frameworks/base/data/etc/privapp-permissions-platform.xml
// 加入需求授权的权限
<privapp-permissions package="com.chartcross.gpstest">
    <permission name="android.permission.READ_LOGS"/>
    <permission name="android.permission.CLEAR_APP_CACHE"/>
    <permission name="android.permission.PACKAGE_USAGE_STATS"/>
</privapp-permissions>

假如权限装备不全,运行时在log中予以提示

01-14 20:17:26.794  1676  1676 W PackageManager: Privileged permission android.permission.READ_LOGS for package com.chartcross.gpstes (/system/priv-app/GpsTest) not in privapp-permissions allowlist
01-14 20:17:26.794  1676  1676 W PackageManager: Privileged permission android.permission.CLEAR_APP_CACHE for package com.chartcross.gpstes (/system/priv-app/GpsTest) not in privapp-permissions allowlist
01-14 20:17:26.794  1676  1676 W PackageManager: Privileged permission android.permission.PACKAGE_USAGE_STATS for package com.chartcross.gpstes (/system/priv-app/GpsTest) not in privapp-permissions allowlist

根据提示,在 frameworks/base/data/etc/privapp-permissions-platform.xml增加齐全即可