禁用adb install 安装app功能

这篇具有很好参考价值的文章主要介绍了禁用adb install 安装app功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.前言

在android 的产品开发只中,在进行一些定制开发中,对于一些apo需要通过属性来控制禁上安装,adb nstl也不分许安装,所以就典熟悉adb install的安装流程,然后来禁用adb install安装功能,接下来分析下adb 下的安装流程

2.禁用adb install 安装app功能的核心类

system\core\adb\daemon\abb.cpp
system\core\adb\daemon\shell_service.cpp

3.禁用adb install 安装app功能的核心功能分析和实现

在android 的产品中,在通过adb install 进入 adb install安装模式后正常可以进行安装app的相关操作,而adb 是pc端工具,adbd是服务端Q,运行在手机 adbd 读取 socket 解析由 adb 传过来的命令串,解析相关的命令执行相关功能,所以在pc端输入adb 相关命令就会在systemlcoreladb 模块解析相关命令所以说在abb.cpp中来作为服务端来执行相关功能

3.1abb.cpp相关源码分析

在system中的adb install 安装apk的时候会有下面的log,有install字样。会调用StartCommandlnProcess和execCmd执行命令abb.cpp里面的bin程序一直在读命令ReadProtocolString,abb这个程序开机就在后台运行

 
  std::vector<std::string_view> parseCmdArgs(std::string_view args) {
      std::vector<std::string_view> argv;
  
      char delim = ABB_ARG_DELIMETER;
      size_t size = args.size();
      size_t base = 0;
      while (base < size) {
          size_t found;
          for (found = base; found < size && args[found] && args[found] != delim; ++found)
              ;
          if (found > base) {
              argv.emplace_back(args.substr(base, found - base));
          }
          base = found + 1;
      }
  
      return argv;
  }
  
  }  // namespace
  
  static int execCmd(std::string_view args, int in, int out, int err) {
      AdbFdTextOutput oin(out);
      AdbFdTextOutput oerr(err);
      return cmdMain(parseCmdArgs(args), oin, oerr, in, out, err, RunMode::kLibrary);
  }
int main(int argc, char* const argv[]) {
    signal(SIGPIPE, SIG_IGN);
 
    int fd = STDIN_FILENO;
    std::string data;
    while (true) {
        std::string error;
        if (!ReadProtocolString(fd, &data, &error)) {
            PLOG(ERROR) << "Failed to read message: " << error;
            break;
        }
 
        std::string_view name = data;
        auto protocol = SubprocessProtocol::kShell;
        if (android::base::ConsumePrefix(&name, "abb:")) {
            protocol = SubprocessProtocol::kShell;
        } else if (android::base::ConsumePrefix(&name, "abb_exec:")) {
            protocol = SubprocessProtocol::kNone;
        } else {
            LOG(FATAL) << "Unknown command prefix for abb: " << data;
        }
 
        unique_fd result = StartCommandInProcess(std::string(name), &execCmd, protocol);
        int max_buf = LINUX_MAX_SOCKET_SIZE;
        adb_setsockopt(result, SOL_SOCKET, SO_SNDBUF, &max_buf, sizeof(max_buf));
        if (android::base::SendFileDescriptors(fd, "", 1, result.get()) != 1) {
            PLOG(ERROR) << "Failed to send an inprocess fd for command: " << data;
            break;
        }
    }
}

从abb.cpp的上述的相关的源码中,可以知道abb.cpp里面的bin程席一直在读命令ReadProtocolStringabb这个程序开机就在后台运行,可以接收pc端的相关命令,在parseCmdArgs(std:string view args )中解析从adb的命令中解析命令
接下来分析下shell service.cpp中的
StartCommandInProcess相关命会分析

3.2 shell service.cpp的相关源码分析

