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日