Android8.0平台预置第三方apk到Data目录,使其可以卸载并且恢复出厂设置可以还原

coding

Mstar 8.0平台预置第三方apk,踩了不少坑,这里做一下笔录。

正常情况预置apk到Data目录很简单,网上一搜很多,这里就不贴代码了,但是这里会遇到一个问题,
1 如果在不改变apk签名的情况下预置到Data目录,编译后可以看到out 目录下确实是有这个apk,但是刷机系统跑起来后会因为签名校验不过(android 7.0之后增加的APK Signature Scheme v2签名方案),导致这个apk自动被系统删除。
2 如果将apk的签名改为系统签名预置到data目录,编译后刷机都可以正常运行,但是一般apk都有在线升级的功能,一旦apk有新版本了会因为apk签名被改变导致升级不了,
 


经过几次尝试发现如果将apk直接push进data目录 apk可以正常运行,那么这就好办了,我们就通过这种方式将apk内置进去,既可以让apk可以卸载,也能够让apk可以升级,并且恢复出厂设置可以恢复,具体怎么做呢,下面我以预置腾讯视频会议apk为例子
1 首先 准备好要内置的apk,在编译代码的时候将这个apk拷贝到一个位置(位置自己定义即可),ps :如果apk有lib 记得解压出来






PRODUCT_COPY_FILES += \

$(call find-copy-subdir-files,*,$(LOCAL_PATH)/dataApps/TenxunConference,data/nodelete/pre_install/TenxunConference)

2   然后准备一个脚本 copy_apps.sh,在第一次开机的时候执行脚本将apk拷贝到data目录,记得给这些apk文件
赋予权限

#!/system/bin/sh

FILE_DIR=/data/nodelete/pre_install/TenxunConference

FILE_DIR2=/data/app

TARGET_DIR=/data/app/TenxunConference

echo "$FILE_DIR copy start!!!"

mstarsu

cp $FILE_DIR $FILE_DIR2 -rf

chmod 777 $TARGET_DIR

chmod 777 $TARGET_DIR -R

echo "$FILE_DIR copy end!!!"

将脚本拷贝到system/etc目录下

PRODUCT_COPY_FILES += \

$(LOCAL_PATH)/copy_apps.sh:system/etc/copy_apps.sh

记得给脚本添加权限

yixiang.gao@ubuntu:~/code/public-8386/system$ git diff

diff --git a/core/libcutils/fs_config.c b/core/libcutils/fs_config.c

index 954680c..fd7b6a8 100755

--- a/core/libcutils/fs_config.c

+++ b/core/libcutils/fs_config.c

@@ -184,6 +184,7 @@ static const struct fs_path_config android_files[] = {

{ 00444, AID_ROOT, AID_ROOT, 0, ven_conf_dir + 1 },

{ 00444, AID_ROOT, AID_ROOT, 0, ven_conf_file + 1 },

{ 00755, AID_ROOT, AID_ROOT, 0, "system/etc/rp_update_file.sh" },

+ { 00755, AID_ROOT, AID_ROOT, 0, "system/etc/copy_apps.sh" },

{ 00755, AID_ROOT, AID_ROOT, 0, "system/etc/jms_change_permission.sh" },


在init.rc中定义一个服务

#for copy apps

service copy_apps /system/bin/sh /system/etc/copy_apps.sh

class main

user root

group root

disabled

oneshot

seclabel u:r:shell:s0

on property:persist.rp.first_boot=1

start copy_apps

在SystenServer中去启动这个服务

diff --git a/base/services/java/com/android/server/SystemServer.java b/base/services/java/com/android/server/SystemServer.java

index 64b35db..f0a7666 100755

--- a/base/services/java/com/android/server/SystemServer.java

+++ b/base/services/java/com/android/server/SystemServer.java

@@ -122,6 +122,7 @@ import java.util.Timer;

import java.util.TimerTask;

import java.util.concurrent.CountDownLatch;

import java.util.concurrent.Future;

+import android.util.Log;

import static android.view.Display.DEFAULT_DISPLAY;

@@ -505,6 +506,16 @@ public final class SystemServer {

* the other functions.

*/

private void startBootstrapServices() {

+ //add by gyx

+ boolean isFirstBoot = SystemProperties.get("persist.rp.first_boot_flag","0").equals("0");

+ if(isFirstBoot){

+ Log.i("gyx","isFirstBoot");

+ SystemProperties.set("persist.rp.first_boot_flag","1");

+ SystemProperties.set("persist.rp.first_boot","1");

+ SystemProperties.set("persist.rp.first_boot","0");

+ }

+ //end

+

这样基本就完成了,亲自没有问题。

以上是 Android8.0平台预置第三方apk到Data目录,使其可以卸载并且恢复出厂设置可以还原 的全部内容, 来源链接: utcz.com/z/508713.html

回到顶部