【ASeeker】Android 源码捞针,服务接口扫描神器
ASeeker
是一个Android
源码应用系统服务接口扫描工具。
项目已开源:
如果您也喜欢 ASeeker,别忘了给我们点个星。
说明
ASeeker
项目是我们在做虚拟化分身产品( 『 空壳 』 )过程中的内部开发工具,目的是为了提升Android
系统各版本适配效率。由于产品需支持 Android 9.x ~ Android 14.x
,需在应用访问所有的系统服务接口时,将我们关心的参数进行修正和还原。
这导致每个系统版本适配的工作量巨大,且很容易遗漏。因此我们开发了这个源码接口扫描工具,可以快速从Android
源码中搜索我们需要的AIDL
接口和服务,并安装定制的格式输出。
感谢开源项目com.github.javaparser
,因为它的存在才让ASeeker
成为可能,这也是我们开源ASeeker
的动力。
ASeeker
的特点:
- 完整源码
AIDL
接口扫描。 - 支持多目录关联递归类型查找识别。
- 支持泛型类,内部类和继承类递归查找。
- 支持匹配配置名单。
- 支持
Android
代码语言规范格式化。 - 支持查找结果的定制输出。
如何使用
# 确保 asseker.jar 和 res 在同一目录下
# aseeker [-options]
# -p [SDK version code] [source code path]
$ java -jar aseeker.jar -p 33 /Users/abc/android_13.0_r13
输出结果目录:(包含扫描结果和执行过程日志)
输出文件内容:(可自定义输出内容格式)
package android.app.os.service;
import android.app.os.base.ProxyServiceBase;
// source code: /frameworks/base/core/java/android/view/accessibility/IAccessibilityInteractionConnectionCallback.aidl
public class IAccessibilityInteractionConnectionCallback extends ProxyServiceBase {
// 10.0 void setFindAccessibilityNodeInfoResult(AccessibilityNodeInfo info, int interactionId);// argument: AccessibilityNodeInfo:info -> CharSequence::mPackageName
public static final String sMethod_setFindAccessibilityNodeInfoResult = "setFindAccessibilityNodeInfoResult";
// 10.0 void setFindAccessibilityNodeInfosResult(List<AccessibilityNodeInfo> infos, int interactionId);// argument: List<AccessibilityNodeInfo>:infos -> CharSequence::mPackageName
public static final String sMethod_setFindAccessibilityNodeInfosResult = "setFindAccessibilityNodeInfosResult";
}
功能实现
需求
为了实现应用虚拟化,我们需要将应用与系统服务接口通信中包含包名,路径的参数,函数名和返回值的接口进行适配。在访问之前需要修正为安装应用的信息,访问结果需要还原为原应用的信息。
因此,我们需要:
递归查找参数中包含类型为
String
的名字含包名的接口,如:package
,pkg
等。void func(String pkg);
void func(ComponentName cn);// 因为ComponentName中有成员:mPackageName
递归查找返回值中包含类型为
String
的名字含包名的接口,如:package
,pkg
等。ComponentName getComponentName();
查找返回值为
String
但是函数名包含包名的接口。String getPackageName();
打印输出找到的具体路径。
// 11.0 boolean enterPictureInPictureMode(IBinder token, PictureInPictureParams params);// argument: PictureInPictureParams:params -> List<RemoteAction>::mUserActions -> PendingIntent::mActionIntent
public static final String sMethod_enterPictureInPictureMode = "enterPictureInPictureMode";
文件预处理
由于javaparser
只支持基础的Java
类语言规范,对于Android
平台定制标签,关键字等不支持,所以需要对目标文件先进行格式化处理,去除这些属性。
// @from: com.ifms.cmpt.aseeker.AidlFormator.java
Pattern.compile("(?<![\\w])IN\\s+([a-zA-Z_])"),
Pattern.compile("(?<![\\w])in\\s+([a-zA-Z_])"),
Pattern.compile("(?<![\\w])OUT\\s+([a-zA-Z_])"),
Pattern.compile("(?<![\\w])out\\s+([a-zA-Z_])"),
Pattern.compile("(?<![\\w])INOUT\\s+([a-zA-Z_])"),
Pattern.compile("(?<![\\w])inout\\s+([a-zA-Z_])"),
private static final String PATTERN_AT = "@\\w[\\w.]*\\s*(\\([^)]*\\))?"; // rm @Nullable, @android.app.XXX(xxx)
private static final String PATTERN_ABSTRACT = "\\)\\s*=\\s*\\d+\\s*;$";// rm ") = ${number};"
private static final String PATTERN_BRIEF = "/\\*.*?\\*/";// rm "/*xxx*/"
private static final String ONEWAY = "oneway ";
private static final String PARCELABLE = "parcelable ";
private static final String UNION = "union ";
类查找
为了可以准确识别类型,需要完整的查找到参数类型。
- 当前同目录下查找。
- 当前同工程目录下查找。
framework/base
目录下查找。Android SDK
目录下查找(可在config.txt
中配置ANDROID_HOME
路径)。
个性化配置
1. 全局配置: config.txt
# 配置Android SDK源码路径
ANDROID_HOME=C:\Users\Administrator\AppData\Local\Android\Sdk
# 配置最大递归访问深度,提升效率
MAX_LEVEL=4
2. 忽略类型: ignore.txt
byte
short
int
long
char
float
double
void
boolean
3. 忽略文件: ignore-file.txt
忽略明确不需要关注的接口类,这样不会出现在结果中。
# 系统服务使用
RemoteServiceCallback.aidl
# 系统WiFi管理模块,需要系统权限
IWifiScanner.aidl
4. 匹配类型: match.txt
ApplicationInfo
ComponentName
PackageInfo
ActivityInfo
ServiceInfo
ProviderInfo
5. 文件映射: mapping.txt
可以定制输出结果文件名。
# rename out file
# ${Android source file}=${target file}
# such as:
IActivityManager=IAMS
6. 输出模板: template.java
定制输出模板可以更好的和我们工程的代码融合,易于代码和结果对比。
package android.app.os.service;
import android.app.os.base.ProxyServiceBase;
@templateFile@
public class @templateClass@ extends ProxyServiceBase {
@templateMethod@
}
【ASeeker】Android 源码捞针,服务接口扫描神器的更多相关文章
- Android源码服务专家(申明:来源于网络)
Android源码服务专家(申明:来源于网络) 地址:http://www.javaapk.com/topics/demo/page/20/
- Android源码阅读 – Zygote
@Dlive 本文档: 使用的Android源码版本为:Android-4.4.3_r1 kitkat (源码下载: http://source.android.com/source/index.ht ...
- android源码的目录结构
android源码的目录结构 [以下网络摘抄] |-- Makefile ! l/ a5 n% S% @- `0 d# z# a$ P4 V3 o7 R|-- bionic ...
- Android源码笔记——Camera系统架构
Camera的架构与Android系统的整体架构保持一致,如下图所示,本文主要从以下四个方面对其进行说明. Framework:Camera.java Android Runtime:android_ ...
- Android源码-学习随笔
在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...
- Android源码分析-全面理解Context
前言 Context在android中的作用不言而喻,当我们访问当前应用的资源,启动一个新的activity的时候都需要提供Context,而这个Context到底是什么呢,这个问题好像很好回答又好像 ...
- android源码编译1
一.环境说明: 1.liunx系统:Ubuntu12.04 2.jdk:sun-java6-jdk 3.g++4.5 gcc4.5 二.android源码的目录结构 |-- Makefile |-- ...
- 访何红辉:谈谈Android源码中的设计模式
最近Android 6.0版本的源代码开放下载,刚好分析Android源码的技术书籍<Android源码设计模式解析与实战>上市,我们邀请到它的作者何红辉,来谈谈Android源码中的设计 ...
- 从Android源码的角度分析Binder机制
欢迎访问我的个人博客,原文链接:http://wensibo.top/2017/07/03/Binder/ ,未经允许不得转载! 前言 大家好,好久不见,距离上篇文章已经有35天之久了,因为身体不舒服 ...
- Android源码解析——Toast
简介 Toast是一种向用户快速展示少量信息的视图.当它显示时,它会浮在整个应用层的上面,并且不会获取到焦点.它的设计思想是能够向用户展示些信息,但又能尽量不显得唐突.本篇我们来研读一下Toast的源 ...
随机推荐
- [Unreal] 虚拟现实理论与最佳实践
优秀的虚拟现实场景所需要具备的特点: 真实感.沉浸感.舒适性.流畅性. VR的这些特点上有其它媒体所不具备的优势,主要通过硬件来实现. VR 的沉浸感让用户置身于周围世界,也引发了一些独特的症状: 眼 ...
- [FAQ] golang-migrate/migrate error: default addr for network '127.0.0.1:3306' unknown
按照项目github文档上所示,在使用 mysql 时你可能会这样写: $ migrate -path db/migrations -database mysql://root:123456@127. ...
- dotnet 警惕 Assembly.Location 返回空
在大部分情况下,获取当前所运行的应用程序的所在路径时,常用的就是 Assembly.Location 属性,按照之前的经验,使用 Assembly.Location 是最为稳定的做法,然而在 dotn ...
- [WC/CTS2024] 线段树 题解
Link 纪念一下场切题. 题意:给定一棵(分点不一定为中点)的线段树,给定若干个询问区间,问有多少个线段树上结点的集合,知道了这些结点对应的区间和就可以知道任何一个询问区间的和. 从询问区间开始考虑 ...
- Git——关于Git的一些补充(1)
Git--关于Git的一些补充(1) 提示:图床在国外且动图比较多的情况下,需要时间加载. 目录: 目录 Git--关于Git的一些补充(1) 提示:图床在国外且动图比较多的情况下,需要时间加载. 目 ...
- Blazor/Hybird 触屏下单程序调优笔记
环境 Blazor Net8.0 + FreeSql + Bootstrap Blazor 组件 以下都是自己瞎琢磨的和官网资料搬运,肯定有不少错漏和不合理的地方,非常希望各位大佬评论区给我建议和意见 ...
- ansible(17)--ansible的archive和unarchive模块
1. archive模块 功能:在远端主机打包与压缩: 主要参数如下: 参数 说明 path 要压缩的文件或目录 dest 压缩后的文件 format 指定打包压缩的类型:bz2.gz.tar.xz. ...
- ansible(9)--ansible的yum模块
1. yum模块 功能:管理软件包,需要确认被管理端为红帽系列的,并且需要被管理端配置好yum源. 主要的参数如下: 参数 说明 name 指定安装软件包名或软件包URL state 指定yum对应的 ...
- make编译报错:fatal error: filesystem: 没有那个文件或目录 #include <filesystem>
报错: fatal error: filesystem: 没有那个文件或目录 #include(filesystem) 解决方法一: 修改头文件 #include <experimental/f ...
- [BZOJ4358]permu线段树+莫队
先放代码 晚上补(争取) [BZOJ4358]permu 线段树+莫队做法 序列操作,多次询问,无修,标准的莫队. 在如何在不同区间内转移的问题上,我选择用线段树来维护(没听xfg讲回滚莫队不行啊) ...