platform:RK3399
OS:Android 7.1
參考:
1.比特人生 https://blog.csdn.net/ielife/article/details/86719313
2.KrisFei https://blog.csdn.net/kris_fei/article/details/79447343?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522158883304619726869022990%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=158883304619726869022990&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v25-4
1. 概述
對于一臺運行Android系統的終端設備,一般會有許多出廠就已經確定的屬性,這些屬性唯一且具有特殊的作用。其中SN,MAC,IMEI(有通信模塊)是最基礎的幾個屬性,這些屬性一般在出廠之前就會使用工具寫到設備中,和設備綁定。
1.1 SN號
SN碼是Serial Number的縮寫,有時也叫SerialNo,也就是產品序列號,產品序列是為了驗證“產品的合法身份”而引入的一個概念,它是用來保障用戶的正版權益,享受合法服務的;一套正版的產品只對應一組產品序列號。SN碼別稱:機器碼、認證碼、注冊申請碼等。
SN號可以根據產品要求或者公司統一的編碼規范進行編碼,但是Android仍然對SN號有一定的限制要求,具體要求如下:
1. 英文字符和數字(a~z,A~Z,0~9)
2. 6~20個字符
1.2 mac地址
MAC地址是一個用來確認網絡設備位置的位址。在OSI模型中,第三層網絡層負責IP地址,第二層數據鏈路層則負責MAC位址 。MAC地址用于在網絡中唯一標示一個網卡,一臺設備若有一或多個網卡,則每個網卡都需要并會有一個唯一的MAC地址。
網絡設備制造商生產時燒錄在網卡(Network lnterface Card)的EPROM中,所以如果網絡設備制造商已經燒錄好了MAC地址,那么我們就不需要再次燒錄。如果沒有提前燒錄,那就需要采購MAC地址池并在生產時將MAC地址燒錄到設備中。一般OEM工廠可以提供MAC地址。
終端設備常見的MAC地址有:WIFI MAC,LAN MAC,BT MAC;這個需要根據產品具體確定,比如有的產品就可能沒有LAN MAC.相應的也不需要燒錄LAN MAC。
2. 燒錄及測試
瑞芯微提供寫號工具,請聯系FAE獲取最新的寫號工具,SDK舊版本的工具可能存在問題.
2.1 燒錄
2.1.1 設備方式
兩種設備模式: maskrom 和 loader 模式 maskrom 進入方式:短接 FLASH CLK 引腳,在該模式下面寫號,必須要選擇正確的 MiniLoaderAll.bin。 loader 進入方式:開機時候按住“音量+”或者 adb reboot loader 命令,在該模式下面寫號, 設備必須是已經有燒寫過固件。
2.1.2 寫號模式

如果不清楚使用那種模式,可以逐一嘗試.注意錯誤勾選可能導致寫號失敗.
2.1.3 配置
1.代碼配置
diff
2.軟件配置

寫號工具支持同時寫入 7 個項,其中五個是預定義的(ID 是固定的,不能修改),剩下兩個 用戶可以通過修改 ID 自定義寫入。 uboot、內核是通過 ID 來區別用戶寫入的內容的。用戶可以 選擇三種輸入方式寫號: 1) 手動模式 直接在主界面從鍵盤或者掃描槍輸入要寫入的數據項。 2) 自增模式 用戶設定起始項,前綴和后綴,按十進制,或者十六進制遞增生成寫入數據項。 3) 文件模式 從文件獲取寫入的數據項,如果勾選“Bin 文件”,則會把整個文件寫入;不勾選的話,則把選 擇的文件當做文本文件,一次寫入一行.
2.1.3 燒錄
配置完成后,在首頁點擊寫入,等待設備寫入成功即可.
2.2 查看
有多種方式查看是否寫入成功.
方式一:使用上面的寫號軟件讀取.
方式二:使用串口抓取開機log
#Boot ver: 0000-00-00#0.00
12345678 //SN號
normal boot.
checkKey
方法三:傳給Kernel的啟動參數
mtdparts=rk29xxnand:0x00002000@0x00002000(uboot),0x00002000@0x00004000(trust),0x00002000@0x00006000(uboot_ro),0x00002000@0x00008000(trust_ro),0x00002000@0x0000A000(misc),0x00008000@0x0000C000(resource),0x0000C000@0x00014000(kernel),0x00010000@0x00020000(boot),0x00020000@0x00030000(recovery),0x00038000@0x00050000(backup),0x00040000@0x00088000(cache),0x00600000@0x000C8000(system),0x00008000@0x006C8000(metadata),0x00000040@0x006D0000(verity_mode),0x00002000@0x006D0040(reserved),0x00000400@0x006D2040(frp),-@0x006D2440(userdata) storagemedia=emmc androidboot.oem_unlocked=0 uboot_logo=0x02000000@0x7dc00000 loader.timestamp=2020-04-24_12:20:44 SecureBootCheckOk=0 androidboot.serialno=12345678
方法四:使用adb
#adb devices
12345678 device
方法五:查看系統屬性
getprop ro.serialno
getprop ro.boot.serialno
2.3 有效情況
在不擦除flash的情況下,SN號均有效,具體場景見下表.
操作|SN有效情況 -|- 單分區燒錄|有效 整包燒錄|無效 OTA差分升級|有效 OTA整包升級|有效 擦除Flash后燒錄|無效 恢復出廠設置|有效
3. 獲取串號(SN)
APK:
android.os.Build.SERIAL
ro.boot.serialno:
/system/core/init/init.cpp:
static
通過cmdline獲取串號ro.boot.serialno,cmdline見上一小節方法三:
androidboot.serialno=12345678
sys.serialno:
system/core/drmservice/drmservice.c
if
由于是寫入的SN,所以從idb中獲取SN.
ro.serialno:
init.rk30board.rc:
//運行drmservice
service drmservice /system/bin/drmserviceclass mainoneshot# set ro.serialno
on property:sys.serialno=*setprop ro.serialno ${sys.serialno}