關于 smali:2. 從 Java 到 Smali 的映射

一、對照 Java 代碼與 Smali 代碼差異

1.1?方法調用差異:Java vs Smali

Java 方法分類:

方法類型Java 示例Smali 指令特點說明
靜態方法Utils.print("hi")invoke-static沒有 this 指針
實例方法obj.show()invoke-virtual有 this,虛函數調用
構造函數new Person()invoke-direct用于構造對象
私有方法this.hidden()invoke-direct調用私有方法
接口方法list.size()invoke-interface調用接口方法
父類方法super.toString()invoke-super調用父類方法
動態調用(API)Java 8 lambdainvoke-polymorphic用于一些特殊函數,如反射調用

示例對照

1)靜態方法調用

Java

Logger.log("test");

Smali

const-string v0, "test"
invoke-static {v0}, Lcom/example/Logger;->log(Ljava/lang/String;)V

2)實例方法調用

Java

User u = new User();
u.say("hello");

Smali

new-instance v0, Lcom/example/User;
invoke-direct {v0}, Lcom/example/User;-><init>()Vconst-string v1, "hello"
invoke-virtual {v0, v1}, Lcom/example/User;->say(Ljava/lang/String;)V

3)構造器調用

構造器就是特殊方法 <init>

Java

Person p = new Person();

Smali

new-instance v0, Lcom/example/Person;
invoke-direct {v0}, Lcom/example/Person;-><init>()V

1.2?控制流語句差異:Java vs Smali

if-else 語句

Java

if (a > b) {doA();
} else {doB();
}

Smali

# a = v0, b = v1
if-le v0, v1, :else_block
invoke-static {}, Lcom/example/Utils;->doA()V
goto :end:else_block
invoke-static {}, Lcom/example/Utils;->doB()V:end

常用比較指令:

指令條件
if-eq等于(==)
if-ne不等(!=)
if-lt小于(<)
if-gt大于(>)
if-le小于等于(≤)
if-ge大于等于(≥)

switch 語句

Java

switch (x) {case 1: f1(); break;case 5: f5(); break;default: fDefault();
}

Smali

sparse-switch v0, :switch_data  # v0 是 switch 的變量
goto :default                   # 如果沒匹配任何 case,跳轉 default:switch_data.sparse-switch0x1 -> :case10x5 -> :case5.end sparse-switch:case1invoke-static {}, Lcom/example/Util;->f1()Vgoto :end:case5invoke-static {}, Lcom/example/Util;->f5()Vgoto :end:defaultinvoke-static {}, Lcom/example/Util;->fDefault()V:end# 后續邏輯繼續執行

while 循環

Java

int i = 0;
while (i < 10) {i++;
}

Smali

const/4 v0, 0x0       # i = 0
:loop_start
const/4 v1, 0xA
if-ge v0, v1, :loop_endadd-int/lit8 v0, v0, 1
goto :loop_start:loop_end

說明:

  • if-ge v0, v1, :loop_end當 i ≥ 10 跳出循環

  • goto用于跳轉控制流

1.3?類字段與方法修飾符差異

字段定義差異

Java

public int count;
private String name;

Smali

.field public count:I
.field private name:Ljava/lang/String;

字段類型縮寫表:

Java 類型Smali 類型
intI
booleanZ
byteB
charC
shortS
longJ
floatF
doubleD
對象L類路徑;

字段訪問指令

Java

this.count = 1;
int x = this.count;

Smali

const/4 v1, 0x1
iput v1, v0, Lcom/example/MyClass;->count:Iiget v2, v0, Lcom/example/MyClass;->count:I

說明:

  • iput = instance put,寫入字段

  • iget = instance get,讀取字段

方法定義與修飾符

Java

public void print(int n) { ... }
private int getNum() { return num; }

Smali

.method public print(I)V.locals 1# ...代碼
.end method.method private getNum()I.locals 1# ...代碼
.end method
Java 修飾符Smali 前綴
publicpublic
privateprivate
protectedprotected
staticstatic
finalfinal
abstractabstract
synchronizedsynchronized
nativenative

1.4?總結:Java ? Smali 快速對照表

Java 表達式Smali 表達說明
靜態方法調用invoke-staticthis
實例方法調用invoke-virtualthis
構造函數調用invoke-direct<init>() 構造器
if 條件控制if-eq / if-lt / if-ge條件跳轉
switch 分支.sparse-switch / .packed-switch分支跳轉表
字段定義.field public/private 名:類型類成員變量
字段訪問iget / iput實例字段讀寫
方法定義.method public 名(參數)返回值類方法定義

