android 静默暗转_Android静默安装及开机自启的简单实现

写在前面

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

【app自启动】是常用功能,一般通过接收系统启动广播实现。

正文

1、被执行安装 app:##

a. 自定义权限

android:name="app.permission.install"

android:protectionLevel="normal">

其中android:name是自定义权限名称,android:protectionLevel是表示权限等级。

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

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

android:name=".×××Service"

android:enabled="true"

android:exported="true"

android:permission="app.permission.install">

2、执行静默安装 app:##

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

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

android:enabled="true"

android:exported="true">

广播接收器:

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 extractApkToLocal() {

List 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 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. 添加接收【系统启动完成】广播的权限###

b. 创建接收器###

android:name=".Broadcast.BootReceiver"

android:enabled="true">

广播接收器:

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)进行操作任务,所以对系统安全性不高的情况有较强的实用性。此文是在查询各方面资料基础上实现的,旨在抛砖引玉,希望集思广益后有更好的实现方案!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值