Android 预装APK

Android 预装APK

步骤

1. 添加apk文件

  • 在packages/apps/下以需要安装的APK名字创建文件夹,例如安装AndroidDemo
  • 将AndroidDemo.apk放到packages/app/AndroidDemo下
  • 在packages/apps/AndroidDemo下创建Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := AndroidDemo

LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk

LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := .apk

LOCAL_PREBUILT_JNI_LIBS:= \
@lib/armeabi/1.so \
@lib/armeabi/2.so

LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)

LOCAL_MODULE_OWNER  := qcom

include $(BUILD_PREBUILT)

2. 添加so

在packages/apps/AndroidDemo下创建lib/armeabi文件夹,并存储需要的so文件

3. 添加到系统

在device/qcom/msm8953/msm8953.mk,将AndroidDemo添加到PRODUCT_PACKAGES += AndroidDemo

4. 编译

make systemimage

注意

  • 添加APK失败,在out/target/product/msm8953_64/data/app/myapp/myapp.apk下找到APK,但是在查看内置APK时没找到包名

APK直接放入编译生成的目录

# 创建存放目录MyApplication
mkdir out/target/product/msm8953_64/system/app/MyApplication
# APK放入MyApplication
cp MyApplication.apk out/target/product/msm8953_64/system/app/MyApplication/
# 编译将system文件夹打包为system.img
make snod
#!/bin/bash

APP_NAME="MyApplication"
ROOT_DIR="/home/gci/Desktop/SC60_SC600_Android9.0.0_kernel4.9_r029"
APK_SRC_PATH="./MyApplication.apk"
APK_DST_PATH="${ROOT_DIR}/out/target/product/msm8953_64/system/app/${APP_NAME}"

if [ ! -f ${APK_SRC_PATH} ]; then
    echo "can not find ${APK_SRC_PATH}"
    exit 1
fi

if [ ! -d ${APK_DST_PATH} ]; then
    mkdir ${APK_DST_PATH}
    echo "mkdir ${APK_DST_PATH}"
fi

cp ${APK_SRC_PATH} ${APK_DST_PATH}

cd ${ROOT_DIR}

source build/envsetup.sh

lunch 42

make snod

echo "******* finish *******"

exit 0

注意

  • make clean后整个out目录都删除了

在Android.mk中进行复制

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_POST_PROCESS_COMMAND := $(shell cp -r $(LOCAL_PATH)/*.apk $(TARGET_OUT)/app/)

软件权限

普通软件默认授权,不弹出对话框

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

把void doHandleMessage(Message msg)下的
final boolean grantPermissions = (args.installFlags& PackageManager.INSTALL_GRANT_RUNTIME_PERMISSIONS) != 0;
改为
final boolean grantPermissions = true;

预装软件默认授权

# frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java
在private void grantPermissions(PackageParser.Package pkg, boolean replace, String packageOfInterest, PermissionCallback callback) 方法

// PackageParser.Package pkg:通过pkg可以获取到包名,当前app需要申请的所有权限等等信息
// 如果只对某个包赋予权限,应该改在这过滤

synchronized (mLock) {
    final int N = pkg.requestedPermissions.size(); // 获取AndroidManifest中请求的权限个数

    for (int i = 0; i < N; i++) {
        final String permName = pkg.requestedPermissions.get(i); // 分别对包的每个权限进行遍历,判断
        final BasePermission bp = mSettings.getPermissionLocked(permName);
        final boolean appSupportsRuntimePermissions = pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.M;

        if (DEBUG_INSTALL) {
            Log.i(TAG, "Package " + pkg.packageName + " checking " + permName + ": " + bp);
        }



    final String perm = bp.getName();
    boolean allowedSig = false;
    // int grant = GRANT_DENIED; // 默认权限值为拒绝
    int grant = GRANT_INSTALL;   // 改为普通权限

    // Keep track of app op permissions.
    if (bp.isAppOp()) {
        mSettings.addAppOpPackage(perm, pkg.packageName);
    }

    if (bp.isNormal()) { // 普通权限检查
        // For all apps normal permissions are install time ones.
        grant = GRANT_INSTALL;
    } else if (bp.isRuntime()) { // 运行时危险权限检查
        // If a permission review is required for legacy apps we represent
        // their permissions as always granted runtime ones since we need
        // to keep the review required permission flag per user while an
        // install permission's state is shared across all users.
        if (!appSupportsRuntimePermissions && !mSettings.mPermissionReviewRequired) {
            // For legacy apps dangerous permissions are install time ones.
            grant = GRANT_INSTALL;
        } else if (origPermissions.hasInstallPermission(bp.getName())) {
            // For legacy apps that became modern, install becomes runtime.
            grant = GRANT_UPGRADE;
        } else if (isLegacySystemApp) {
            // For legacy system apps, install becomes runtime.
            // We cannot check hasInstallPermission() for system apps since those
            // permissions were granted implicitly and not persisted pre-M.
            grant = GRANT_UPGRADE;
        } else {
            // For modern apps keep runtime permissions unchanged.
            // grant = GRANT_RUNTIME;
            grant = GRANT_INSTALL; // 改为普通权限
        }
    } else if (bp.isSignature()) {
        // For all apps signature permissions are install time ones.
        allowedSig = grantSignaturePermission(perm, pkg, bp, origPermissions);
        if (allowedSig) {
            grant = GRANT_INSTALL;
        }
    }

    if (DEBUG_PERMISSIONS) {
        Slog.i(TAG, "Granting permission " + perm + " to package " + pkg.packageName);
    }

备注

  • 预装到/system/app下不可以卸载
  • 预装到/data/app/下,可以卸载

作者 [@lhgcs]
2020 年 07月 20日

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值