【跨端框架检测】使用adb logcat检测Android APP使用的跨端框架方法总结

目录

  • Weex 跨端框架
  • 使用了uni-app的情况
    • 区分使用了uni-app还是Weex
  • 判断使用了Xamarin
  • 判断使用了KMM框架
  • 判断使用了 ​​Ionic 框架
  • 判断使用了Cordova框架
  • 判断使用了Capacitor 框架
  • 使用了React Native框架
  • 使用了QT框架
  • 使用了Cocos框架
  • 使用了Electron 框架
  • 使用了flutter 框架
  • 使用了Taro框架
  • 使用了Tauri框架
  • 使用了MAUI框架

Weex 跨端框架

Logcat 日志过滤
运行应用时,通过 adb logcat 过滤 Weex 相关日志:

adb logcat | grep -iE "weex|WXSDK"
# 示例输出:
# I/WXSDKEngine: WXSDKEngine initialized.
# D/WeexCore: Load JS Bundle from assets/weex/main.js

使用了uni-app的情况

​​Logcat 日志过滤​​
运行应用时,通过 adb logcat 过滤 uni-app 相关日志:

adb logcat | grep -iE "dcloud|uni-app"# 示例输出:
# I/dcloud: [uni-app] JSBundle loaded.
# D/uni-app: App lifecycle: onLaunch

区分使用了uni-app还是Weex

要区分一个应用是基于 uni-app 还是 Weex 开发,可以通过以下 关键特征对比 进行判断:


一、核心差异总结