二、方法調用

2.1?Smali 方法調用指令分類

指令調用類型用途(Java 等價)
invoke-static靜態方法ClassName.method()
invoke-virtual實例方法(常用)obj.method()
invoke-direct構造方法、私有方法new Obj()this.privateMethod()
invoke-super調用父類方法super.method()
invoke-interface接口方法interfaceObj.method()
invoke-virtual/range處理參數多的用于參數超過 5 個時

2.2?基礎格式說明

通用格式:

invoke-xxx {參數寄存器列表}, L類名;->方法名(參數類型)返回類型

說明:

  • {} 中寫的是使用的寄存器(如 {v0, v1}

  • L類名; 是類路徑(如 Ljava/lang/String;

  • (參數類型):方法的參數簽名

  • 返回類型:返回值類型(V 表示 void)

2.3?詳細講解每個指令

1)invoke-static:調用靜態方法

Java 中 Class.method(),如 Math.abs(-1)

示例:

invoke-static {v0}, Ljava/lang/Math;->abs(I)I

說明:

  • 調用 Math.abs(int) 方法

  • v0 是傳入的參數

  • (I)I 表示:參數是 int,返回也是 int

特點:

  • 不需要實例對象

  • 類方法、工具方法、public static 方法都用這個調用

2)invoke-virtual:調用實例方法(最常用)

Java 中 obj.method(),例如 str.length()

示例:

invoke-virtual {v0}, Ljava/lang/String;->length()I

說明:

  • v0 是一個 String 對象

  • 調用它的 length() 方法

  • ():無參數,返回 int

特點:

  • 用于非私有的實例方法(包括 publicprotected

  • 支持虛方法分發(多態)

3)invoke-direct:調用構造方法、私有方法

Java 中 new MyObject()this.privateMethod()

示例 1:調用構造函數

new-instance v0, Lcom/example/MyClass;
invoke-direct {v0}, Lcom/example/MyClass;-><init>()V

說明:

  • v0 是要構造的對象

  • 調用其構造器 MyClass()

  • <init>()V 是構造函數簽名(返回類型是 void)

示例 2:調用私有方法

invoke-direct {v0}, Lcom/example/MyClass;->myPrivateMethod()V

特點:

  • 只能調用當前類的 private 方法 或 構造函數

  • 無法用于調用繼承的或 public/protected 方法

補充:invoke-super

調用父類的方法,通常在子類中使用 super.method()

示例:

invoke-super {v0}, Lcom/example/ChildClass;->toString()Ljava/lang/String;

補充:invoke-interface

調用接口方法(Java 接口)

示例:

invoke-interface {v0}, Ljava/util/List;->size()I

2.4?幾個重要的調用場景示例

調用靜態方法(工具類)

Utils.sayHello();
invoke-static {}, Lcom/example/Utils;->sayHello()V

調用實例方法(普通對象方法)

myObj.getName();
invoke-virtual {v0}, Lcom/example/MyClass;->getName()Ljava/lang/String;

調用構造器(創建對象)

new MyClass();
new-instance v0, Lcom/example/MyClass;
invoke-direct {v0}, Lcom/example/MyClass;-><init>()V

調用私有方法(類內部)

this.secret();
invoke-direct {v0}, Lcom/example/MyClass;->secret()V

2.5?寄存器數量限制說明

最多可以用 5 個寄存器調用 invoke-*,如果超過 5 個參數(例如構造函數參數很多):

  • 使用 invoke-* /range 版本:

invoke-static/range {v0 .. v6}, Lcom/example/MyClass;->bigMethod(IJFLD)V

2.6 小結

指令用途說明
invoke-static靜態方法不需要對象實例
invoke-virtual實例方法(普通調用)可被 override(多態)
invoke-direct構造方法/私有方法無法 override,調用 <init>
invoke-super父類方法用于 super.xxx()
invoke-interface接口方法用于接口對象

三、控制流語句

3.1?if-else 結構

Java 示例:

if (v0 == 1) {Log.i("TAG", "Equal");
} else {Log.i("TAG", "Not Equal");
}

Smali 實現:

