一、先看兩組代碼的直觀區(qū)別
Android 14方案(PRODUCT_COPY_FILES):

核心邏輯:直接把文件從源碼目錄拷貝到系統(tǒng)分區(qū)(如/system/bin),像“復(fù)制粘貼”一樣簡單。
Android 15方案(PRODUCT_PACKAGES):

核心邏輯:先通過Android.bp定義“模塊”(如canconfig是一個(gè)預(yù)構(gòu)建可執(zhí)行程序模塊),再把模塊名加入打包清單,由構(gòu)建系統(tǒng)統(tǒng)一管理。
終端路徑:

二、為什么Android 15要“淘汰”直接拷貝?
這不是“功能刪減”,而是Android系統(tǒng)安全、構(gòu)建效率、硬件適配三重進(jìn)化的必然結(jié)果:
1.安全升級(jí):從“放養(yǎng)”到“強(qiáng)監(jiān)管”
?Android 14時(shí)代:直接拷貝文件,系統(tǒng)不會(huì)校驗(yàn)“這個(gè)程序能不能在設(shè)備上運(yùn)行”(比如x86程序拷貝到ARM設(shè)備),也不管“程序有沒有危險(xiǎn)權(quán)限”(比如偷偷讀寫系統(tǒng)文件)。
?Android 15時(shí)代:強(qiáng)制要求模塊化聲明,構(gòu)建系統(tǒng)會(huì)自動(dòng)檢查:
?架構(gòu)兼容性:程序必須是設(shè)備支持的架構(gòu)(如RK3576的arm64);
?權(quán)限合法性:通過SELinux上下文配置,限制程序能做什么(比如只允許訪問串口);
?依賴完整性:如果程序依賴其他庫(如libcan.so),必須明確聲明,否則編譯報(bào)錯(cuò)。
2.構(gòu)建系統(tǒng)進(jìn)化:Soong取代傳統(tǒng)Make
Android 15全面擁抱Soong構(gòu)建系統(tǒng)(用Android.bp替代Android.mk),它像“智能管家”:
?傳統(tǒng)方式(PRODUCT_COPY_FILES):只管拷貝,不管“程序是否能運(yùn)行”“依賴是否完整”,出問題全靠開發(fā)者人肉排查;
?模塊方式(PRODUCT_PACKAGES):通過cc_prebuilt_binary等規(guī)則,自動(dòng)處理權(quán)限、依賴、架構(gòu)問題,甚至能幫你發(fā)現(xiàn)“程序是x86格式,設(shè)備是arm64”這種低級(jí)錯(cuò)誤。
3.硬件適配:瑞芯微等芯片廠商的倒逼
以瑞芯微RK3576為例:
?芯片的ISP、串口、攝像頭等硬件,對(duì)驅(qū)動(dòng)和工具的依賴管理要求更嚴(yán)格;
?直接拷貝的程序,可能因“沒加載依賴庫”“權(quán)限不夠”導(dǎo)致硬件功能失效;
?模塊化聲明能強(qiáng)制關(guān)聯(lián)驅(qū)動(dòng)、庫、權(quán)限,確保硬件功能正常工作。
三、開發(fā)者必須注意的3個(gè)核心點(diǎn)
1.必須學(xué)會(huì)寫Android.bp(模塊聲明)
以cansend為例,需在同級(jí)目錄創(chuàng)建Android.bp:
|
cc_prebuilt_binary {
name: "cansend", //模塊名,必須和PRODUCT_PACKAGES里的名字一致
srcs: ["cansend"], //可執(zhí)行程序的路徑
installable: true, //允許安裝到系統(tǒng)分區(qū)
file_contexts: "cansend_contexts", // SELinux上下文配置
target: {
android_arm64: { enabled: true }, //只編譯到arm64架構(gòu)
},
}
|
?關(guān)鍵作用:告訴構(gòu)建系統(tǒng)“這個(gè)程序是誰、能裝在哪、該有什么權(quán)限”。

