详细图解 Android vndBinder

68 篇文章 11 订阅
12 篇文章 0 订阅

详细图解 Android vndBinder

注意:本文基于 Android 8.1 进行分析
Qidi 2020.07.03 (Markdown & Haroopad)


【前言】
图虽然是根据 vndBinder 的类关系和调用顺序画出的,但实际上对于 Binder 和 hwBinder 也适用。

Binder driver 代码十分庞杂,基于安全考虑还存在与 LSM 的交互,所以这部分的调用关系图有所省略。


【Binder 通信概要】
如果说 Binder 通信机制是 Android 的心脏(数据流动好似血液循环),那么 ServiceManager 进程就是 Binder 通信的核心。在 user-space 空间,ServiceManager 必须在任何 Binder 请求来临前启动。
在这里插入图片描述


【Binder 类关系】
Binder 机制的框架已经非常稳固,我们只需编写 *.hal 文件,在其中将自定义服务的接口描述清楚,再分别实现 Bp 和 Bn 端就可以了。
在这里插入图片描述


【ServiceManager 启动】
ServiceManager 是一个独立进程,根据/frameworks/native/cmds/servicemanager/servicemanager.rc配置,在设备上电时,它会随 system 组一起启动。
在这里插入图片描述


【获取 ServiceManager】
在你自己的进程中调用 IServiceManager::defaultServiceManager() 即可获得 IServiceManager Bp端实例。
在这里插入图片描述


【注册(添加)vndBinder 服务】
获得 IServiceManager Bp端实例后,调用 addService(name, yourServiceInstance) 即可实现注册。
在这里插入图片描述


【查询(获取)vndBinder 服务】
获得 IServiceManager Bp端实例后,调用 getService(name) 即可获取目标 Binder 服务的 Bp端实例。
在这里插入图片描述


【vndBinder 跨进程调用】
vndBinder 跨进程调用的逻辑与 addService() 和 getService() 酷似,区别只在于传入的 Command Code 不同,以及 Binder 驱动中执行的 switch…case… 也相应不同。略。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面我会为您提供利用Android Studio设计一个记事本的详细图文教程,敬请参考。 1.创建新项目 打开Android Studio并创建一个新项目。选择“Empty Activity”作为您的模板。然后选择一个项目名称和位置,然后单击“Finish”按钮。 2.设计布局 设计记事本的布局。您需要添加一个EditText控件和一些按钮,例如保存,打开和新建。在XML文件中添加以下代码: ``` <EditText android:id="@+id/editText" android:layout_width="match_parent" android:layout_height="match_parent" android:inputType="textMultiLine" android:gravity="top|left" android:padding="10dp"/> <Button android:id="@+id/newFile" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="New"/> <Button android:id="@+id/openFile" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Open"/> <Button android:id="@+id/saveFile" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Save"/> ``` 3.处理按钮事件 接下来,您需要处理按钮的单击事件。在MainActivity.java文件中添加以下代码: ``` public class MainActivity extends AppCompatActivity { private EditText editText; private Button newFileButton, openFileButton, saveFileButton; private String fileName = ""; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); editText = (EditText) findViewById(R.id.editText); newFileButton = (Button) findViewById(R.id.newFile); openFileButton = (Button) findViewById(R.id.openFile); saveFileButton = (Button) findViewById(R.id.saveFile); newFileButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { editText.setText(""); fileName = ""; } }); openFileButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("text/plain"); startActivityForResult(intent, 1); } }); saveFileButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (fileName.equals("")) { Intent intent = new Intent(Intent.ACTION_CREATE_DOCUMENT); intent.addCategory(Intent.CATEGORY_OPENABLE); intent.setType("text/plain"); intent.putExtra(Intent.EXTRA_TITLE, "Untitled.txt"); startActivityForResult(intent, 2); } else { saveFile(fileName); } } }); } private void saveFile(String fileName) { try { FileOutputStream fos = openFileOutput(fileName, MODE_PRIVATE); fos.write(editText.getText().toString().getBytes()); fos.close(); Toast.makeText(this, "File saved.", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } } @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case 1: try { Uri uri = data.getData(); InputStream is = getContentResolver().openInputStream(uri); BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder stringBuilder = new StringBuilder(); String line = ""; while ((line = reader.readLine()) != null) { stringBuilder.append(line); } is.close(); editText.setText(stringBuilder.toString()); fileName = uri.getLastPathSegment(); Toast.makeText(this, "File opened.", Toast.LENGTH_SHORT).show(); } catch (IOException e) { e.printStackTrace(); } break; case 2: Uri uri = data.getData(); fileName = uri.getLastPathSegment(); saveFile(fileName); break; } } } } ``` 4.运行应用程序 现在,您已经成功创建了一个简单的记事本应用程序。您可以运行该应用程序并使用它来编辑,保存和打开文本文件。 总结 以上就是利用Android Studio设计一个记事本的详细图文教程,希望对您有所帮助。如果您有任何疑问,请随时联系我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值