【CoCollider】让系统和应用适配如此简单

news/2024/11/5 23:04:04/文章来源:https://www.cnblogs.com/iofomo/p/18524645

在各平台应用开发过程中,随着业务的功能增加,不免会涉及到非公开的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.AbcReflectUtils.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,+openutils_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)对内容进行比较查看,可以快速找到新增,修改和删除项,从而可以快速进行排查和修复。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/826520.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入学习软件组件认证的三个关键

人工智能软件,特别是深学习组件,是目前实现自主汽车等自主系统的最先进和经济上可行的解决方案。然而,DL算法的性质及其当前的实现与汽车、卫星和火车等安全关键系统中严格的软件开发过程不一致。 传统的安全相关软件采用自上而下的方法,对组件进行分解,并相应地传播安全要求,直…

IDEA中通义灵码的使用技巧

大家好,我是 V 哥。在日常写代码的过程中,通过 AI 工具辅助开发已是当下程序员惯用的方式,V 哥在使用了众多的 AI 工具后,多数情况下,选择通义灵码来辅助开发,尤其是解释代码和生成单元测试功能甚是好用,听 V 哥来详细聊聊。 通义灵码安装 打开你的 IDEA 开发工具,在菜…

10.14 每日总结

今天继续学习软考。 代码时长1小时,学习时长两小时。 软考内容学习数据结构:时间复杂度: 递归的次数 X 每次递归的时间复杂度

【TEC047】基于Xilinx XCZU47DR RFSOC的射频收发核心处理模块

​TEC047是一款基于Xilinx的Zynq UltraSacle+ RFSoC Gen3系列FPGA XCZU47DR的射频收发核心模块,该模块将XCZU47DR芯片及其最小系统集成在了一个80*115mm的核心板上,可以作为一个紧凑的核心,进行功能的扩展,能够快速的搭建起一个多通道射频收发的信号处理平台,缩短用户的产…

C# 实现拖拽功能

很多时候,为了方便用户操作,需要增加拖拽功能。实现起来其实很简单,按照下面的步骤,你也能成功!快去试试吧。 一、 属性设置为True 二、共需要实现两个方法。 代码如下:private void FrmReplaceTools_DragDrop(object sender, DragEventArgs e){string[] s = (string[])…

设计登陆验证码的逻辑

今日面试某信息的场景题提到了下这个问题,没太搞懂面试官具体想让我说的就是两个接口的设计,一个生成验证码,一个校验验证码,和其具体的设计方案,没听懂当时的意思,有的小懵逼,因此回头总结回顾一下,日常开发中对这些小细节还是要注重一下,不能因为场景逻辑简单就不去…

使用最新版的wvp和ZLMediaKit搭建Gb28181测试服务器

目录说明安装1.安装nodejs简介安装步骤2.安装java环境3.安装mysql安装修改密码4.安装redis5.安装编译器6.安装cmake7.安装依赖库8.编译ZLMediaKit9.编译wvp-GB28181-pro配置1.ZLMediaKit配置2.wvp-GB28181-pro配置2.1.配置ZLMediaKit连接信息2.2.28181服务器的配置2.3.配置web服…

在昇腾Ascend 910B上运行Qwen2.5推理

使用 GPUStack 在昇腾 Ascend 910B 上运行 Qwen2.5 全系列的推理性能表现目前在国产 AI 芯片,例如昇腾 NPU 上运行大模型是一项广泛且迫切的需求,然而当前的生态还远未成熟。从底层芯片的算力性能、计算架构的算子优化,到上层推理框架对各种模型的支持及推理加速,仍有很多需…

MMCA:多模态动态权重更新,视觉定位新SOTA | ACM MM24 Oral

来源:晓飞的算法工程笔记 公众号,转载请注明出处论文: Visual Grounding with Multi-modal Conditional Adaptation论文地址:https://arxiv.org/abs/2409.04999 论文代码:https://github.com/Mr-Bigworth/MMCA创新点提出了多模态条件适应(MMCA)方法,该方法从一种新颖的权…

PbootCMS前端页面样式丢失

前端页面样式丢失问题原因:静态资源文件路径不正确或文件缺失。 解决方法:检查 static 目录下的 CSS 和 JS 文件是否存在。 确保前端页面引用的静态资源路径正确。 清除浏览器缓存,重新加载页面。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,…

PbootCMS生成的 sitemap.xml 中增加 tag 标签链接

问题描述:PbootCMS默认生成的 sitemap.xml 不包含 tag 标签链接。 解决方法:打开 /apps/home/model/SitemapModel.php,在第78行后增加以下代码:// 指定分类标签调用 public function getSortTags($scode) {$join = array(array(ay_content_sort b, a.scode=b.scode, LEFT),…

帝国CMS tags 页列表页内容页调用函数版代码

添加函数在 /e/class/userfun.php 文件中添加以下代码:function tagslink($aid, $num = 5, $tbname = news) {global $public_r, $dbtbpre, $empire, $navinfor, $class_r;$qr = $empire->fetch1("select rewritetags from {$dbtbpre}enewspublic limit 1");$sr …