0%

【PoRE#0x02】Android APP Reverse PartII

上篇见 这里
本篇施工中……

4 Advanced App Features

4.1 Multi-threading

多线程是一种常见的提升程序性能的技术,在 Android 中也普遍使用。
比如,Android 中所有的 UI 交互都是由一个线程来处理的,这个线程被称为 UI Thread。实际上,这个线程就是应用程序的主线程(Main Thread),大部分组件都运行在这个线程中。
有些耗时的操作不能在主线程中运行(比如网络相关的操作),开发者需要手动为其开启新的线程。当这些工作线程需要操作 UI 时,他们通过发消息给 UI 线程完成。

接下来介绍 Java 中创建线程的方法、UI 线程、以及线程间交互的方法(包括复杂的 Asynchronous Messaging 与简化后的 AsyncTask)。

4.1.1 Java Multi-threading

参考:Java 多线程编程 | 菜鸟教程 (runoob.com)

// TODO

4.1.2 Android UI Thread

所有与 UI 相关的操作都在 UI 线程中进行,换句话说,想要进行 UI 操作,就必须通过 UI 线程来完成。
开发者通过在 UI 线程中注册回调函数(callback)来处理 UI 事件(handler UI event)。当 UI 线程收到事件时,它就会调用注册好的回调函数。

这里再引出一个概念 —— Listener,这是一个接口类,包括了一些回调方法。比如 View.OnClickListener 就是一个 View 提供的 Listener。View 提供了哪些 Listener 可以查看 View  |  Android Developers。别的一些类也会提供 Listener,比如 android.net.wifi.WifiManager.SuggestionConnectionStatusListener

如果开发者想要为某个按钮(Button)设置用户点击它时干一些事情,那么:

  1. 开发者首先实现(implement)一个 View.OnClickListener 类,在其中实现 onClick(View) 方法(每个 Listener 对应的方法需要查询 API)。
  2. 调用目标按钮的 setOnClickListener 方法,参数为刚才的类的实例。

于是 UI Thread 在按钮被点击的时候,就会调用之前注册的 onClick 函数。

4.1.3 Asynchronous Messaging (Handler)

参考:
Android异步通信:手把手教你使用Handler消息传递机制(含实例讲解)_Carson带你学Android的博客-CSDN博客
3.3 Handler消息传递机制浅析 | 菜鸟教程 (runoob.com)

人为开启的工作线程如何与 UI 线程通信?这就引出了 Handler 机制,这是一种异步的通信机制。这里又要引入一些概念:

  • Message:线程间通讯的数据单元;
  • Message Queue:存储 Handler 发来的 Message,是 Looper 的一部分;
  • Handler:主线程和工作线程通信的媒介,把 Message 送往 Message Queue 并读取 Looper 分派来的数据;
  • Looper:循环取出 Message Queue 的 Message 并发送给 Handler 进行处理。

注意:每个线程只有一个 Looper,每个 Looper 拥有其 Message Queue。不过多个线程的 Handler 可以往同一个 Looper 发送 Message。

如果子线程直接从主线程中派生,且 Handler 在主线程中定义,那么子线程直接调用那个 Handler 实例的 sendMessage 方法就可以发送 Message 了。
如果 Handler 在子线程中定义,请参考上面的参考。

4.1.4 AsyncTask

写通信还是挺麻烦的,所以有了 AsyncTask 机制 —— 自动创建一个线程,等运行完自动返回结果给 UI 线程。开发者只需要 override 以下几个方法就能实现这个 AsyncTask 的逻辑:

  1. onPreExecuted(): before the task is executed, setup
  2. doInBackgroud(): perform computation, publish
    progress
  3. onProgressUpdate(): display progress
  4. onPostExecute (): publish result

在主线程中,只要运行其实例 execute 方法就行了。

4.2 Java Native Interface

// TODO

4.3 Object Serialization

// TODO

4.4 Java Reflection

// TODO

5 Android Security

5.1 Android Sandbox

// TODO

5.2 Android Permission

// TODO

5.3 App Certificate

// TODO

5.4 App Configs

// TODO

6 App Vulnerability

6.1 Memory Bugs

// TODO

6.2 Logical Bugs

// TODO