目錄
- 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...```