在system/core/adb的模块中,在通过上述的分析得知,在这个shell service.cpp中负责在接收c端adb的相关命令中,负责解析,首先在StartCommand nProcess/std.sting name. Command command SubprocessProtocol prtoco 中fadb insta开t装app的相关
功能的实现

 
  unique_fd StartSubprocess(std::string name, const char* terminal_type, SubprocessType type,
                            SubprocessProtocol protocol, bool make_pty_raw,
                            SubprocessProtocol error_protocol, unique_fd* error_fd) {
      D("starting %s subprocess (protocol=%s, TERM=%s): '%s'",
        type == SubprocessType::kRaw ? "raw" : "PTY",
        protocol == SubprocessProtocol::kNone ? "none" : "shell", terminal_type, name.c_str());
  
      auto subprocess = std::make_unique<Subprocess>(std::move(name), terminal_type, type, protocol,
                                                     make_pty_raw);
      if (!subprocess) {
          LOG(ERROR) << "failed to allocate new subprocess";
          *error_fd = ReportError(error_protocol, "failed to allocate new subprocess");
          return {};
      }
  
      std::string error;
      if (!subprocess->ForkAndExec(&error)) {
          LOG(ERROR) << "failed to start subprocess: " << error;
          *error_fd = ReportError(error_protocol, error);
          return {};
      }
  
      unique_fd local_socket(subprocess->ReleaseLocalSocket());
      D("subprocess creation successful: local_socket_fd=%d, pid=%d", local_socket.get(),
        subprocess->pid());
  
      if (!Subprocess::StartThread(std::move(subprocess), &error)) {
          LOG(ERROR) << "failed to start subprocess management thread: " << error;
          *error_fd = ReportError(error_protocol, error);
          return {};
      }
  
      return local_socket;
  }
//add core start
#include <stdio.h>
bool isAllowInstall() {
	std::string value = android::base::GetProperty("persist.sys.isallow", "true");
	if (strcmp("true", value.c_str()) == 0)
      return true;
	else
	  return false;	
}
//add core end
 
unique_fd StartCommandInProcess(std::string name, Command command, SubprocessProtocol protocol) {
    LOG(INFO) << "StartCommandInProcess(" << dump_hex(name.data(), name.size()) << ")";
 
//add core start
	std::string namestring = dump_hex(name.data(), name.size());
	std::string install_flag="package.install";
	std::string::size_type idx=namestring.find(install_flag);
//add core end
 
    constexpr auto terminal_type = "";
    constexpr auto type = SubprocessType::kRaw;
    constexpr auto make_pty_raw = false;
 
    auto subprocess = std::make_unique<Subprocess>(std::move(name), terminal_type, type, protocol,
                                                   make_pty_raw);
//add core start
	if(idx == std::string::npos ){
	     LOG(ERROR) << "the command do not include package.install string";
	}else{
	  if(!isAllowInstall()) {
	     LOG(ERROR) << "can not allow to install app" ;
	     return ReportError(protocol, "can not allow to install app by adb install command");
	  }else 
	     LOG(ERROR) << "Allow to install app";
	}
//add core end
 
											   
    if (!subprocess) {
        LOG(ERROR) << "failed to allocate new subprocess";
        return ReportError(protocol, "failed to allocate new subprocess");
    }
 
    std::string error;
    if (!subprocess->ExecInProcess(std::move(command), &error)) {
        LOG(ERROR) << "failed to start subprocess: " << error;
        return ReportError(protocol, error);
    }
 
    unique_fd local_socket(subprocess->ReleaseLocalSocket());
    D("inprocess creation successful: local_socket_fd=%d, pid=%d", local_socket.get(),
      subprocess->pid());
 
    if (!Subprocess::StartThread(std::move(subprocess), &error)) {
        LOG(ERROR) << "failed to start inprocess management thread: " << error;
        return ReportError(protocol, error);
    }
 
    return local_socket;
}

