Android 模拟器 Root 和 SuperSU 安装

前言

有时需要在 Android 模拟器上测试特定功能,需要使用到 Root 权限,例如访问某些系统配置、修改系统文件等。通常情况下在 adb shell 的环境下使用 su 命令以 Root 身份执行相关命令即可满足需求,但是还有命令行难以满足的情况,例如给一个第三方应用授予 Root 权限(赋予应用使用 su 命令的权限),如果直接使用命令修改 su 文件权限,使特定应用可以访问,不仅难以控制,而且可能造成滥用 Root 权限的安全风险。所以需要一个统一管理 Root 权限授予的工具,那么可以使用 SuperSU 工具。

SuperSU 是 Android 系统上著名的 Root 权限管理工具,安装此软件后,可以方便的对 Root 权限进行管理,那么后面安装 Xposed 等依赖 Root 的工具时就很容易了。

在 Android 真机上安装 SuperSU 的方比较容易,只需要获得 Root 权限即可快速安装,在 Android 模拟器上安装略有不同。

下面是在 Android 官方模拟器上获取 Root 权限和安装 SuperSU 的方法。

阅读更多

Android Dex 文件解析

前言

Java 代码文件在经过 javac 编译器编译后会产出 .class 格式的 Java 虚拟机可执行的字节码文件,而 Dex 文件则是 Android SDK 编译 Java 代码后的产物(Android SDK 使用 dx 或 d8 编译器将 .class 文件编译为 .dex 文件),了解 Dex 文件结构是理解 Android 虚拟机原理的基础,同时也是学习 Android 逆向工程的基础。

Dex 文件的文件后缀为 .dex,是 Android 虚拟机的可执行文件。

阅读更多

Android zygote 进程启动分析

前言

zygote 进程是 Android 系统中第一个拥有 Java 运行环境的进程,它由用户空间 1 号进程 init 进程通过解析 init.rc 文件创建,从 init 进程 fork 而来。从 zygote(受精卵)这个富含生物意义的名字可以知道,它是一个孵化器。Android 系统中所有运行在 Java 虚拟机中的系统服务以及应用均由 zygote 进程孵化而来。

理解 zygote 进程的启动过程以及所做的工作,将为理解 Java 层系统服务以及所有应用的进程启动流程打下基础。

阅读更多

Android init 进程启动分析

前言

Android 系统启动后,内核会创建 0 号内核进程 idle 进程,然后 idle 进程通过调用 kernel_thread 函数,以 kernel_init 函数作为参数,通过回调 kernel_init 函数执行可执行文件 /init 创建 Android 系统中的第一个用户级别的进程 init 进程,init 进程的 pid = 1,它是所有用户空间进程的始祖,init 进程会通过 fork 分裂出 servicemanager(Binder 服务管理服务)、zygote(Android 系统中第一个 Java 进程)以及 surfaceflinger(图形服务)等系统核心服务进程,理解 init 进程的启动过程以及所做的工作将为理解整个 Android 系统运行机制打下基础。

1
2
3
// kernel 3.18 - init/main.c

kernel_thread(kernel_init, NULL, CLONE_FS);
阅读更多

计算机启动原理

启动流程概述

  1. 开机加电;
  2. CPU 跳转到 BIOS 指令的的物理地址(在 Intel 平台为 0XFFFF0);
  3. BIOS 执行 POST(Power-On Self Test,硬件自检);
  4. 找到可启动的设备;
  5. 从 MBR 加载引导扇区;
  6. BIOS 将控制权移交给操作系统的 Boot Loader(引导加载程序)。
阅读更多

Android 应用进程 ServiceManager 的实现

实现一个普通应用进程中的 ServiceManager,可自由注册和获取 Binder 服务。

文末给出开源仓库地址。

Binder 相关基础可参考:android-binder-设计分析

实名 Binder 与匿名 Binder

实名 Binder

在 Binder 通信模型中,存在一个 ServiceManager 的角色,它作为 Android 系统的服务总管,负责建立 Binder 名字和 Binder 实体的映射。

提示:ServiceManager 中的 Service 和 android.app.Service 组件不是同一个概念。

阅读更多

好用的 Android 日志工具

简介

分享一个 Android 日志工具(Java 层),几乎我的每个项目都会用到,自认为非常好用,这里描述一下它的设计和实现。

它有如下几个特点:

  1. 简单,仅由一个 100 余行的 Java 类实现,猴子都能看懂 ^_^;
  2. 额外可选日志内容,提供线程名信息和调用栈,提供当前日志打印所在类以及所在代码行数;
  3. 方便,包含栈信息,直接用鼠标即可点击到日志打印所在行;
  4. 安全,保证日志字符串完全被优化掉,而不是留在代码中,下面会分析;
  5. 灵活,提供二次封装。

开源仓库地址在文末给出。

阅读更多

Android JNI 指南

前言

编写此文档的用意:

作为 Android NDK 项目开发的参考手册。

对于 NDK 工程的搭建可参考 Android NDK 指南

JNI 简介

JNI(Java Native Interface,Java 原生接口),是 Java 和 C++ 组件用以互相通信的接口。

Android 平台下的 JNI 支持由 Android NDK 提供,它是一套能将 C 或 C++(原生代码)嵌入到 Android 应用中的工具。

为什么要使用 JNI 在 Android 平台下进行编程:

  1. 在平台之间移植应用;
  2. 重复使用现有库,或者提供自己的库供重复使用;
  3. 在某些情况下提供高性能,特别是像游戏这种计算密集型应用;
  4. 提供安全性保障,在二进制层面比字节码层面的逆向工作更加困难。
阅读更多

Android NDK 指南

前言

编写此文档的用意:

  1. 作为搭建基础 NDK 工程的教程;
  2. 作为入门 NDK 工程的参考手册。

NDK 工程构建

可采用三种方式进行 NDK 工程的构建:

  1. 基于 Make 的 ndk-build,这是传统的 ndk-build 构建方式,使用 Makefile 方式进行构建,简洁高效;
  2. CMake 是新型的构建方式,CMake 具有跨平台的特性,通过 CMake 生成 Makefile 后再进行构建,CMake 的配置文件可读性更高;
  3. 其他编译系统,通过引入其他编译系统可对编译过程进行定制,例如引入 obfuscator-llvm 对源码进行混淆和压缩,增强源代码安全性。

下面是每种构建方式的基础示例,使用 Android Studio 4.0 和 NDK 21 进行如下构建。

阅读更多