# v0 已有值
const/4 v1, 0x1
if-eq v0, v1, :equal    # 如果 v0 == 1 跳轉到 :equal:not_equalconst-string v2, "TAG"const-string v3, "Not Equal"invoke-static {v2, v3}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)Igoto :end:equalconst-string v2, "TAG"const-string v3, "Equal"invoke-static {v2, v3}, Landroid/util/Log;->i(Ljava/lang/String;Ljava/lang/String;)I:end

Smali 中常見條件跳轉指令:

指令含義
if-eq相等跳轉
if-ne不等跳轉
if-lt小于跳轉
if-gt大于跳轉
if-le小于等于跳轉
if-ge大于等于跳轉
if-eqzv == 0 跳轉(zero)
if-nezv != 0 跳轉

3.2?switch-case

Java 示例:

switch (v0) {case 1: f1(); break;case 5: f5(); break;default: fDefault();
}

Smali 實現(sparse-switch):

sparse-switch v0, :switch_data
goto :default:switch_data.sparse-switch0x1 -> :case10x5 -> :case5.end sparse-switch:case1invoke-static {}, Lcom/example/Util;->f1()Vgoto :end:case5invoke-static {}, Lcom/example/Util;->f5()Vgoto :end:defaultinvoke-static {}, Lcom/example/Util;->fDefault()V:end

packed-switch vs sparse-switch

類型用法
packed-switchcase 是連續整數時使用
sparse-switchcase 是稀疏整數時使用

3.3?while 循環

Java 示例:

int i = 0;
while (i < 5) {Log.d("loop");i++;
}

Smali 實現:

const/4 v0, 0x0         # i = 0:loop_startconst/4 v1, 0x5if-ge v0, v1, :loop_end  # if i >= 5 -> endconst-string v2, "loop"invoke-static {v2}, Landroid/util/Log;->d(Ljava/lang/String;)Iadd-int/lit8 v0, v0, 0x1 # i++goto :loop_start:loop_end

3.4?for 循環(其實就是 while)

Java 示例:

for (int i = 0; i < 3; i++) {Log.e("for");
}

Smali 實現:

const/4 v0, 0x0         # int i = 0:for_beginconst/4 v1, 0x3if-ge v0, v1, :for_end   # if i >= 3 -> endconst-string v2, "for"invoke-static {v2}, Landroid/util/Log;->e(Ljava/lang/String;)Iadd-int/lit8 v0, v0, 0x1 # i++goto :for_begin:for_end

3.5?常見跳轉邏輯總結表

Java 控制結構Smali 表達方式
if (a == b)if-eq a, b, :label_true
if (a != 0)if-nez a, :label_true
while (...)標簽 :begin + 條件跳轉 + goto :begin
for (...)與 while 相同結構
switchsparse-switch / packed-switch + 標簽

四、類字段

4.1?什么是類字段

在 Java 中,字段就是類的成員變量:

public class Person {public String name;private static int count;
}

在 Smali 中,這些字段會寫成:

.field public name:Ljava/lang/String;.field private static count:I

4.2?字段的 Smali 語法結構

.field [修飾符] 字段名:類型

常見修飾符:

修飾符含義
public公有
private私有
protected受保護
static靜態字段(屬于類)
final常量
volatile多線程可見性(較少見)
transient不序列化(與 Java 一致)
synthetic編譯器自動生成(反混淆重要)

4.3?字段類型表示法(Smali 中)

Java 類型Smali 符號
intI
booleanZ
byteB
charC
shortS
longJ
floatF
doubleD
voidV(方法返回專用)
StringLjava/lang/String;
MyClassLcom/example/MyClass;
數組[I(int[]),[Ljava/lang/String;(String[])

4.4?Smali 中訪問字段

字段分為 實例字段靜態字段,對應不同的訪問指令。

1)實例字段(每個對象一份)

操作指令名示例
讀取字段igetiget v1, v0, Lcom/demo/User;->name:Ljava/lang/String;
寫入字段iputiput v2, v0, Lcom/demo/User;->name:Ljava/lang/String;

2)靜態字段(類級別共享)

操作指令名示例
讀取字段sgetsget v0, Lcom/demo/User;->count:I
寫入字段sputsput v1, Lcom/demo/User;->count:I

4.5?例子分析:完整的字段聲明與訪問流程

Java 示例:

public class User {public String name;private static int count = 0;public void setName(String n) {this.name = n;count++;}
}

Smali 對應(簡化版):

