多进程之Binder的意外死亡及权限校验

2024-01-09

Android多进程系列
  • Android 多进程通讯之几个基本问题
  • Android多进程之Binder的使用
  • Android多进程之手动编写Binder类
  • Android多进程之Binder解绑监听的问题
  • Android 多进程之Messenger的使用
经过前几篇文章,咱们对Binder的使用和工做流程有了必定的了解,可是还有几个问题休要咱们去解决。一个是若是服务端进程意外退出,Binder死亡,那客户端就会请求失败;还有一个就是权限校验问题,就是服务端须要校验一下客户端的身份权限,不能谁都能请求服务端的服务
Binder意外死亡的处理
给Binder设置DeathRecipient监听
  • 在绑定Service服务后的onServiceConnected回调中给Binder注册死亡回调DeathRecipient
private ServiceConnection mConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
        Log.e(TAG, "ServiceConnection-->"+ System.currentTimeMillis());
        IBookManager bookManager = BookManagerImpl.asInterface(iBinder);
        mRemoteBookManager = bookManager;
        try {
            //注册死亡回调
            iBinder.linkToDeath(mDeathRecipient,0);
            ...

        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName componentName) {
        Log.e(TAG, "onServiceDisconnected-->binder died");
    }
};
  • 在DeathRecipient中相应的处理,好比从新链接服务端
private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {
    @Override
    public void binderDied() {
        Log.e(TAG, "mDeathRecipient-->binderDied-->");
        if (mRemoteBookManager == null) {
            return;
        }
        mRemoteBookManager.asBinder().unlinkToDeath(mDeathRecipient, 0);
        mRemoteBookManager = null;
        //Binder死亡,从新绑定服务
        Log.e(TAG, "mDeathRecipient-->bindService");
        Intent intent = new Intent(MainActivity.this, BookManagerService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
    }
};
  • 为了测试,咱们在服务端添加结束进程的代码
@Override
public void onCreate() {
    super.onCreate();
    Log.e(TAG, "onCreate-->"+ System.currentTimeMillis());
    new Thread(new ServiceWorker()).start();
}

private class ServiceWorker implements Runnable {
    @Override
    public void run() {
        while (!mIsServiceDestoryed.get()) {
            try {
                Thread.sleep(5000);
            }catch (InterruptedException e) {
                e.printStackTrace();
            }

            int bookId = mBookList.size() + 1;
            if (bookId == 8) {
                //结束当前进程,测试Binder死亡回调
                android.os.Process.killProcess(android.os.Process.myPid());
                return;
            }
            ...
        }
    }
}
从上面的测试咱们能够看到客户端在服务端进程意外退出后,经过从新绑定服务又把服务端进程启动了。此外,咱们还能够在ServiceConnection的onServiceDisconnected方法中处理服务端进程意外退出的状况,方法是同样的,就不测试了。2种方法的区别就在于onServiceDisconnected方法在客户端的UI线程中被回调,而binderDied方法在客户端的Binder线程池中被回调
权限验证
在onBind中经过自定义权限来验证
  • 首先要自定义一个权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.xxq2dream.android_ipc">
    
    <permission
        android:name="com.xxq2dream.permission.ACCESS_BOOK_SERVICE"
        android:protectionLevel="normal"/>
    
</manifest>
  • 而后在Service中的onBind方法中校验
@Nullable
@Override
public IBinder onBind(Intent intent) {
    Log.e(TAG, "onBind-->"+ System.currentTimeMillis());
    int check = checkCallingOrSelfPermission("com.xxq2dream.permission.ACCESS_BOOK_SERVICE");
    if (check == PackageManager.PERMISSION_DENIED) {
        Log.e(TAG, "PERMISSION_DENIED");
        return null;
    }
    Log.e(TAG, "PERMISSION_GRANTED");
    return mBinder;
}
  • 从上图中咱们能够看到,因为咱们的应用客户端没有声明服务端校验的权限,因此服务端校验不经过,咱们只须要在咱们的客户端添加相应的权限声明便可
<uses-permission android:name="com.xxq2dream.permission.ACCESS_BOOK_SERVICE"/>


  
在onTransact方法中进行权限校验
private Binder mBinder = new BookManagerImpl(){
    @Override
    public List<Book> getBookList() throws RemoteException {
        Log.e(TAG, "getBookList-->"+ System.currentTimeMillis());
        return mBookList;
    }

    ...
    
    @Override
    public boolean onTransact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
        int check = checkCallingOrSelfPermission("com.xxq2dream.permission.ACCESS_BOOK_SERVICE");
        if (check == PackageManager.PERMISSION_DENIED) {
            Log.e(TAG, "PERMISSION_DENIED");
            return false;
        }
        
        String packageName = null;
        //获取客户端包名 
        String[] packages = getPackageManager().getPackagesForUid(getCallingUid());
        if (packages != null && packages.length > 0) {
            packageName = packages[0];
        }
        //校验包名
        if (!packageName.startsWith("com.xxq2dream")) {
            return false;
        }
        Log.e(TAG, "PERMISSION_GRANTED");
        return super.onTransact(code, data, reply,flags);
    }
};
结语
  • Binder的一个很好的应用就是推送消息和保活。好比咱们能够建立一个Service运行在一个独立的进程中,而后和咱们的应用进程中的一个Service绑定。独立进程的Service每隔必定的时间向咱们的服务端请求查看是否有新的消息,有的话就拉取新的消息,而后通知给应用进程的Service,执行弹出通知之类的操做。应用程序退出后,咱们的Service进程仍是存活的,这样就能够一直接收消息。固然,若是用户一键清理或是直接结束应用的话,咱们的Service进程仍然会被干掉。

