Android静默安装及开机自启的简单实现

写在前面



【apk静默安装】是android应用的一个重要功能,一般用在app自动更新等方面。静默安装在android里面是指不需要界面或用户参与的app安装动作,且需要系统已获root权限。安装完成后一般通过接收广播的方式启动App服务。
【app自启动】是常用功能,一般通过接收系统启动广播实现。

正文


1、被执行安装 app:

a. 自定义权限

<permission
        android:name="app.permission.install"
        android:protectionLevel="normal">
</permission>

其中android:name是自定义权限名称,android:protectionLevel是表示权限等级。
自定义权限android:protectionLevel有四个设置选项分别是:normal、dangerous、signature、signatureOrSystem,依次指明默认的低风险权限等级、涉及用户私有数据或系统级别组件的高风险权限等级、统一签名权限等级、系统级签名权限等级。此处用默认权限。

b. service标签加入权限限制(执行端必须拥有该权限才能访问)

<service
            android:name=".×××Service"
            android:enabled="true"
            android:exported="true"
            android:permission="app.permission.install">
    <intent-filter>
            <action android:name="×××.×××"/>
    </intent-filter>
</service>

2、执行静默安装 app:

a. 加入被安装app的自定义权限(获得访问权限)

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

b. 创建自动启动的广播接收器

<receiver android:name=".Broadcast.SilenceInstallReceiver"
            android:enabled="true"
            android:exported="true">
    <intent-filter>
            <action android:name="android.intent.action.PACKAGE_ADDED"/>
            <data android:scheme="package"/>
    </intent-filter>
</receiver>

广播接收器:

public class SilenceInstallReceiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // 接收安装广播
        if (intent.getAction().equals("android.intent.action.PACKAGE_ADDED")) {
            startApp(context);
        }
    }

    /**
     * 启动app
     */
    public void startApp(Context context) {
        /**
         * 启动service
         */
        Intent intent1 = new Intent();
        intent1.setPackage("×××.×××"); //设置被执行启动操作app包名
        intent1.setAction("×××.×××"); //设置被执行启动操作app中service的自定义intent
        context.startService(intent1);

        /**
         * 启动activity
         */
        Intent intent2= new Intent();
        ComponentName componentName = new ComponentName(
                "×××.×××",  //被执行启动操作app的包名
                "×××.×××");   //被执行启动操作app的activity包路径
        intent2.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//
        intent2.setComponent(componentName);
        context.startActivity(intent2);
    }
}

c.拷贝需安装的apk文件到本地

项目中apk存储位置:

具体代码:

/**
 * 将assets下的需要安装的apk文件复制到本地可读写目录
 */