2.SELinux配置是“必答題”
Android 15的SELinux會(huì)嚴(yán)格攔截未授權(quán)操作,必須為程序配置上下文:
|
# cansend_contexts文件內(nèi)容
/system/bin/cansend usystem_file:s0
|
?若程序要訪問串口(如/dev/ttyS8),還需額外添加SELinux策略(如allow cansend serial_device:chr_file write;),否則會(huì)報(bào)avc: denied錯(cuò)誤。
3.動(dòng)態(tài)庫依賴要“明明白白”
如果cansend依賴libcan.so,不能只拷貝cansend,還需:
1.用cc_prebuilt_library_shared聲明libcan.so模塊;
2.在cansend的Android.bp中通過shared_libs關(guān)聯(lián):
|
shared_libs: ["libcan"],
|
?否則設(shè)備運(yùn)行時(shí)會(huì)報(bào)錯(cuò)cannot load library: libcan.so。
四、實(shí)戰(zhàn)建議:從Android 14遷移到15的步驟
1.整理可執(zhí)行程序:把canconfig、candump等程序放到統(tǒng)一目錄(如device/rockchip/cantools)。
2.為每個(gè)程序?qū)?/span>Android.bp:按模塊規(guī)則聲明,配置架構(gòu)、權(quán)限、SELinux。
3.修改PRODUCT_PACKAGES:替換原來的文件路徑,改為模塊名。
4.編譯驗(yàn)證:
|
系統(tǒng)配置: export LC_ALL=C source javaenv.sh source build/envsetup.sh export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH export PATH=$ANDROID_BUILD_TOP/prebuilts/clang/host/linux-x86/clang-r487747c/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar lunch rk3576_u-ap4a-userdebug
一鍵編譯:
./build.sh -AUCKu -d rk3576-evb1-v10 -J 16 |
若報(bào)錯(cuò),優(yōu)先檢查架構(gòu)是否匹配、SELinux策略是否缺失、依賴是否聲明。
結(jié)語:系統(tǒng)越嚴(yán),開發(fā)越規(guī)范
Android 15對(duì)可執(zhí)行程序的“模塊化”要求,本質(zhì)是系統(tǒng)安全和開發(fā)效率的雙向奔赴:
?對(duì)用戶:避免非法程序破壞系統(tǒng);
?對(duì)開發(fā)者:減少“運(yùn)行時(shí)崩潰”的Debug成本。
跟上這個(gè)變化,你會(huì)發(fā)現(xiàn):曾經(jīng)的“野路子”雖然快,但“正規(guī)軍”的方式更穩(wěn)、更可持續(xù)。
(覺得有用?歡迎轉(zhuǎn)發(fā)給需要適配Android 15的同行~)
-
Android
+關(guān)注
關(guān)注
12文章
4024瀏覽量
133970 -
程序
+關(guān)注
關(guān)注
117文章
3846瀏覽量
85226 -
代碼
+關(guān)注
關(guān)注
30文章
4967瀏覽量
73954
發(fā)布評(píng)論請(qǐng)先 登錄
用于分析可執(zhí)行程序和內(nèi)存轉(zhuǎn)儲(chǔ)的命令行工具介紹
office 版本不同,到處可執(zhí)行程序出錯(cuò)
labview生成的可執(zhí)行程序的反編譯
各位大大,vxworks能否直接調(diào)用可執(zhí)行程序
what!!! 10分鐘做出Labview可執(zhí)行程序!??!
在RV1126上怎樣去運(yùn)行rknn_yolo_demo可執(zhí)行程序呢
怎樣移植qt可執(zhí)行程序到rk3399開發(fā)板上運(yùn)行呢
LabVIEW中VISA可執(zhí)行程序不能在非開發(fā)機(jī)上運(yùn)行
16KEY-B的可執(zhí)行程序
Setup軟件安裝可執(zhí)行程序工具免費(fèi)下載
國產(chǎn)數(shù)據(jù)庫從游擊隊(duì)到正規(guī)軍
任正非:華為還不是“正規(guī)軍”
在標(biāo)準(zhǔn)C語言中編譯出來的可執(zhí)行程序
Android 14→15內(nèi)置可執(zhí)行程序:從“野路子”到“正規(guī)軍”的進(jìn)化
評(píng)論