flutter开发实战-安卓apk安装、卸载、启动实现

flutter开发实战-安卓apk安装、卸载、启动实现

在之前的文章中,实现了应用更新apk下载等操作,具体文档看下

这里记录一下使用shell来操作apk的安装、卸载、启动的操作。用到了库shell,Shell用于在Dart中或在代表其他用户执行系统管理任务的应用程序中编写shell实用程序脚本。

一、在pubspec.yaml中引入shell

在pubspec.yaml中引入shell

复制代码
dependencies:
  shell: ^2.0.0

二、shell简介

Shell是dart:io〔Process〕API上的包装器以便支持环境管理、用户开关等功能。Shell用于在Dart中或在代表其他用户执行系统管理任务的应用程序中编写shell实用程序脚本。

下面是Shell的一个示例

复制代码
import 'dart:io';
import 'package:file/local.dart';
import 'package:shell/shell.dart';

main() async {
  var fs = const LocalFileSystem();
  var shell = new Shell();
  var password = Platform.environment['PASSWORD'];
  print('Password: $password');

  // 将结果传输到文件。
  var echo = await shell.start('echo', ['hello world']);
  await echo.stdout.writeToFile(fs.file('hello.txt'));
  await echo.stderr.drain();

  //可以运行一个程序,并退出代码
  //如果返回了有效的退出代码,则会排出stderr,并且
  //您不必手动操作。
  //
  //否则,将引发StateError。
  var find = await shell.start('find', ['.']);
  await find.expectExitCode([0]); // Can also call find.expectZeroExit()

  // 转储输出.
  print(await find.stdout.readAsString());

  // 还可以运行一个进程并立即返回一个字符串。
  var pwd = await shell.startAndReadAsString('pwd', []);
  print('cwd: $pwd');

  // 可以导航到目录,类似 `cd`.
  shell.navigate('./lib/src');
  pwd = await shell.startAndReadAsString('pwd', []);
  print('cwd: $pwd');

  // 可以用相同的设置制作一个单独的外壳。
  var forked = new Shell.copy(shell)
    ..sudo = true
    ..password = password;

  // 输出echo
  var superEcho = await forked.start('echo', ['hello, admin!']);
  await superEcho.expectExitCode([0, 1]);
  await superEcho.stdout.writeToFile(fs.file('hello_sudo.txt'));
}

三、安卓apk安装、卸载、启动实现

使用Shell,我们需要shell程序脚本。那么安卓apk安装、卸载、启动实现,需要实现制定的Shell指令脚本。

在adb shell中,输入以下命令以安装APK

pm install /sdcard/Download/my_apk_release.apk

那么使用shell,则使用如下方法

复制代码
  final _shell = Shell(runInShell: false);

  Future<WrappedProcess> shellRun(List<String> cmd) async {
    return await _shell.start('su', arguments: ['0', ...cmd]);
  }

  Future<void> shellHandleResult(WrappedProcess result) async {
    var code = await result.exitCode;
    var s = await result.stdout.readAsString();
    if (code != 0) {
      var e = await result.stderr.readAsString();
      throw '$code:$e';
    }
  }

那直接调用安装Android安卓apk

可以实现install则使用安装apk

复制代码
  @override
  Future<void> install(String path) async {
    var result = await shellRun(['pm', 'install', '-r', path]);
    return shellHandleResult(result);
  }

卸载apk的uninstall

复制代码
  @override
  Future<void> uninstall(String packageName) async {
    var result = await shellRun(['pm', 'uninstall', '-k', packageName]);
    return shellHandleResult(result);
  }

启动安装的应用apk

复制代码
  @override
  Future<void> startApp(String componentName) async {
    var result = await shellRun(['am', 'start', '-n', componentName]);
    return shellHandleResult(result);
  }

强制停止指定的应用

复制代码
  @override
  Future<void> stopApp(String componentName) async {
    var result = await shellRun(['am', 'force-stop', '-n', componentName]);
    return shellHandleResult(result);
  }

应用安装并且启动

复制代码
@override
  Future<void> installThenStart(String path, String componentName) async {
    var result = await shellRun(['pm', 'install', '-r', path, '&&', 'am', 'start', '-n', componentName]);
    return shellHandleResult(result);
  }

至此,可以使用Sell来实现安卓apk安装、卸载、启动等操作。

四、小结

flutter开发实战-安卓apk安装、卸载、启动实现。描述可能不是特别准确,请见谅。

学习记录,每天不停进步。

相关推荐
2501_919749031 天前
flutter鸿蒙:使用flutter_local_notifications实现本地通知
flutter·华为·harmonyos
掘金安东尼1 天前
Chrome 17 岁了——我们的浏览器简史
前端·javascript·github
东坡肘子1 天前
从开放平台到受控生态:谷歌宣布 Android 开发者验证政策 | 肘子的 Swift 周报 #0101
android·swiftui·swift
前端小巷子1 天前
JS 打造动态表格
前端·javascript·面试
脚踏实地,坚持不懈!1 天前
ANDROID,Jetpack Compose, 贪吃蛇小游戏Demo
android
Just_Paranoid1 天前
【JobScheduler】Android 后台任务调度的核心组件指南
android·alarmmanager·jobscheduler·workmanager
我命由我123451 天前
Android 开发 - 一些画板第三方库(DrawBoard、FingerPaintView、PaletteLib)
android·java·java-ee·android studio·安卓·android-studio·android runtime
程序员的世界你不懂1 天前
【Flask】测试平台开发,工具模块开发 第二十二篇
android·python·flask
Digitally1 天前
如何在安卓手机/平板上找到下载文件?
android·智能手机·电脑
硬件学长森哥1 天前
Android影像基础--cameraAPI2核心流程
android·计算机视觉