在上述的shell service.cpp的相关源码中分析得知,在通过判断dump hex(name.data(),name.size()中是否有package.install字符来判断是否执行adb install安装app的命令,然后在通过调用isAllowInstal()来判断系统属性persist.sys.isallow是否允许安装app,当为false就表示禁止安装第=方app,这时候就返回ReportError(protocol,“can not allow to install app by adb install command”).就实现禁止通过adb install来安装第三方app功能文章来源地址https://www.toymoban.com/news/detail-729175.html

到了这里,关于禁用adb install 安装app功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 完美解决Android adb install 安装提示 INSTALL_FAILED_TEST_ONLY

    目录 所遇问题 有些时候我们用命令进行安装apk如下: 但是会安装不成功,报如下错误: 错误现象:提示:Failed to install app-debug.apk: Failure [INSTALL_FAILED_TEST_ONLY: installPackageLI] 那么我们究竟应该怎么解决呢? 解决思路 查阅Android相关文档,并打印相关adb 命令帮助,如下图,进过

    2024年02月04日
    浏览(47)
  • 【Android】adb安装错误:INSTALL_FAILED_UPDATE_INCOMPATIBLE可尝试的解决方法

    1、问题描述 最近打包在测试机上安装应用遇到了这样的错误: 网上的说法是因为包体签名有修改过,旧包虽然卸载了,但还有信息残留在手机里。我回想一下好像确实干过更换包体签名这个事。 2、解决方法 在出现安装错误的测试机上通过adb命令卸载包名对应包体,即便你

    2024年02月11日
    浏览(44)
  • android@adb连接电脑和android设备@安装和卸载@清除app数据

    Android 调试桥 (adb) | Android 开发者 | Android Developers android设备端设置和准备 USB选项: 选择 文件传输 而不是仅充电(只会导致文件传输等功能无法生效) 典型错误: more than one device/emulator 打开 开发者选项 (developerOptions) 启用USB调试(USB debugging) Switche to debugging mode when USB is connected 允

    2024年02月04日
    浏览(54)
  • 【Android Studio】安装app报错Installation did not succeed. The application could not be installed: INSTALL

    安装app demo报错;app安装不上 Installation did not succeed. The application could not be installed: INSTALL_FAILED_INSUFFICIENT_STORAGE The device needs more free storage to install the application (extra space is needed in addition to APK size). 程序或手机内存空间不足 清理程序内存:Build - Clean Project 清理手机内存:清理多

    2024年02月07日
    浏览(58)
  • Android DownloadManager 下载安装App功能实现

    @[DownlaodManager 实战] 升级功能是APP必备功能,本文以下载安装APP的完整流程来说明 DownlaodManager 的基本使用方法。 下载需要互联网权限,需要申请 uses-permission android:name=\\\"android.permission.INTERNET\\\" / 权限; 安装APP,需要申请 uses-permission android:name=\\\"android.permission.REQUEST_INSTALL_PACKAGE

    2024年02月02日
    浏览(36)
  • 【Android】通过命令行adb install 将apk下载到手机之中

    mac 电脑中有一个apk,想将该apk下载install到Android手机中。 首先在手机中删除原有的apk,然后再连上数据线到电脑中(我是在Android studio的命令行)进行如下的命令行: 路径按照实际的输入即可

    2024年02月11日
    浏览(60)
  • Android 13.0 开启禁用系统接收短信功能

     在13.0的系统rom定制化中,在一些wifi产品的机器中,对于系统4g部分的功能需要裁剪 比如拨打电话 接听电话 短信功能等这部分 需要禁用系统对应的功能,接下来就来初步分析下系统中接收短信部分功能,然后实现禁用接收短信功能 对于Mms应用程序来讲主要就是在信息数据

    2024年02月22日
    浏览(60)
  • Android 12.0 禁用和启用拨打电话功能实现

     在12.0的产品定制化开发中,在一些wifi产品的产品开发中,对于系统4g部分的功能需要裁剪 比如拨打电话 接听电话 短信功能等这部分 需要禁用系统对应的功能,接下来就来初步分析下系统中拨打电话部分功能,然后实现禁用拨打电话功能 在系统中TelecomManager 主要是提供有

    2024年02月09日
    浏览(35)
  • android app代码中执行adb指令

    方案1:使用Runtime类 方案二、

    2024年02月12日
    浏览(62)
  • Android adb命令 关闭app 和 启动app 还有重启app命令

    以下是Android中使用adb命令关闭应用程序、启动应用程序和重启应用程序的方法: 1.关闭应用程序 使用以下命令可以关闭正在运行的应用程序: 其中,package_name是您要关闭的应用程序的包名。例如,要关闭Google Chrome应用程序,您可以使用以下命令: 2.启动应用程序 使用以下

    2024年02月11日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包