Android预装可卸载apk方法 卸载后恢复出厂设置可恢复

   我们预置运用程序一般都是把apk放在system/app下,但是如果是在system下的话,user版本无法卸载apk;但是如果把apk放在data/app中的话,如果恢复出厂设置,这些apk在下次开机的时候就没有了。所以我们现在的做法是把apk先保存在system/pre-install下,然后在开机的时候检查data/app中是否有预置apk,如果没有则拷入apk,如果有则不操作,从而达到预置运用的功能,并且这些预置的运用可以卸载。以下介绍的是mtk平台的实现方法,其他平台方法类似。

微笑 详细说明

新建一个系统bin在开机的时候来实现apk的拷贝。具体实现如下:

1.    这是一个feature,为了控制各个项目方便开启和关闭此功能,需定义宏控制;

在code\mediatek \config\$项目(如sm111)目录下的ProjectConfig.mk文件中添加:

RGK_PREINSTALL_APP_UNINSTALL = yes

 

2. 在code\external下新建一个文件夹:(不要改动)

这个文件夹里放置我们这个bin所需的文件。名字自定,不要和现有的bin重名。这里我们设置为userapp,在userapp下创建一个C文件,主要实现拷贝apk功能:

创建copyapp.c:

#include <ctype.h>

#include <errno.h>

#include <fcntl.h>

#include <getopt.h>

#include <limits.h>

#include <linux/input.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/reboot.h>

#include <sys/stat.h>

#include <sys/types.h>

#include <time.h>

#include <unistd.h>

#include <dirent.h>

 

#define BUFFER_SIZE 1024

 

static void copy_file(char* src, char* dst)

{

           int src_fd,dst_fd;

           int bytes_read,bytes_write;

           char buffer[BUFFER_SIZE];

           char *ptr;

           if((src_fd = open(src,O_RDONLY)) == -1){

           }

           if((dst_fd = open(dst,O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH)) == -1){

           }

           while(bytes_read = read(src_fd,buffer,BUFFER_SIZE))

           {

               if((bytes_read == -1)&&(errno != EINTR))

               {

                   break;

               }

               else if(bytes_read > 0)

               {

                   ptr=buffer;

                   while(bytes_write = write(dst_fd,ptr,bytes_read))

                   {

                       if((bytes_write == -1)&&(errno != EINTR))

                       {

                           break;

                       }

                       else if(bytes_write == bytes_read)

                           break;

                       else if(bytes_write > 0)

                       {

                            ptr+=bytes_write;

                            bytes_read -= bytes_write;

                       }

                   }

                   if(bytes_write == -1)

                   {

                       break;

                   }

                  }

           }

           close(src_fd);

           close(dst_fd);

}

 

int main() {

              int fdcheck = 0;

              if((fdcheck = open("/data/app/copyapp.txt",O_RDONLY)) < 0)

              {

                     struct dirent **dataapplist;

                     int app_num = -1;

               app_num = scandir("/data/app", &dataapplist, 0, alphasort);

                     if (app_num < 0)

                     {

                            ;

                     }

                  else

                     {

                            int i =0;

                      for(;i < app_num;i++)

                            {

                          char app_name[256]="/data/app/";

                                   strcat(app_name,dataapplist[i]->d_name);

                                   remove(app_name);

                                   free(dataapplist[i]);

                      }

                      free(dataapplist);       

                     }

              }

              else

              {

                  close(fdcheck);

                     return EXIT_SUCCESS;

              }

 

           struct dirent **namelist;

           int file_num = scandir("/system/pre_install", &namelist, 0, alphasort);

           if (file_num < 0)

              {

                ;

           }

else

              {

               int ret = mkdir("/data/app",S_IRWXU|S_IRWXG|S_IRWXO);

               if(ret != 0)

                     {

                    

               }

               int i =0;

               for(;i < file_num;i++)

                     {

                   char src_name[256]="/system/pre_install/";

                   char dst_name[256]="/data/app/";

                   if(strstr(namelist[i]->d_name,".apk"))

                            {

                       strcat(src_name,namelist[i]->d_name);

                       strcat(dst_name,namelist[i]->d_name);

                       //copy /system/pre_install/xx.apk to /data/app/xx.apk

                       copy_file(src_name,dst_name);

                   }

                   free(namelist[i]);

               }

               free(namelist);

           }

fdcheck = open("/data/app/copyapp.txt",O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH);

            close(fdcheck);

           return EXIT_SUCCESS;

}

 

3. 在userapp下创建一个mk文件:

创建Android.mk:

ifeq ($(strip $(RGK_PREINSTALL_APP_UNINSTALL)), yes)

LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES:=copyapp.c

LOCAL_MODULE:=userapp

include $(BUILD_EXECUTABLE)

endif

 

4. 在init.rc中加入我们实现的bin;在code/mediatek\config\ratech75cu_nand_gb2下的init.rc中加入:

service userapp /system/bin/userapp

                     oneshot

              表示我们的bin在开机初始化的时候执行一次。

 

5. 在code/build/core目录下的user_tags.mk文件中加入:

              GRANDFATHERED_USER_MODULES += userapp

   

6. 在code\vendor目录下创建pre_install目录,里面存放我们预装可卸载的应用APP文件,在新建一个Android.mk文件:

       Android.mk内容为:

              ifeq ($(strip $(RGK_PREINSTALL_APP_UNINSTALL)), yes)

include $(CLEAR_VARS)

LOCAL_PATH:= vendor/pre_install

PRODUCT_COPY_FILES += \

       $(LOCAL_PATH)/QQSecure2.0_android.apk:system/pre_install/QQSecure2.0_android.apk

endif

   

7. 需要去掉code\vendor\third_party目录中Android.mk文件中相关APP的拷贝语句。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值