Android INCLUDE_EXECUTABLE but not install to system image, e.g: recovery

最近工作上有個需求,我們複製了 recovery 修改成我們要的功能之後,發現除了 recovery image 之外, system image 也額外出現了我們修改過後的執行檔

Android 的 build system 裡面有$(INCULDE_EXECUTABLE)是設計用來編譯手機上面的執行檔的

例如 recovery 就是使用 $(INCLUDE_EXECUTABLE)

但是我們並不希望 recovery 被安裝到 /system/bin/ 裡面,如果安裝到 /system/bin/ 裡面的話

就可能被使用者直接 adb shell /system/bin/recovery 執行,雖然不一定會發生問題

但畢竟是不好的設計,我們只希望 recovery 出現在 recoveryimage 裡面,也就是只有進入 recovery mode 之後才載入具有 /system/bin/recovery 的 ramdisk

原本有看到 bootable/recovery/Android.mk 裡面有個 LOCAL_MODULE_TAGS := eng 原本可以設定只有 eng build 才安裝,但這樣也不夠好,最好的情況是不論 eng, userdebug 都不要安裝到 system image

後來我思考 $(INCLUDE_EXECUTABLE) 究竟是如何安裝 binary 到 system image 裡面的,一路找到 build/core/base_rule.mk 裡面

還順便發現了一個參數 $(LOCAL_UNINSTALLABLE_MODULE)

這個參數作用在 $(INCLUDE_XXXX) 要安裝檔案之前,會根據這個參數決定是否要安裝

所以在我們修改過後的 Android.mk 裡面加上 LOCAL_UNINSTALLABLE_MODULE := true 就不會讓執行檔案裝到 system image 裡面去了,但依然可以在 build time 被 build ,也就可以繼續保持打包到某某 image 裡面了