Android-Apk实现静默安装

MK文件写法如下:InstallActivity这个是mm出来的名字,可以随意的改
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := user

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := InstallActivity
LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

4.0以上和4.0以下静默安装的方式不一样:
首先说4.0以下的静默安装:
静默安装无非也是安装,首先得看安装的源码,安装的源码在app层PackageInstaller,
这个项目就是安装的源码,你首先可以看安装的源码.我先说静默安装的步骤;
1:静默安装apk,你得先随便放一个apk到SD卡当中。我以UC浏览器apk举例子。
2:首先获得apk在SD卡中的路径String fileName = Environment.getExternalStorageDirectory() +  "/UC.apk"; 
3:获取包的管理者,代码如下:
PackageManager pm = getPackageManager();
            try {
                PackageInfo pi = pm.getPackageInfo("com.uc.browser", 
                        PackageManager.GET_UNINSTALLED_PACKAGES);
                if(pi != null) {
                    installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;
                }
            } catch (NameNotFoundException e) {
            }
  installFlags |= PackageManager.INSTALL_REPLACE_EXISTING;这句的意思是强制安装,不管你的设备上面是否有曾经安装过apk,都强制在安装一次。
4:通过安装包的观察者PackageInstallObserver,具体代码如下
    PackageInstallObserver observer = new PackageInstallObserver();
class PackageInstallObserver extends IPackageInstallObserver.Stub {
        public void packageInstalled(String packageName, int returnCode) {
            Message msg = mHandler.obtainMessage(INSTALL_COMPLETE);
            msg.arg1 = returnCode;
            mHandler.sendMessage(msg);
        }
    };
    
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case INSTALL_COMPLETE:
                   
                    int centerTextLabel;
                    Drawable centerTextDrawable = null;
                    if(msg.arg1 == SUCCEEDED) {
                            
                    } else {}
                    if (centerTextDrawable != null) {}

                    break;
                default:
                    break;
            }
        }
    };
5:通过pm.installPackage(uri, observer, installFlags, "com.uc.browser");
6:去掉gen下面的r
7:编写MK文件:mkd 的具体写法如下
    LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := user

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := InstallActivity
LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)
8:然后丢到linux下面mm一下就行。


接下来4.0以上的静默安装,一般我们在adb install xxx.apk的时候,最终调用的还是pm install xxx.apk。
所以我们可以用pm install -r 进行安装apk。代码如下
//方法体可以在任何地方可套用,不用修改任何东东哦!

     public String install(String apkAbsolutePath ){ 
         String[] args = { "pm", "install", "-r", apkAbsolutePath };
          String result = "";
         ProcessBuilder processBuilder = new ProcessBuilder(args);
          Process process = null;
          InputStream errIs = null;
          InputStream inIs = null;
         try {
             ByteArrayOutputStream baos = new ByteArrayOutputStream();
              int read = -1;
              process = processBuilder.start();
              errIs = process.getErrorStream();
              while ((read = errIs.read()) != -1) {
                 baos.write(read);
              }
              baos.write("/n".getBytes());
           inIs = process.getInputStream();
              while ((read = inIs.read()) != -1) {
                  baos.write(read);
             }
              byte[] data = baos.toByteArray();
              result = new String(data);
          } catch (IOException e) {
              e.printStackTrace();
         } catch (Exception e) {
              e.printStackTrace();
          } finally {
              try {
                  if (errIs != null) {
                    errIs.close();
                 }
                 if (inIs != null) {
                      inIs.close();
                  }
             } catch (IOException e) {
                 e.printStackTrace();
              }
              if (process != null) {
                 process.destroy();
             }
          }
          return result;
      }
添加系统权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

      <uses-permission android:name="android.permission.INSTALL_PACKAGES" />

      <uses-permission android:name="android.permission.DELETE_PACKAGES" />

      <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />

      <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />

      <uses-permission android:name="android.permission.READ_PHONE_STATE" />
同样编写MK文件,然后在linux底下编译

在eclipse里面写好了,不需要右键运行,把R文件删掉,然后把代码拷贝到linux底下mm一下

当我们的项目中有加入三方的jar,mk是另外一种写法,如下
# Copyright 2007-2008 The Android Open Source Project

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_STATIC_JAVA_LIBRARIES := android_api //还有这里

LOCAL_SRC_FILES := $(call all-java-files-under)

LOCAL_PACKAGE_NAME := sxs //这个是编译出来的名字,随便取一个
LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := android_api:libs/android_api.jar //修改这里
include $(BUILD_MULTI_PREBUILT)

# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))

以下是4.2上面编译的静默安装MK文件
# Copyright 2007-2008 The Android Open Source Project

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-java-files-under)

LOCAL_PACKAGE_NAME := install
LOCAL_CERTIFICATE := platform

include $(BUILD_PACKAGE)

# Use the following include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))


这个是清单文件配置的权限,不需要分享系统UID
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.INSTALL_PACKAGES" />
    <uses-permission android:name="android.permission.DELETE_PACKAGES" />
    <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
    <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
静默安装代码代码如下:
String fileName = Environment.getExternalStorageDirectory()+ "/a.apk";
install(fileName);

public String install(String apkAbsolutePath ){  
          String[] args = { "pm", "install", "-r", apkAbsolutePath };
         String result = "";
          ProcessBuilder processBuilder = new ProcessBuilder(args);
         Process process = null; 
         InputStream errIs = null;
          InputStream inIs = null;
          try {
              ByteArrayOutputStream baos = new ByteArrayOutputStream();
              int read = -1;
              process = processBuilder.start();
              errIs = process.getErrorStream();
             while ((read = errIs.read()) != -1) {
                 baos.write(read);
              }
              baos.write("/n".getBytes());
              inIs = process.getInputStream();
              while ((read = inIs.read()) != -1) {
                  baos.write(read);
             }
              byte[] data = baos.toByteArray();
              result = new String(data);
          } catch (IOException e) {
              e.printStackTrace();
          } catch (Exception e) {
              e.printStackTrace();
         } finally {
             try {
                 if (errIs != null) {
                     errIs.close();
                 }
                 if (inIs != null) {
                     inIs.close();
                 }
              } catch (IOException e) {
                  e.printStackTrace();
              }
              if (process != null) {
                  process.destroy();
              }
          }
          return result;
         
      }
     在linux下编译后,system/app下面的apk就是我们想要的apk了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值