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

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

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

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

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