.class public Lcom/demo/User;
.super Ljava/lang/Object;.field public name:Ljava/lang/String;
.field private static count:I.method public setName(Ljava/lang/String;)V.locals 1# 把參數 n(p1)賦值給 this.nameiput-object p1, p0, Lcom/demo/User;->name:Ljava/lang/String;# sget 靜態字段sget v0, Lcom/demo/User;->count:Iadd-int/lit8 v0, v0, 0x1sput v0, Lcom/demo/User;->count:Ireturn-void
.end method

4.6?幾個實戰技巧與細節

判斷字段是靜態還是實例

特征靜態字段實例字段
修飾符static不帶 static
讀取指令sget / sputiget / iput
所屬類級別共享每個對象一份
典型用途常量、計數器每個對象的屬性,如 name

Frida Hook 中字段的常用操作

// 獲取實例字段
Java.use("com.demo.User").name.value// 獲取靜態字段
Java.use("com.demo.User").count.value// 設置字段
Java.use("com.demo.User").name.value = "hack"

4.7?.field 高級用法

初始值:

.field public static final CONST:I = 0x5

表示該字段常量為 5(int 型)

4.8 小結

類型聲明指令訪問讀取寫入修改
實例字段.field name:Typeiget / iget-objectiput / iput-object
靜態字段.field static name:Typesget / sget-objectsput / sput-object

五、方法訪問修飾符在 Smali 中如何體現

5.1?方法的 Smali 定義格式

.method [修飾符] 方法名(參數)返回類型

比如:

.method public static final doSomething(I)Ljava/lang/String;

這是一個:

  • public 公有

  • static 靜態

  • final 不可重寫
    的方法,接受一個 int 參數,返回一個 String

5.2?常見修飾符說明(對照 Java)

Smali 修飾符Java 對應含義解釋
publicpublic任何類都可以調用(最常見)
privateprivate僅類內部調用
protectedprotected同包或子類中可調用
staticstatic屬于類本身,不依賴實例對象
finalfinal不可被子類重寫(繼承中常見)
abstractabstract抽象方法(無實現體,interface、abstract class 中出現)
synthetic編譯器自動添加編譯生成的方法(如橋接方法、Lambda 方法),用于反混淆
constructor構造函數表示這是構造方法(即 <init>
nativenative本地方法,用 JNI 實現(通常沒代碼體)
bridge編譯器橋接泛型擦除后生成的橋接方法(一般逆不了邏輯)
varargsT... args可變參數(只是標記,不影響 Smali 寫法)

5.3?完整示例分析

Java 源碼

public class Demo {public static final void log(String msg) {Log.d("TAG", msg);}private int compute(int a, int b) {return a + b;}protected abstract void work();  // 抽象方法
}

對應 Smali

.method public static final log(Ljava/lang/String;)V.locals 1const-string v0, "TAG"invoke-static {v0, p0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)Ireturn-void
.end method.method private compute(II)I.locals 1add-int v0, p1, p2return v0
.end method.method protected abstract work()V

5.4?修飾符的實際作用和實戰用途

修飾符實戰應用舉例
public可直接用 Frida/Java 調用(常用于靜態分析)
private需要 Frida Bypass 或 Java.use(...).$init.overload(...)
static無需創建實例,Frida 中直接 .valueinvokeStatic
final子類不能 override,意味著 Hook 只能靜態覆蓋
abstract沒有方法體,不能直接 Hook,要 Hook 實現類
synthetic混淆后生成的自動方法,可包含核心邏輯(Frida 分析重點)
constructor對應 <init>,實例化時會調用,可以 hook $init
native沒有 Smali 代碼體,常需要 native 層分析或 trace

5.5?Hook 時與修飾符的注意事項

1)Hook 靜態方法(static)

Java.use("com.test.Demo").log.overload('java.lang.String').implementation = function(msg) {console.log("log hooked: " + msg);
};

2)Hook 實例方法(非 static)

Java.use("com.test.Demo").compute.implementation = function(a, b) {return a + b + 999;
};

3)Hook 構造方法 <init>

Java.use("com.test.Demo").$init.overload('int', 'java.lang.String').implementation = function(i, s) {console.log("構造函數攔截:" + i + ", " + s);return this.$init(i, s);
};

5.6?總結速查表

