在各平台应用开发过程中,随着业务的功能增加,不免会涉及到非公开的API依赖,针对某些应用或厂商系统的适配,每个版本都需要投入精力去排查,CoCollider 可以让我们的适配效率从几个星期提升到几小时即可完成。

项目已开源:

☞ Github:https://www.github.com/iofomo/fireyer ☜ 

☞ Github:https://www.github.com/iofomo/wing ☜ 

如果您也喜欢,别忘了给我们点个星。

01. 写在前面

Android平台(后续会支持iOS平台)日常开发过程中,不免会接触到一些 Hidden(或私有函数和类)的类,JVM层通过反射,Native则通过查找函数 symbol 来完成。特别是涉及系统Framework层和底层库较多的实现(特别是安全产品和系统工具类应用),成为每次系统和厂商ROM更新适配的重灾区,严重影响适配效率。

以往,开发同学要么先一个个自行排查代码后再提交测试,这个过程重复,耗时且容易遗漏。要么先让测试同学先进行用例覆盖测试,然后开发同学通过BUG来进行分析,这会导致整个团队效率更加低下。

由于我们虚拟化产品的特性,工程中涉及系统和应用适配的接口众多,工作量很大,主要有两部分:

  1. 如何快速寻找到系统新增的模块,感兴趣的可以查看我们的另一个开源项目 【ASeeker】 https://www.github.com/iofomo/aseeker
  2. 如何快速定位现有使用的API是否已发生变化,这就是【CoCollider】 要解决的问题。

CoCollider 已经在我们内部使用,极大提升我们系统适配效率,原本需要几个星期的工作量,现在只需几小时便可适配完成,原理简单,堪称适配效率神器。Android 15发布在即,现在分享给大家。

CoCollider同样适用于其他平台(如:iOS)和某些深度定制的应用版本适配。

02. 我们需要

对于系统的API,我们的需求是:

  1. 类的属性是否有变化。
  2. 类的成员属性是否有变化。
  3. 类的方法属性是否有变化。
  4. Native库和函数是否存在。

对于开发工程师的工作量,首次需要在源码中添加注释标签,这个工作不可省略,却一劳永逸。后续需要在每次涉及适配的代码处加上@CoCollider标签就行。

Java代码标签格式:

格式:
// @CoCollider {class name},{-/+}{field name/method name},... 范例:
# 仅查看类是否变更
// @CoCollider android.utils.Abc
# 仅查看类所有成员是否变更
// @CoCollider android.utils.Abc,-*
# 查看类和某成员或方法是否变更(支持多个)
// @CoCollider android.utils.Abc,-mFile
// @CoCollider android.utils.Abc,-mFile,mName
// @CoCollider android/utils/Abc,-mFile
// @CoCollider android.utils.Abc,+getFile,-mName
// @CoCollider android/utils/Abc,+getFile,+getName,-mName # 支持缺省自动填充:(按照顺序依次填充)
Class.forName("android.utils.Abc");// @CoCollider
# 等同于:// @CoCollider android.utils.Abc ReflectUtils.getStaticField("android.utils.Abc", "mName");// @CoCollider ,-
# 等同于:// @CoCollider android.utils.Abc,-mName

Native 代码标签格式:

格式:
// @CoCollider ~{lib name},{-/+}{field name/method name},... 范例:
# 查看方法是否变更
// @CoCollider ~libc.so,+open
// @CoCollider ~/system/lib/libc.so,+open
// @CoCollider ~/system/lib/libc.so,+open,+close # 支持缺省自动填充:(按照顺序依次填充)
utils_dlsym("libc.so", "open");// @CoCollider ~,+
# 等同于:// @CoCollider ~libc.so,+open utils_dlsym("open");// @CoCollider ~libc.so,+
# 等同于:// @CoCollider ~libc.so,+open