public List<String> extractApkToLocal() {
    List<String> apkListLocal = new ArrayList<>();
    InputStream is = null;
    FileOutputStream fos = null;
    String[] files;
    String assetsDir = "apks";
    String localPath;
    try {
        File file = new File(apkPath);
        FileUtils.createOrExistsDir(file);
        files = mContext.getAssets().list(assetsDir);
        for (String f : files) {
            is = getAssets().open(assetsDir + "/" + f);
            localPath = apkPath + "/" + f;
            apkListLocal.add(localPath);
            fos = new FileOutputStream(new File(localPath));
            byte[] temp = new byte[1024];
            int i = 0;
            while ((i = is.read(temp)) > 0) {
                fos.write(temp, 0, i);
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (fos != null) {
            try {
                fos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return apkListLocal;
}

d.安装apk

具体代码:

public boolean slientInstall() {
    List<String> apkList;
    apkList = extractApkToLocal(); //获取apk本地路径
    boolean result = false;
    for (String path : apkList) {
        File file = new File(path);
        Process process = null;
        OutputStream out = null;
        if (file.exists()) {
            try {
                process = Runtime.getRuntime().exec("su");
                out = process.getOutputStream();
                DataOutputStream dataOutputStream = new DataOutputStream(out);

                // 更改本地apk文件权限,方便执行安装操作
                dataOutputStream.writeBytes("chmod 777 " + file.getPath()
                        + "\n");

                // 进行安装
                dataOutputStream.writeBytes("LD_LIBRARY_PATH=/vendor/lib:/system/lib pm install -r "
                        + file.getPath());
                dataOutputStream.flush();
                dataOutputStream.close();
                out.close();
                int value = process.waitFor();

                // 成功
                if (value == 0) {
                    result = true;
                    // 失败
                } else if (value == 1) {
                    result = false;
                    // 未知情况
                } else {
                    result = false;
                }
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            if (!result) {
                result = true;
            }
        }
    return result;
}

3、app自启动:

a. 添加接收【系统启动完成】广播的权限

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

b. 创建接收器

<receiver
        android:name=".Broadcast.BootReceiver"
        android:enabled="true">
    <intent-filter>
        <!-- 这是开机启动发送的广播意图-->
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

广播接收器:

public class BootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("BootReceiver:", "收到开机广播");
        //开启服务
        Intent startVoiceService = new Intent(context, ×××.class);
        context.startService(startVoiceService);
    }
}

小结



静默安装有它的局限性,需要通过系统的超级用户(root)进行操作任务,所以对系统安全性不高的情况有较强的实用性。此文是在查询各方面资料基础上实现的,旨在抛砖引玉,希望集思广益后有更好的实现方案!

原文地址:https://www.cnblogs.com/chanfee/p/9409217.html

时间: 2024-08-05 03:19:47

Android静默安装及开机自启的简单实现的相关文章

绕过身份检测,破解Android SU(android静默安装)

由于Android底层是Linux内核,故了解了Linux的权限管理后就可以知道ROOT的原理,具体可以访问<Android系统权限和root权限>一文,而一般的Androd下的su命令只支持在ROOT用户和SHELL用户下才有权限让程序以root用户身份运行,其实看完Android源码下的system/extras/su/su.c代码即可清楚,而我们绕过了其中的当前运行用户判断来让所有的用户都可以将以自己身份运行的程序尝试去设置以root用户身份运行,即运行su命令不需判断运行程序的当前用户

android静默安装和智能安装(转)

Android 静默安装和智能安装的实现方法 http://blog.csdn.net/fuchaosz/article/details/51852442 Android静默安装实现方案,仿360手机助手秒装和智能安装功能 http://blog.csdn.net/guolin_blog/article/details/47803149 5.0以上 静默安装的安装包放在根目录下,如:Environment.getRootDirectory().toString()+"/xxx.apk"

Android 静默安装/后台安装&amp; Root permission

Android 静默安装/后台安装& Root permission 静默安装其实很简单,今天在网上找资料找半天都说的很复杂,什么需要系统安装权限.调用系统隐藏的api.需要系统环境下编译.需要跟systemUI同进程什么的.我不知道他们真的实现了静默安装实现方式,亲测效果跟豌豆荚一样,并且实现起来非常简单: 1.支持静默安装的机器必须Root,这个不需要我多讲了. 2.使用pm指令安装即可.     3.特别注意 PM指令不支持中文,也就说路径中有中文会导致安装失败! 关键代码如下: exec

Android 静默安装Apk

参考链接 android 静默安装 [Android]实现静默安装APK的两种方法

Android静默安装实现方案,仿360手机助手秒装和智能安装功能

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47803149 之前有很多朋友都问过我,在Android系统中怎样才能实现静默安装呢?所谓的静默安装,就是不用弹出系统的安装界面,在不影响用户任何操作的情况下不知不觉地将程序装好.虽说这种方式看上去不打搅用户,但是却存在着一个问题,因为Android系统会在安装界面当中把程序所声明的权限展示给用户看,用户来评估一下这些权限然后决定是否要安装该程序,但如果使用了静默安装的方式,也就没

Android 静默安装和智能安装的实现方法

1 简介 最近研究了Android的静默安装和智能安装,于是写博客记录一下. 静默安装就是无声无息的在后台安装apk,没有任何界面提示. 智能安装就是有安装界面,但全部是自动的,不需要用户去点击. 首先强调两点: 静默安装必须要root权限 智能安装必须要用户手动开启无障碍服务 2 原理 静默安装.卸载的原理就是利用pm install命令来安装apk,pm uninstall 来卸载apk. 智能安装是利用android系统提供的无障碍服务AccessibilityService,来模拟用户点

Android静默安装和静默卸载

静默顾名思义就是静静的默默地,静默安装和静默卸载的意思也就是说在后台默默地安装和卸载. 最近的一个app应用分发的项目中app下载的模块,下载完成之后,用户可以通过这个app进行安装,为了提高用户的体验,我就加入了静默安装和卸载功能,然后还加入了使用am命令启动某个Activity. 这个项目中静默的方式实现代码如下: 首先判断是否有root权限,如果有利用静默方式,否则利用意图实现app安装和卸载操作. package com.example.test; import java.io.File

Android静默安装和静默卸载代码

静默顾名思义就是静静的默默地,静默安装和静默卸载的意思也就是说在后台默默地安装和卸载. 最近的一个app应用分发的项目中app下载的模块,下载完成之后,用户可以通过这个app进行安装,为了提高用户的体验,我就加入了静默安装和卸载功能,然后还加入了使用am命令启动某个Activity. 这个项目中静默的方式实现代码如下: 首先判断是否有root权限,如果有利用静默方式,否则利用意图实现app安装和卸载操作. 1 package com.example.test; 2 3 import java.i

Android 静默安装/后台安装

Android实现静默安装其实很简单,今天在网上找资料找半天都说的很复杂,什么需要系统安装权限.调用系统隐藏的api.需要系统环境下编译.需要跟systemUI同进程什么的.我不知道他们真的实现了静默安装没有,反正我按照他们的方式统统都失败了. 下面我来说说我的静默安装实现方式,亲测效果跟豌豆荚一样,并且实现起来非常简单: 1.支持静默安装的机器必须Root,这个不需要我多讲了. 2.使用pm指令安装即可.     3.特别注意 PM指令不支持中文,也就说路径中有中文会导致安装失败! 关键代码如