修飾符組合含義
.method public公有方法(類外可訪問)
.method private私有方法(類內訪問,hook 時需繞過)
.method static靜態方法(不依賴實例)
.method constructor構造方法 <init>
.method abstract抽象方法(無實現體)
.method public static final常量型工具函數
.method synthetic編譯器生成,可能是混淆后的關鍵方法

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/81847.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/81847.shtml
英文地址,請注明出處:http://en.pswp.cn/web/81847.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2025年05月29日Github流行趨勢

項目名稱&#xff1a;agenticSeek 項目地址url&#xff1a;https://github.com/Fosowl/agenticSeek項目語言&#xff1a;Python歷史star數&#xff1a;11898今日star數&#xff1a;2379項目維護者&#xff1a;Fosowl, steveh8758, klimentij, ganeshnikhil, apps/copilot-pull-…

Dubbo高頻面試題

引言 作為分布式服務框架的標桿&#xff0c;Dubbo憑借其高性能RPC通信、靈活的服務治理能力和豐富的容錯機制&#xff0c;成為Java技術棧中微服務領域的核心考點。本文系統梳理Dubbo高頻面試核心知識點&#xff0c;涵蓋容錯策略、負載均衡、注冊中心原理、服務上下線感知等關鍵…

氮氣吹掃電磁閥

一、氮氣吹掃電磁閥的概述 氮氣吹掃電磁閥是一種重要的工業自動控制設備&#xff0c;用于對工業設備中出現的雜質和沉淀物進行清理&#xff0c;以保證生產線的暢通和生產效率的穩定。其作用是在需要吹掃清洗的工業設備中&#xff0c;通過控制氣源的氣壓&#xff0c;打開電磁閥…

網絡安全的守護者:iVX 如何構建全方位防護體系

一、安全技術的三大趨勢 在數字化時代&#xff0c;網絡安全面臨著前所未有的挑戰。隨著企業級應用的普及&#xff0c;安全技術也在不斷演進。目前&#xff0c;安全技術架構的發展呈現出三大趨勢&#xff1a; 零信任架構的崛起&#xff1a;傳統的網絡安全依賴于邊界防護&#…

微軟云如何申請使用

微軟云&#xff08;Azure&#xff09;新手“開荒”指南&#xff1a;5步搞定賬戶&#xff0c;直達云端&#xff01; 還在為云計算的復雜門檻發愁嗎&#xff1f;別擔心&#xff01;當全球83%的企業都在加速“上云”&#xff0c;微軟智能云Azure憑借其在全球34個區域、200服務的龐…

magic-api配置Git插件教程

一、配置gitee.com 1&#xff0c;生成rsa密鑰&#xff0c;在你的電腦右鍵使用管理員身份運行&#xff08;命令提示符&#xff09;&#xff0c;執行下面命令 ssh-keygen -t rsa -b 2048 -m PEM一直按回車鍵&#xff0c;不需要輸入內容 找到 你電腦中的~/.ssh/id_rsa.pub 文件…

ojs導入顯示空白頁錯誤信息

ojs技術支持:ojs.net.cn error: Uncaught Error: Call to a member function getData() on null in /var/www/html/ojs3/classes/search/ArticleSearchIndex.inc.php:38 Stack trace: #0 /var/www/html/ojs3/plugins/importexport/esci/filter/esciXmlArticleFilter.inc.php(…

【ConvLSTM第一期】ConvLSTM原理

目錄 &#x1f9e0; 一、ConvLSTM 原理詳解1.1 背景1.2 ConvLSTM 的結構 參考 ConvLSTM&#xff08;Convolutional Long Short-Term Memory&#xff09;是一種結合了卷積神經網絡&#xff08;CNN&#xff09;與循環神經網絡&#xff08;RNN&#xff09;中 LSTM&#xff08;長短…

4.8.1 利用Spark SQL實現詞頻統計

在利用Spark SQL實現詞頻統計的實戰中&#xff0c;首先需要準備單詞文件并上傳至HDFS。接著&#xff0c;可以通過交互式方法或創建Spark項目來實現詞頻統計。交互式方法包括讀取文本文件生成數據集&#xff0c;扁平化映射得到新數據集&#xff0c;然后將數據集轉成數據幀&#…

Linux相關概念和易錯知識點(41)(UDP、TCP報頭結構)

目錄 1.UDP&#xff08;1&#xff09;傳輸層&#xff08;2&#xff09;UDP報頭&#xff08;3&#xff09;緩沖區和sk_buff①緩沖區②sk_buff 2.TCP&#xff08;1&#xff09;發送和接受緩沖區&#xff08;2&#xff09;報頭結構①按序到達②可靠傳輸③流量控制④緊急指針 1.UDP…