03. 配置运行

  1. 电脑下载配置wing

  2. 手机安装Fireyer,或集成CoCollider模块的应用,链接adb

  3. 扫描代码:

    # 命令格式:扫描当前目录下的代码(默认支持 h/c/cpp/java/kt/aidl,也可以追加文件类型)
    $ wing -cocollider scan
    $ wing -cocollider scan /home/space
    # 或
    $ python ./cocollider.py scan
    $ python ./cocollider.py scan /home/space
    # 在当前目录输出结果
    >>> cocollider-scan-20241023-112044.txt
  4. 解析运行:

    # 命令格式:调用 Fireyer 应用
    $ wing -cocollider run /home/cocollider-scan-20241023-112044.txt
    # 或
    $ python ./cocollider.py run /home/cocollider-scan-20241023-112044.txt # 在当前目录输出结果
    >>> cocollider-run-20241023-112044.txt
  5. 使用对比工具查看结果即可快速定位变更内容。

04. 扫描结果

cocollider-scan-20241023-112044.txt 中的文件内容为:

############################################################
= android.utils.Abc - mFile
> application/fireyer/test/test1.java,14 - mName3
> application/fireyer/test/test1.java,14 - mPath
> application/fireyer/test/test1.java,14 ############################################################
= android.utils.Abc1 - mFile
> application/fireyer/test/test1.java,5 ...

05. 运行结果

cocollider-run-20241023-112044.txt 中的文件内容(已对classlib库,functionfieldmethod排序,便于使用对比工具对比)

############################################################
~ libwilhelm.so
[OK] + _ZN7androidxx6BufferE
[OK], public final class libcore.io.Linux
> cmpt/xxx/jni/xxx/jni/src/xxx.cpp,362 + _ZN7android1xx6BufferE
[OK], public final class libcore.io.Linux
> cmpt/xxx/jni/xxx/jni/src/xxx.cpp,350 ############################################################
= ohos.abilityshell.HarmonyApplication
[Fail] - applicationHandler
[Fail]
> scene/xxx/xxx.java,36 ############################################################
= ohos.system.Parameters
[Fail] + nativeGet
[Fail]
> scene/xxx.cpp,250 ...

06. 对比结果

分别在不同版本系统运行 python cocollider.py run 之后,使用对比工具(如:Beyond Compare)对内容进行比较查看,可以快速找到新增,修改和删除项,从而可以快速进行排查和修复。

【CoCollider】让系统和应用适配如此简单的更多相关文章

  1. iOS 的 APP 在系统中如何适配不同的屏幕的尺寸

    iOS 的 APP 在系统中如何适配不同的屏幕的尺寸 标签: 2007年,初代iPhone发布,屏幕的宽高是 320 x 480 像素.下文也是按照宽度,高度的顺序排列.这个分辨率一直到iPhone ...

  2. macbook装双系统多分区其实很简单,你只要把macbook当作一台普通pc就可以了!

    macbook装双系统多分区其实很简单,你只要把macbook当作一台普通pc就可以了! 不用理会苹果官网的警告,苹果官网警告你只能用bootcamp安装且不能多分区,把人吓得不轻.其实不用过多担心, ...

  3. Linux系统Vi/Vim编辑器的简单介绍、安装/卸载、常用命令

    Linux系统Vi/Vim编辑器的简单介绍.安装/卸载.常用命令 1.介绍 vi(Visual Interface)编辑器是Linux和Unix上最基本的文本编辑器,工作在字符模式下.由于不需要图形界 ...

  4. useradd linux系统创建用户和设置密码简单脚本-1

    useradd linux系统创建用户和设置密码简单脚本-1 linux_wangqiang 2019-12-04 20:51:18 65 收藏展开#!/bin/bash#快速创建用户 使用$1第一个 ...

  5. 关于开放式CNC系统实时软件控制系统的一些简单分析

    随笔: 黄杰U201310771 首先,我们一起了解或复习两个概念:开放式CNC和开放式CNC体系结构.按照工EEE规定:一个开放式的系统必须具备不同应用程序能很好地运行于不同供应商提供的不同平台之上 ...

  6. 信息安全系统设计基础课程实践:简单TUI游戏设计

    简单TUI游戏设计                目       录               一                      Curses库简介与基本开发方法             ...

  7. < IOS > IOS适配,简单的分析解决一下

    版权:张英堂 欢迎转载,转载请注明出处. 做的项目很多,一到适配的时候头就大了,IOS6,7的适配,屏幕的适配,当然还有下一步要出4.7屏幕,也要做适配....悲剧的移动端的人员. 怎么做一个通用的适 ...

  8. Mac系统中各个文件夹简单介绍(转)

    一.说明: Mac OS X,这是一个基于UNIX核心的系统,增强了系统的稳定性.性能以及响应能力.它能通过对称多处理技术充分发挥双处理器的优势,提供无与伦比的2D.3D和多媒体图形性能以及广泛的字体 ...

  9. “权限系统_基于HUI”的简单介绍和交流

    昂,最近比较闲,写了个权限系统. 后端框架还是老样子,基于本人自己搭建的后台基础开发框架"Spring_Mvc_EF":前端框架,我挑选了一阵子,最后选用了HUI前端开发框架,因为 ...

  10. ios系统判断某些适配 __IPHONE_OS_VERSION_MAX_ALLOWED

    由于app的最新设计字体是ios9之后的平方字体,但app最低支持ios7,so...想在常量配置文件类里统一适配下字体,如下: //适配字体,ios9及以上系统使用新字体--平方字体 #if __I ...