特征uni-appWeex
跨端范围全端(小程序、H5、App、快应用)原生 App(Android/iOS)为主
技术栈基于 Vue.js + 条件编译类似 Vue.js,但语法更原生化
入口文件main.js + App.vue + pages.jsonmain.js + .we 文件(旧版)
全局对象uni(API 调用)weexWXEnvironment
UI 组件支持小程序组件 + 扩展组件(如 <uni-list>原生组件标签(如 <div><text>
原生交互通过 uni.requireNativePlugin 调用原生插件通过 weex.requireModule 调用原生模块
打包后目录结构assets/apps/__UNI__[APPID]/wwwassets/weex/js/bundle.js
运行时容器基于 WebView(或小程序引擎)原生渲染引擎(无 WebView)

二、具体区分方法
1. 安装包结构分析
• uni-app:

• 解压 APK 后,存在以下目录:

```bash
assets/apps/__UNI__ABCD1234/www/  # 应用核心资源
assets/uni-jsframework.js         # uni-app 运行时库
```

• 原生库文件可能包含 libapp.so(uni-app 渲染引擎)。

• Weex:

• 解压 APK 后,存在以下目录:

```bash
assets/weex/main.js                # Weex 的 JS Bundle
lib/armeabi-v7a/libweexcore.so     # Weex 原生渲染引擎
```

2. 代码特征验证
• uni-app:

• 条件编译指令:

```javascript
// #ifdef APP-PLUS
console.log('运行在 App 平台');
// #endif
```

• 全局 API 调用:

```javascript
uni.request({ url: '...' });      // uni-app 的 API 风格
```

• Weex:

• 原生模块调用:

```javascript
const module = weex.requireModule('stream');
module.fetch({ url: '...' }, callback);
```

• UI 组件标签:

```html
<div><text class="title">Hello Weex!</text>
</div>
```

3. 运行时检测
• uni-app:

• WebView 调试:

在 Chrome 控制台中检查全局对象:  
```javascript
console.log(window.uni);          // 输出 uni 对象
console.log(__dcloud_es6_polyfill__); // Polyfill 标识
```

• Weex:

• 全局环境变量:

```javascript
console.log(WXEnvironment.platform); // 输出 'Android' 或 'iOS'
```

• 无 WebView:

Weex 的 UI 是原生渲染,DOM 元素不可见(无法通过 `document.getElementById` 访问)。

4. 原生代码分析
• uni-app:

• 主 Activity 继承自 io.dcloud.PandoraEntry

```java
public class MainActivity extends io.dcloud.PandoraEntry { ... }
```

• Weex:

• 主 Activity 继承自 WXActivity

```java
public class MainActivity extends com.taobao.weex.WXActivity { ... }
```

三、混淆场景处理
若应用经过代码混淆或优化,可通过以下方式进一步验证:

  1. JS Bundle 特征:
    • uni-app 的 JS 代码包含 createAppcreatePage 方法(基于 Vue 实例化)。

    • Weex 的 JS 代码包含 definebootstrap 方法(旧版)。

  2. 资源文件哈希值:
    • uni-app 的 www 目录下可能有 manifest.json,而 Weex 无此文件。

  3. 网络请求特征:
    • uni-app 动态加载的 JS Bundle 可能包含 uni-app 标识。

    • Weex 可能请求 .we.js 文件(路径包含 /weex/)。


四、总结判断步骤

  1. 解压 APK:检查 assets/apps/__UNI__(uni-app)或 assets/weex/(Weex)。
  2. 查看代码:搜索 uni.(uni-app)或 weex.(Weex)。
  3. 反编译原生代码:确认主 Activity 的父类(PandoraEntry vs WXActivity)。
  4. 运行时调试:检查全局对象和环境变量。

通过以上方法,可快速区分应用基于 uni-app 还是 Weex。若仍有疑问,可结合具体业务逻辑和插件调用进一步分析。


判断使用了Xamarin

​Logcat 日志过滤​​
运行应用时,通过 adb logcat 过滤 ​​Mono 运行时初始化日志​​:

adb logcat | grep -iE "monodroid|MonoRuntime"
# 输出示例:
# I/monodroid: JNI_OnLoad: mono.android.Runtime.init
# I/MonoRuntime: Initializing Mono runtime...

​​进程内存分析​​
Xamarin 应用会加载 ​​Mono 运行时进程​​,可通过以下命令查看:

adb shell ps | grep -i "mono"
# 输出示例:
# com.myapp  12345  678  0% S  mono.android.app.Application

判断使用了KMM框架

​​Logcat 日志过滤​​
运行应用时,通过 adb logcat 过滤 KMM 相关日志(如共享模块的初始化或跨平台调用):

adb logcat | grep -iE "KMM|shared|common"
# 示例输出:
# D/KMM: Initializing shared module...
# I/SharedModule: Fetching data from common logic.

判断使用了 ​​Ionic 框架

Logcat 日志过滤​​
运行应用时,通过 adb logcat 过滤 Ionic 相关日志:

adb logcat | grep -iE "Ionic|Cordova|Capacitor"
# 示例输出:
# I/Ionic: Angular 初始化完成
# D/Capacitor: 插件 com.getcapacitor.camera 已加载

判断使用了Cordova框架

Logcat 日志过滤​​
运行应用时,通过 adb logcat 过滤 Cordova 相关日志:

adb logcat | grep -iE "Cordova|CordovaWebView"
# 示例输出:
# D/CordovaWebView: CordovaWebView is running on device made by: samsung
# I/CordovaLog: deviceready has not fired after 5 seconds.

判断使用了Capacitor 框架

Logcat 日志过滤​​
运行应用时,通过 adb logcat 过滤 Capacitor 相关日志:

adb logcat | grep -iE "Capacitor|Bridge"
# 示例输出:
# D/Capacitor: Initializing plugin: Camera
# I/Capacitor: App launched with URL: capacitor://localhost

使用了React Native框架

Logcat 日志过滤​​
运行应用时,通过 adb logcat 过滤 React Native 相关日志:

adb logcat | grep -iE "ReactNativeJS|ReactNative"
# 示例输出:
# I/ReactNativeJS: Running application "MyApp" with appParams
# D/ReactNative: ReactInstanceManager.createReactContext()

使用了QT框架

Logcat 日志过滤​​
运行应用时,通过 adb logcat 过滤 Qt 相关日志:

adb logcat | grep -iE "QtCore|Qt GUI|QML"
# 示例输出:
# D/QtCore: Initializing Qt...
# I/QML: Loading QML file: qml/Main.qml

使用了Cocos框架

Logcat 日志过滤​​
运行应用时,通过 adb logcat 过滤 Cocos 相关日志:


adb logcat | grep -iE "Cocos2d|CocosPlay"
# 示例输出:
# I/Cocos2dxActivity: Cocos2dxActivity initialized
# D/cocos2d-x: Director::setOpenGLView()

使用了Electron 框架

  • ​​Logcat 日志过滤​​:
    运行应用时,通过 adb logcat 过滤以下关键词:
adb logcat | grep -iE "Electron|Chromium|Node.js"
# 若有输出,可能为自定义集成(但极罕见)
  • ​​进程与线程分析​​:
    Electron 桌面应用会启动 ​​主进程 + 渲染进程​​,而 Android 应用若模拟此行为,可能包含类似多进程模式:
adb shell ps | grep -i "node"
# 检查是否存在 Node.js 进程

使用了flutter 框架

1. Logcat 日志过滤
运行应用时,通过 adb logcat 过滤 Flutter 相关日志:

adb logcat | grep -iE "flutter|dart|skia"
# 示例输出:
# I/flutter: Observatory listening on http://127.0.0.1:12345/
# D/FlutterActivity: FlutterActivity initialized
# I/Skia: Skia graphics engine initialized

2. 进程与线程分析
Flutter 应用启动后,进程内会创建 UI 线程、GPU 线程 和 I/O 线程,通过以下命令查看:

adb shell ps -T | grep -i "flutter"
# 输出示例:
# 12345 12345 com.example.app ... io.flutter.embedding.android.FlutterActivity
# 12345 12346 Thread-2        ... Dart Worker


使用了Taro框架

Logcat 日志过滤
运行应用时,通过 adb logcat 过滤 Taro 或 React Native 日志:

adb logcat | grep -iE "Taro|ReactNative"
# 示例输出:
# I/ReactNativeJS: Taro initialized
# D/TaroRuntime: Loading Taro components...

使用了Tauri框架

Logcat 日志过滤
运行应用时,通过 adb logcat 过滤 Rust 或 Tauri 相关日志:

adb logcat | grep -iE "tauri|rust"
# 示例输出(假设存在):
# I/rust: Tauri initialized
# D/tauri_mobile: Invoking Rust method: show_message

使用了MAUI框架

• 运行应用时,通过adb logcat过滤MAUI相关日志:

    adb logcat | grep -i "Maui"# 示例输出:# I/Maui: Initializing Microsoft.Maui.Graphics...```

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

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

相关文章

以加减法计算器为例,了解C++命名作用域与函数调用

************* C topic: 命名作用域与函数调用 ************* The concept is fully introducted in the last artical. Please refer to 抽象&#xff1a;C命名作用域与函数调用-CSDN博客 And lets make a calculator to review the basic structure in c. 1、全局函数 A…

AIGC小程序项目

一、文生文功能 &#xff08;1&#xff09;前端部分 使用 Pinia 状态管理库创建的聊天机器人消息存储模块&#xff0c;它实现了文生文&#xff08;文本生成文本&#xff09;的核心逻辑。 1.Pinia状态管理 这个模块管理两个主要状态&#xff1a; messages&#xff1a;存储所…

Axios中POST、PUT、PATCH用法区别

在 Axios 中&#xff0c;POST、PUT 和 PATCH 是用于发送 HTTP 请求的三种不同方法&#xff0c;它们的核心区别源自 HTTP 协议的设计语义。以下是它们的用法和区别&#xff1a; 1. POST 语义&#xff1a;用于创建新资源。 特点&#xff1a; 非幂等&#xff08;多次调用可能产生…

[爬虫知识] Cookie与Session

相关实战案例&#xff1a;[爬虫实战] 爬取小说标题与对应内容 相关爬虫专栏&#xff1a;JS逆向爬虫实战 爬虫知识点合集 爬虫实战案例 一、引入场景 在http协议中&#xff0c;浏览器是无状态&#xff08;即无记忆&#xff09;的&#xff0c;对于请求与响应的产生数据&#…

怎样改变中断优先级?

在STM32中改变中断优先级可以通过STM32CubeMX配置和代码中设置两种方式来实现。以下以STM32F1系列为例进行说明: 使用STM32CubeMX配置 打开工程:在STM32CubeMX中打开你的工程。进入NVIC配置:在Pinout & Configuration选项卡中,点击NVIC进入中断向量控制器配置界面。选…

科学计算中的深度学习模型精解:CNN、U-Net 和 Diffusion Models

关键要点 模型概述:卷积神经网络(CNN)、U-Net 和 Diffusion Models 是深度学习中的核心模型,广泛应用于科学计算任务,如偏微分方程(PDE)求解、图像分割和数据生成。科学计算应用:CNN 可用于高效求解 PDEs,U-Net 擅长医学图像分割和材料分析,Diffusion Models 在生成合…

解决Docker无法拉取镜像问题:Windows系统配置镜像加速全指南

问题背景 在使用 Docker 时&#xff0c;你是否遇到过以下报错&#xff1f; Unable to find image ‘mysql:latest’ locally docker: Error response from daemon: Get “https://registry-1.docker.io/v2/”: dial tcp 128.242.250.155:443: i/o timeout. 这类问题通常是由于…

Spring AI 使用教程

Spring AI 使用教程&#xff08;2025年5月24日更新&#xff09; 一、环境搭建与项目初始化 创建Spring Boot项目 使用IDEA或Spring Initializr创建项目&#xff0c;选择JDK 17或更高版本&#xff08;推荐21&#xff09;。勾选依赖项&#xff1a;Spring Web、Lombok&#xff0c;…

iOS 直播特殊礼物特效实现方案(Swift实现,超详细!)

特殊礼物特效是提升直播互动体验的关键功能&#xff0c;下面我将详细介绍如何在iOS应用中实现各种高级礼物特效。 基础特效类型 1.1 全屏动画特效 class FullScreenAnimationView: UIView {static func show(with gift: GiftModel, in view: UIView) {let effectView FullS…

分布式事务之Seata

概述 Seata有四种模式 AT模式&#xff1a;无侵入式的分布式事务解决方案&#xff0c;适合不希望对业务进行改造的场景&#xff0c;但由于需要添加全局事务锁&#xff0c;对影响高并发系统的性能。该模式主要关注多DB访问的数据一致性&#xff0c;也包括多服务下的多DB数据访问…

信息收集与搜索引擎

6.1 常见的搜索引擎&#xff08;一、二&#xff09; 6.1.1 通用搜索引擎 Google/Bing&#xff1a; 用途&#xff1a;基础信息收集&#xff08;域名、子域名、敏感文件&#xff09;。 高级语法&#xff1a; site:target.com&#xff1a;限定搜索目标域名。 filetype:pdf&am…

【Java项目测试报告】:在线聊天平台(Online-Chat)

被测试项目已部署&#xff1a;登录页面http://123.249.78.82:8080/login.html 一、项目背景 1.1 测试目标 验证系统功能完整性&#xff0c;确保用户管理、消息传输、好友管理等核心模块符合需求。 1.2 项目技术栈 后端&#xff1a;Spring Boot/Spring MVC/WebSocket 数据…

RAGFlow与Dify的深度刨析

目录 一、RAGFlow 框架 二、Dify 框架 三、两者集成 四、深度对比 1. 核心定位对比 2. 核心功能对比 3. 技术架构对比 4. 部署与成本 5. 适用场景推荐 总结 一、RAGFlow 框架 RAGFlow 是一个专注于深度文档理解和检索增强生成&#xff08;RAG&#xff09;技术的框架…

CQF预备知识:一、微积分 -- 1.2.2 函数f(x)的类型详解

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 &#x1f4d6; 数学入门全解 本系列教程为CQF(国际量化金融分析师证书)认证所需的数学预备知识&#xff0c;涵盖所有需要了解的数学基础知识…

嵌入式工程师常用软件

1、 Git Git 是公司常用的版本管理工具&#xff0c;人人都要会。在线的 git 教程可以参考菜鸟教程&#xff1a; https://www.runoob.com/git/git-tutorial.html 电子书教程请在搜索栏搜索&#xff1a; git Git 教程很多&#xff0c;常用的命令如下&#xff0c;这些命令可…

TReport组件指南总结

1. TReport 组件简介 TReport 是一个用于生成和打印报表的组件,通常用于连接数据集(如 TDataSet)并设计复杂的报表布局。它支持动态数据绑定、多页报表、分组统计、图表插入等功能。 2. 安装与配置 安装:如果使用的是第三方报表工具(如 Rave Reports),需在 Delphi 中通…

spark任务的提交流程

目录 spark任务的提交流程1. 资源申请与初始化2. 任务划分与调度3. 任务执行4. 资源释放与结果处理附:关键组件协作示意图扩展说明SparkContext介绍 spark任务的提交流程 用户创建一个 Spark Context;Spark Context 去找 Cluster Manager 申请资源同时说明需要多少 CPU 和内…

【C++】C++异步编程四剑客:future、async、promise和packaged_task详解

C异步编程四剑客&#xff1a;future、async、promise和packaged_task详解 1. 引言 1.1 异步编程的重要性 在现代C编程中&#xff0c;异步操作是提高程序性能和响应能力的关键技术。它允许程序在等待耗时操作&#xff08;如I/O、网络请求或复杂计算&#xff09;完成时继续执行…

2021-10-28 C++判断完全平方数

缘由判断一个整数是否为完全平方数-编程语言-CSDN问答 整数用平方法小数用5分法逼近。 int 判断平方数(int n) {//缘由https://ask.csdn.net/questions/7546950?spm1005.2025.3001.5141int a 1;while (a < n / a)if (a*a < n)a;else if (a*a n)return 1;elsereturn 0…

解决weman框架redis报错:Class “llluminatelRedis\RedisManager“ not found

解决weman框架redis报错&#xff1a;Class "llluminatelRedis\RedisManager" not found 报错解决方案 报错 解决方案 按照手册执行 composer require psr/container ^1.1.1 illuminate/redis illuminate/events 安装redis组件 然后restart重启就行了 php webman s…