光譜相機在生態修復監測中的應用

光譜相機通過多維光譜數據采集與智能分析技術&#xff0c;在生態修復監測中構建起?“感知-評估-驗證”?的全周期管理體系&#xff0c;其核心應用方向如下&#xff1a; 一、土壤修復效能量化評估 ?重金屬污染動態監測? 通過短波紅外&#xff08;1000-2500nm&#xff09;波…

[網頁五子棋]項目介紹以及websocket的消息推送(輪詢操作)、報文格式和握手過程(建立連接過程)

文章目錄 項目背景核心技術創建項目WebSocket消息推送輪詢操作 報文格式握手過程(建立連接過程) 項目背景 用戶模塊 用戶的注冊和登錄管理用戶的天梯分數&#xff0c;比賽場數&#xff0c;獲勝場數等信息 匹配模塊 依據用戶的天梯積分&#xff0c;來實現匹配機制 對戰模塊 把兩…

時序模型介紹

一.整體介紹 1.單變量 vs 多變量時序數據 單變量就是只根據時間預測&#xff0c;多變量還要考慮用戶 2.為什么不能用機器學習預測&#xff1a; a.時間不是影響標簽的關鍵因素 b.時間與標簽之間的聯系過于弱/過于復雜&#xff0c;因此時序模型依賴于時間與時間的相關性來進行預…

尚硅谷redis7 86 redis集群分片之3主3從集群搭建

86 redis集群分片之3主集群搭建 3主3從redis集群配置 找3臺真實虛擬機,各自新建 m?dir -p /myredis/cluster 新建6個獨立的redis實例服務 IP:192.168.111.175端口6381/端口6382 vim /myredis/cluster/redisCluster6381.conf bind 0.0.0.0 daemonize yes protected-mode no …

Python服務器請求轉發服務

前言&#xff1a; 服務器無法連接外網 配置步驟 準備python腳本服務器內下載python 示例 1.下載python創建虛擬環境以及配置 -- 磁盤空間 df -h -- 下載apt sudo yum install apt -y-- 下載python pip sudo apt install python3 python3-pip python3-venv -y-- 測試查看 …

02.K8S核心概念

服務的分類 有狀態服務&#xff1a;會對本地環境產生依賴&#xff0c;例如需要把數據存儲到本地磁盤&#xff0c;如mysql、redis&#xff1b; 無狀態服務&#xff1a;不會對本地環境產生任何依賴&#xff0c;例如不會存儲數據到本地磁盤&#xff0c;如nginx、apache&#xff…

Java八股-Java優缺點,跨平臺,jdk、jre、jvm關系,解釋和編譯

java優勢劣勢&#xff1f; 優勢&#xff1a;面向對象&#xff0c;平臺無關&#xff0c;垃圾回收&#xff0c;強大的生態系統 劣勢&#xff1a;運行速度慢&#xff08;相比于c和rust這樣的原生編譯語言會比較慢&#xff09;&#xff0c;語法繁瑣&#xff08;相比于python&…

Attention Is All You Need論文閱讀筆記

Attention is All You Need是如今機器學習研究者必讀的論文&#xff0c;該文章提出的Transformer架構是如今很多機器學習項目的基礎&#xff0c;說該文章極大推動了機器學習領域的研究也不為過。 但這么重要&#xff0c;也是必讀的文章對初學者來說其實并不友好&#xff0c;很多…

【MAC】YOLOv8/11/12 轉換為 CoreML 格式并實現實時目標檢測

在本文中,我們將詳細介紹如何將 YOLOv8/11/12 模型轉換為 CoreML 格式,并使用該模型在攝像頭實時檢測中進行目標檢測。主要適用于M1、M2、M3、M4芯片的產品。 以下教程在YOLOv8/11/12均適用,此處就以 YOLOv11 舉例 目錄 前提條件YOLOv8/11/12 轉換為 CoreML實時目標檢測結論…

Redis--緩存擊穿詳解及解決方案

緩存擊穿 緩存擊穿問題也稱熱點key問題&#xff0c;就是一個高并發訪問&#xff08;該key訪問頻率高&#xff0c;訪問次數多&#xff09;并且緩存重建業務比較復雜的key突然失效了&#xff0c;大量的請求訪問會在瞬間給數據庫帶來巨大的沖擊。 緩存重建業務比較復雜&#xff…