【跨端框架检测】使用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-app | Weex |
---|---|---|
跨端范围 | 全端(小程序、H5、App、快应用) | 原生 App(Android/iOS)为主 |
技术栈 | 基于 Vue.js + 条件编译 | 类似 Vue.js,但语法更原生化 |
入口文件 | main.js + App.vue + pages.json | main.js + .we 文件(旧版) |
全局对象 | uni (API 调用) | weex 或 WXEnvironment |
UI 组件 | 支持小程序组件 + 扩展组件(如 <uni-list> ) | 原生组件标签(如 <div> 、<text> ) |
原生交互 | 通过 uni.requireNativePlugin 调用原生插件 | 通过 weex.requireModule 调用原生模块 |
打包后目录结构 | assets/apps/__UNI__[APPID]/www | assets/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 { ... }
```
三、混淆场景处理
若应用经过代码混淆或优化,可通过以下方式进一步验证:
-
JS Bundle 特征:
• uni-app 的 JS 代码包含createApp
和createPage
方法(基于 Vue 实例化)。• Weex 的 JS 代码包含
define
或bootstrap
方法(旧版)。 -
资源文件哈希值:
• uni-app 的www
目录下可能有manifest.json
,而 Weex 无此文件。 -
网络请求特征:
• uni-app 动态加载的 JS Bundle 可能包含uni-app
标识。• Weex 可能请求
.we
或.js
文件(路径包含/weex/
)。
四、总结判断步骤
- 解压 APK:检查
assets/apps/__UNI__
(uni-app)或assets/weex/
(Weex)。 - 查看代码:搜索
uni.
(uni-app)或weex.
(Weex)。 - 反编译原生代码:确认主 Activity 的父类(
PandoraEntry
vsWXActivity
)。 - 运行时调试:检查全局对象和环境变量。
通过以上方法,可快速区分应用基于 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...```
相关文章:
【跨端框架检测】使用adb logcat检测Android APP使用的跨端框架方法总结
目录 Weex 跨端框架使用了uni-app的情况区分使用了uni-app还是Weex 判断使用了Xamarin判断使用了KMM框架判断使用了 Ionic 框架判断使用了Cordova框架判断使用了Capacitor 框架使用了React Native框架使用了QT框架使用了Cocos框架使用了Electron 框架使用了flutter 框架使用…...
lua脚本实战—— Redis并发原子性陷阱
需求分析 对于内容类网站,比如用户浏览题目的答案,需要先登录才能追溯,那么可以统计用户访问频率来限制数据的爬取。 可采用分级反爬虫策略,先告警、再采取强制措施: 如果每分钟超过 10 道题,给管理员发…...
【MySQL】第10节|MySQL全局优化与Mysql 8.0新增特性详解
全局优化 mysql server参数 1. max_connections(最大连接数) 含义:MySQL 服务允许的最大并发连接数(包括正在使用和空闲的连接)。超过此限制时,新连接会被拒绝(报错 Too many connections&am…...

CSS相关知识
1.清除浮动的方法 2.定位 静态定位相当于标准流 相对定位不脱离文档流,仍然占据原来的位置(最频繁的作用是给绝对定位当爹) 绝对定位脱离文档标准流,不再占有原来位置 3.BFC 1. 解决浮动元素导致的父容器高度塌陷 2. 阻止相邻元…...

AI扫描王APP:高效便捷的手机扫描工具,让生活更智能
AI扫描王APP是一款功能强大的手机扫描软件,专为追求高效、便捷的用户设计。它不仅支持文字提取和扫描翻译,还能进行测量,满足用户在不同场景下的需求。无论是办公、学习还是日常使用,AI扫描王都能帮助你快速完成任务,节…...

《仿盒马》app开发技术分享-- 原生地图展示(端云一体)
开发准备 上一节我们实现了获取当前用户的位置,并且成功的拿到了经纬度,这一节我们就要根据拿到的经纬度,结合我们其他的知识点来实现地图的展示。 功能分析 地图的展示,我们需要在管理中心先给我们对应的应用开启地图api功能&…...
Linux 操作文本文件列数据的常用命令
文章目录 Linux 操作文本文件列数据的常用命令基本列处理命令高级列处理列数据转换和排序列数据统计和分析 Linux 操作文本文件列数据的常用命令 Linux 提供了多种强大的命令来处理文本文件中的列数据,以下是一些最常用的命令和工具: 基本列处理命令 c…...

IP、子网掩码、默认网关、DNS
IP、子网掩码、默认网关、DNS 1. 概述1.1 windows配置处 2.IP 地址(Internet Protocol Address)2.1 公网ip2.2 内网ip2.3 🌐 公网 IP 与内网 IP 的关系(NAT) 3. 子网掩码(Subnet Mask)4. 默认网…...

华为OD机试真题——字符串加密 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
2025 B卷 100分 题型 本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式; 并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析; 本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分…...

角度回归——八参数检测四边形Gliding Vertex
文章目录 一、介绍(一)五参数检测方法( 基于角度)(二)八参数检测方法(point-based)的边界 二、方案分析(一)问题定义(二)方案…...
JVM 高质量面试题
📌 文章目录 一、JVM 内存结构与运行时模型1. JVM 内存结构分区及作用2. 栈帧结构及方法调用链维护3. 逃逸分析及其对对象分配策略的影响4. TLAB 的作用及提升对象创建效率的机制 二、垃圾回收器与 GC 调优1. CMS 与 G1 垃圾收集器的设计区别及适用场景2. Full GC 频…...

AI助力,制作视频裁剪软件
1. 视频裁剪软件套路多 最近再做一些测试,经常需要录屏什么的,有时候录制的时长视频,需要裁剪,比如去掉开头一些帧或者结尾的一些帧,就想保留关键点。但是网上下的一些软件,打开一用都是要付费的。所以想着…...
SQL注入基础
普通sql注入:后台能提供有价值的错误信息,显示在页面 手动注入 1. 寻找sql注入点 get注入 ?idxx url后加测试是否存在注入漏洞,报错则存在 post注入 把参数封装…...
使用 A2A Python SDK 实现 CurrencyAgent
谷歌官方的a2a-python SDK最近频繁的更新,我们的教程也需要跟着更新,这篇文章,我们通过 a2a-python sdk的 0.2.3 版本,实现一个简单的CurrencyAgent。 https://a2aprotocol.ai/blog/a2a-sdk-currency-agent-tutorial-zh 目录 源码准备详细过程 创建项目创建虚拟环境添加依…...
qt浏览文件支持惯性
#include <QApplication> #include <QListWidget> #include <QScroller> #include <QScrollerProperties>int main(int argc, char *argv[]) {QApplication app(argc, argv);// 创建列表控件并添加示例项QListWidget listWidget;for (int i 0; i <…...
Python类的力量:第六篇:设计模式——Python面向对象编程的“架构蓝图”
文章目录 前言:从“代码堆砌”到“模式复用”的思维跃迁 一、创建型模式:对象创建的“智能工厂”1. 单例模式(Singleton):全局唯一的“资源管家”2. 工厂模式(Factory):对象创建的“…...

[实战]用户系统-2-完善登录和校验以及VIP
这里写目录标题 完善登录和校验新建lib-auth创建配置引入配置和JWT完善登录基本登录单点登录多点登录校验和拦截编写守卫编写装饰器使用完善VIP修改mysql模型编写vip守卫代码进度完善登录和校验 之前我们模拟过用户的登录,本节将实现token的生成,校验,redis做黑名单。我们需…...
负载均衡笔记
并发数—同时服务的调用方的数量 吞吐量—单位时间内,能接受和返回的数据请求量 TPS。 Transaction事务 QPS。Query 请求/查询 优化点: 减少并发数—防止并非过高 低级—限流—可用的用户少了?! 多开几个口—分流 DNS 解析域…...

印度语言指令驱动的无人机导航!UAV-VLN:端到端视觉语言导航助力无人机自主飞行
作者:Pranav Saxena, Nishant Raghuvanshi and Neena Goveas单位:比尔拉理工学院(戈瓦校区)论文标题:UAV-VLN: End-to-End Vision Language guided Navigation for UAVs论文链接:https://arxiv.org/pdf/250…...

mysql都有哪些锁?
MySQL中的锁机制是确保数据库并发操作正确性和一致性的重要组成部分,根据锁的粒度、用途和特性,可以分为多种类型。以下是MySQL中常见的锁及其详细说明: 一、按锁的粒度划分 行级锁(Row-level Locks) 描述:…...
解锁未来AI:使用DACA模式和Agentic技术提高开发效率
学习Agentic AI:Dapr Agentic Cloud Ascent (DACA)设计模式的应用与演进 背景介绍 近年来,Agentic AI(代理型人工智能)的概念在学术界和产业界掀起了一阵热潮。Agentic AI指的是能够自主感知、决策和行动的智能体系统,它们不仅改变了我们与技术互动的方式,也为行业发展…...

HarmonyOS NEXT 使用 relationalStore 实现数据库操作
大家好,我是V哥。在 HarmonyOS NEXT 开发中,如何操作数据库,V 哥在测试中总结了以下学习代码,分享给你,如何想要系统学习鸿蒙开发,可以了解一下 V 哥最近刚刚上架出版的 《HarmonyOS 鸿蒙开发之路 卷2 从入…...

R语言学习--Day04--数据分析技巧
在清洗完数据,在对数据分析前,我们要懂得先梳理一下我们的逻辑,即数据是什么形式的,要进行哪种分析,有可能呈现什么特点,进而再想怎么处理数据去画图可以最大程度地凸显我们要的特点。 一般来讲࿰…...

SRS流媒体服务器之RTC播放环境搭建
环境概述 srs版本 commit 44f0c36b61bc7c3a1d51cb60be0ec184c840f09d Author: winlin <winlinvip.126.com> Date: Wed Aug 2 10:34:41 2023 0800Release v4.0-r5, 4.0 release5, v4.0.271, 145574 lines. rtc.conf # WebRTC streaming config for SRS. # see full.…...

Android 性能优化入门(三)—— ANR 问题分析
需要清楚 ANR 的概念、类型、如何产生以及如何定位分析。 1、概述 1.1 ANR 的概念 ANR(Application Not Responding)应用程序无响应。如果你应用程序在主线程被阻塞太长时间,就会出现 ANR,通常出现 ANR,系统会弹出一…...
用HTML5实现实时ASCII艺术摄像头
用HTML5实现实时ASCII艺术摄像头 项目简介 这是一个将摄像头画面实时转换为ASCII字符艺术的Web应用,基于HTML5和原生JavaScript实现。通过本项目可以学习到: 浏览器摄像头API的使用Canvas图像处理技术实时视频流处理复杂DOM操作性能优化技巧 功能亮点…...

鸿蒙Flutter实战:22-混合开发详解-2-Har包模式引入
以 Har 包的方式加载到 HarmonyOS 工程 创建工作 创建一个根目录 mkdir ohos_flutter_module_demo这个目录用于存放 flutter 项目和鸿蒙项目。 创建 Flutter 模块 首先创建一个 Flutter 模块,我们选择与 ohos_app 项目同级目录 flutter create --templatemodu…...

游戏引擎学习第302天:使用精灵边界进行排序
在 game_render_group.cpp 中:正确计算 GetBoundFor() 里的 SpriteBound 值 我们正在进行游戏的排序问题调试。虽然这是一个二维游戏,但包含一些三维元素,因此排序变得比较复杂和棘手。混合二维和三维元素时,需要依赖一些比较主观…...

SpringBoot+MyBatis
切换数据库连接词 引入数据库连接词的依赖,配置数据库连接池的类型; 编写测试类: package org.example.threelayerdecouplingdomeapplication2;import org.example.threelayerdecouplingdomeapplication2.mapper.UserMapper; import org.ex…...

wireshark: Display Filter Reference
https://www.wireshark.org/docs/dfref/// 这个里面的扩展功能还是很强大,可以帮着问题分析。支持大量的自定义化的字段读取功能,支持很多的协议。 https://www.wireshark.org/docs/dfref///f/frame.html frame.time_delta Time delta from previous ca…...