转自: Android多进程之Binder的意外死亡及权限校验 - JavaShuo

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多进程之Binder的意外死亡及权限校验 的相关文章

  • Linux进程间通信如何选择“Key”?

    再会 我正在做作业 其中指出我有 5 个进程 一个服务器 其余的都是客户端 每个进程都应该由不同的可执行文件引发 我将实现一个双向消息传递解决方案 但问题不在于消息传递本身 有没有一种优雅的方式来传达key这些不同的可执行文件之间 即当我调
  • 使用 SMJobBless() 编写特权帮助工具

    尽管该 API 自 Mac OS X Leopard 以来就已开放 但令人惊讶且不幸的是 关于如何正确使用的文档却很少SMJobBless 用于创建特权帮助工具 即使直接从 Apple 的示例项目复制代码 也存在很多问题 幸运的是 我找到了
  • 使用匿名binder实现client向server端的死亡通知

    一 引言 因为binder是跨进程通信 难免会遇到服务端出现异常挂死的情况 这个时候需要通知到客户端进行相应的处理 在网络通信中是非常常见的机制 当然 在binder中 Android也为我们写好了相关的框架 但通过binder源码分析 你
  • AIDL通信过程中设置死亡代理

    关于AIDL的使用参考学习 https blog csdn net u011240877 article details 72765136 https blog csdn net iromkoear article details 5970
  • 信号会通过哪些方式干扰管道通信?

    我对信号一无所知 对管道也只有一点了解 从评论来看zdim s在这里回答 https stackoverflow com questions 48558093看来信号可能会干扰父进程和子进程之间的管道通信 有人告诉我 如果你使用IO Sel
  • 如何在 Windows 上进行非阻塞 IPC 读取?

    我有一个 Perl 脚本 它使用外部工具 cleartool 来收集有关文件列表的信息 我想使用 IPC 来避免为每个文件生成一个新进程 use IPC Open2 my cin cout my child open2 cout cin c
  • 如何从一个Windows控制台应用程序向另一个应用程序发送消息?

    我有一个启动子进程的 Windows 控制台应用程序 如何向子进程发送消息 我发现类似的功能PostMessage PeekMessage http msdn microsoft com en us library windows desk
  • 共享内存和IPC [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在阅读有关共享内存的教程 发现以下陈述 如果一个进程希望通知另一个进程新数据已插入共享内存 则必须使用信号 消息队列 管道 套接字
  • PHP - 访问用 C++ 创建的共享内存

    几天以来 我一直在努力让以下事情发挥作用 我有一个微型 C 程序 它从串行端口连续读取一些数据 该数据存储在共享内存中 如下所示 HANDLE hMapFile hMapFile CreateFileMapping INVALID HAND
  • 如何监控 FIFO?

    我想通过设置该流量的只读终端窗口来调试两个进程之间的问题 我可以简单地使用现有的标准 Linux 实用程序来实现这一点吗 FIFO 位于 run myfifo并在其中一个进程中创建 Create a FIFO if one doesn t
  • IPC::Run - 检测早产儿退出和关闭管道

    我想使用 IPC Run 通过孩子的 STDIN STDOUT 和 STDERR 开始 泵送 完成 与孩子进行通信 似乎有效 我想知道如何检测 儿童过早退出 例如由错误引起 水管被孩子关闭 The pump抛出一个die出现错误时 或将其消
  • 使用 Cromis IPC 进行双向通信

    我已经下载并玩了克罗米斯工控机 http www cromis net blog 2009 11 cromis ipc fast inter process communication named pipes 来自 Iztok Kacin
  • 有没有一种简单的方法可以清除C中的管道

    我有一个所有子进程都使用的管道 但在子进程使用该管道与父进程通信之前 我需要清除它 以便父进程正确读取它 C 中有一个简单的函数可以做到这一点吗 清除 管道的方法是从管道中读取数据 直到缓冲区为空 这对你没有帮助 我猜测您真正的问题是父级可
  • 通过 mmap 文件进行 IPC:应该使用原子和/或易失性吗?

    我使用 mmap 文件在进程之间共享数据 代码是这样的 struct Shared int Data int file open file dat O RDWR Shared shared static cast
  • IPC 的共享内存和线程的共享内存有什么区别?

    让我们使用 POSIX 共享内存 例如 shmget 协调进程间通信的常见调用 调用 shmget 并协调共享内存段上的通信与 Linux 在单个进程中实现共享内存和线程之间的同步有何不同 其中之一更轻吗 SHM适用于多进程中的IPC 在现
  • msgrcv - SA_RESTART 标志不起作用

    我的使用 IPC 队列在线程之间通信的代码有问题 我需要安全地处理 SIGINT 让程序在关闭之前出现 SIGINT 时完成所有活动线程 不过 我在寻找解决方案方面遇到了严重的问题 因为即使使用带有标志 SA RESTART 的 SIGIN
  • 如何从单独的进程监控应用程序崩溃

    我有一个特定的 net 应用程序 偶尔会因以下 Windows 错误之一而崩溃 application name has encountered a problem and needs to close We are sorry for t
  • 远程过程调用认证

    我正在使用远程过程调用 RPC 在本地计算机上通信数据 我的要求是使用 RPC 在两个处理之间通信数据 但服务器应该通过某种方式对客户端进行身份验证 我遇到了 RpcBindingSetAuthInfo 它设置身份验证和授权信息 第四个参数
  • 从 createProcess 外部获取的句柄读取

    我正在尝试创建一个进程 并通过我在外部提供的句柄与其进行通信createProcess功能 stdOutH lt openFile logDir gt stdout log ReadWriteMode hSetBuffering stdOu
  • 如何在同一设备上运行的 Android 应用程序之间传输文件?

    我正在编写一个与 RESTful 服务交互的 Android 应用程序 该 Web 服务本质上是一个文件系统 并提供元数据以及对文件的 CRUD 访问 我的应用程序检索元数据 并通过ContentProvider 我需要添加与我的应用程序在

随机推荐

  • 网工我劝你,这11种协议报文格式要烂熟于心!

    你们好 我的网工朋友 你最熟悉的报文是啥 TCP UDP 在网络世界里 就如同道路系统让车辆畅通无阻一样 网络协议是确保信息顺畅传输的关键 作为网络工程师 理解网络协议的种类与结构至关重要 今天就和你一起探索一下11种关键协议报文格式啊 包
  • TS 36.211 V12.0.0-下行(1)-时隙结构和物理RE

    本文的内容主要涉及TS 36 211 版本是C00 也就是V12 0 0
  • 基于2x2mimo系统的ML最大似然均衡matlab仿真

    目录 1 算法仿真效果 2 MATLAB源码 3 算法概述 4 部分参考文献 1 算法仿真效果 matlab2022a仿真结果如下 2 MA
  • 毕设英文摘要怎么降重

    大家好 今天来聊聊毕设英文摘要怎么降重 希望能给大家提供一点参考 以下是针对论文重复率高的情况 提供一些修改建议和技巧 可以借助此类工具 毕设英文摘要降重策略 在毕业设计中 英文摘要的撰写是一个重要的环节 由于英文摘要的表述方式和语法与中文
  • Appium —— 初识移动APP自动化测试框架Appium

    说到移动APP自动化测试 代表性的测试框架非Appium莫属 从今天开始我们将从 APP结构解析 Appium框架学习 安卓 iOS自动化测试实战 自动遍历回归测试 自动化测试平台及持续集成 多个维度一起由浅入深的学废Appium 今天我们
  • 研发实验室装修

    研发实验室在企业 高校和研究机构中的地位日益凸显 一个优质的研发实验室装修方案不仅能提升实验室的整体形象 还能提高科研人员的工作效率 激发创新精神 本文将从设计理念 空间规划 材料选择及环保安全等方面 SICOLAB喜格 探讨如何打造高效创
  • Python selenium实现断言3种方法解析

    1 if else 判断进行断言 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
  • INT201 形式语言与自动机笔记(下)

    L6 Context Free Languages 上下文无关语言 Context Free Grammar CFG 是一组用于生成字符串模式的递归规则 上下文无关的语法可以描述所有的常规语言 但它们不能描述所有可能的语言 e g 遵循这些
  • 研发实验室建设

    研发实验室是科技创新的核心场所 对于企业的技术研发和产品创新具有重要意义 为了提高研发实验室的效率和质量 建设一个符合要求的实验室是至关重要的 SICOLAB喜格 将介绍研发实验室建设的关键要素和注意事项 一 实验室规划与布局 1 空间规划
  • 软件测试开发/全日制/测试管理丨持续集成、持续交付、持续部署

    持续集成 持续交付 持续部署 是构建现代软件开发流程的三大支柱 这三个概念代表了现代软件开发中重要的实践 它们旨在通过自动化和频繁的发布流程来提高开发团队的效率和软件交付的可靠性 持续集成 CI 持续集成是指开发人员将代码频繁地集成到共享的
  • 智慧农业之新导物联RFID果园苗圃系统-新导物联

    新导物联RFID果园苗圃系统是一种利用射频识别技术 RFID 来管理果园和苗圃的系统 该系统通过在植物或容器上附加RFID标签 将每个植物或容器与唯一的识别代码相关联 使用RFID果园苗圃系统的主要目的是实现对植物和容器的自动化追踪和管理
  • 【数据压缩】基于哈夫曼编码的数据压缩算法matlab,输出哈夫曼编码树

    目录 1 算法仿真效果 2 MATLAB源码 3 算法概述 3 1 哈夫曼树构建 3 2 哈夫曼编码生成
  • 职场生存能力最强的5类人:如何成为职场中的佼佼者?

    职场生存能力最强的5类人 如何成为职场中的佼佼者 在职场中 生存能力强的人往往更容易获得成功 他们具备各种能力和特质 使他们能够在激烈的竞争中脱颖而出 本文将介绍职场生存能力最强的5类人 看看你是否具备这些特点 一 适应能力强的人 在职场中
  • Jmeter扩展函数?年薪50W+的测试大佬教你怎么玩

    很多同学 都问我 老师 我的 jmeter 里面 怎么没有 MD5 函数 base64 函数也没有 我是不是用了假的 jmeter 哈哈哈 不是的 jmeter 的函数 有自带函数和扩展函数两大块 自带函数 就是 jmeter 官方自带的
  • 计算机丢失mfc140.dll怎么办?解决mfc140.dll缺失的3种方法分享

    计算机丢失mfc140 dll怎么办 在使用微软办公软件的时候 可能会弹出一个错误提示框说 找不到mfc140 dll 无法继续执行代码 为了不影响工作效率 我们可能需要亲自动手尝试修复这一问题 以下是一些mfc140 dll缺失的3种方法
  • INT201 形式语言与自动机笔记(上)

    Lec1 Overview Alphabet and String 字母表与字符串 Alphabet 字母表 a finite nonempty set of symbols String word a finite sequence of
  • 如何处理不稳定的自动化测试?

    abluecolor 在解决这个问题之前 请停止编写更多测试 因为这将花费你较高的测试维护成本 你需要尽快行动起来对不稳定的原因进行深入研究 找到不稳定的根因 并且尝试在流程 环境和代码方面做一些优化工作解决它 MasterKindew 如
  • mybatisPlus 将List<String>字段转成json字符串,使用JacksonTypeHandler以及自定义类型处理器实现

    文章目录 场景 使用JacksonTypeHandler实现类型转换 自定义StringListTypeHandler处理器实现 场景 项目中经常需要将List转成json存储到配置文件中 mybatisPlus默认实现了JacksonTy
  • Stable Diffusion运行时自动重启的小程序

    Stable Diffusion在运行过程中 常常因为各种原因导致服务挂掉 所以希望能定时检查程序是否存活 如果dead则重启一下 思路 stable diffusion运行时需要使用GPU 如果GPU没有在用 并且GPU对应的进程也找不到
  • 多进程之Binder的意外死亡及权限校验

    Android多进程系列 Android 多进程通讯之几个基本问题 Android多进程之Binder的使用 Android多进程之手动编写Binder类 Android多进程之Binder解绑监听的问题 Android 多进程之Messe