随机推荐

  1. Buckingham-Reiner 方程和 Darby-Melson 经验方程

    由 Roni, et al. (2018), Woolley, et al. (2014), Yang, et al. (2017) 整理人便便的物理性质数据如下: 性质 值 密度 \((\text{ ...

  2. 是技术牛人,如何拿到国内IT巨头的Offer

    不久前,byvoid面阿里星计划的面试结果截图泄漏,引起无数IT屌丝的羡慕敬仰.看看这些牛人,NOI金牌,开源社区名人,三年级开始写Basic...在跪拜之余我们不禁要想,和这些牛人比,作为绝大部分技 ...

  3. 巴特沃斯LPF设计(硬件电路实现)

    高阶 (2n) VSVC单位增益巴特沃斯低通滤波器设计,可分解为 n 个二阶低通,通过对这多个二阶低通的组合优化,可提高滤波器的低通特性和稳定性. 串联的传递函数是各个二阶滤波器传递函数的乘积:\({ ...

  4. ChatGPT 客户端推荐

    通过按量计费的 Token 使用 ChatGPT 可以获得比免费 ChatGPT 更快的响应速度,但又不必支付昂贵的每月 20 美金订阅费用.下面是一些我个人喜欢的支持 Token 的 ChatGPT ...

  5. 这应该是全网最详细的Vue3.5版本解读

    前言 Vue3.5正式版在这两天发布了,网上已经有了不少关于Vue3.5版本的解读文章.但是欧阳发现这些文章对3.5中新增的功能介绍都不是很全,所以导致不少同学有个错觉,觉得Vue3.5版本不过如此, ...

  6. 13 Python面向对象编程:装饰器

    本篇是 Python 系列教程第 13 篇,更多内容敬请访问我的 Python 合集 Python 装饰器是一种强大的工具,用于修改或增强函数或方法的行为,而无需更改其源代码.装饰器本质上是一个接收函 ...

  7. 6.24.2 数据库&漏洞口令&应急取证

    windows日志分析神器 logonTracer-外内网日志 github下载:#JPCERTCC/LogonTracer:通过可视化和分析 Windows 事件日志来调查恶意 Windows 登录 ...

  8. HttpURLConnection和HttpClient使用

    HttpURLConnection 这是Java的标准类,继承自URLConnection,可用于向指定网站发送GET/POST请求. 方法描述 void setRequestMethod(Strin ...

  9. Java实现随机抽奖的方法有哪些

    在Java中实现随机抽奖的方法,通常我们会使用java.util.Random类来生成随机数,然后基于这些随机数来选择中奖者.以下将给出几种常见的随机抽奖实现方式,包括从数组中抽取.从列表中抽取以及基 ...

  10. Java使用snmp协议采集服务器信息

    Java使用snmp协议采集服务器信息    一.snmp简介   SNMP是专门设计用于在 IP 网络管理网络节点(服务器.工作站.路由器.交换机及Hubs等)的一种标准协议,它是一种应用层协议. ...