1. 程式人生 > >[Android6.0]App中呼叫init.rc中的服務,從而執行shell指令碼

[Android6.0]App中呼叫init.rc中的服務,從而執行shell指令碼

Author: Younix
Platform: RK3399
OS: Android 6.0
Kernel: 4.4
Version: v2017.07

需求:希望在 Android App 中新增 SPDIF 測試功能。對 Android App 開發不熟悉,為節省開發時間走 Android Audio Manager 太麻煩了。所以希望直接通過 shell 指令碼,呼叫 tinyplay 命令來進行。

Init.rc 中新增 spdiftest 服務

對於我這個專案,是在 init.tablet.rc 中新增

service spdiftest /system/bin/spdif-test 
    class
main
disabled oneshot

Device.mk 拷貝指令碼和測試音訊

工程 Device.mk 檔案(rk3399_mid.mk)中新增

PRODUCT_COPY_FILES += \ 
   device/rockchip/rk3399/rk3399_mid/test/spdif-test:system/bin/spdif-test \ 
   device/rockchip/rk3399/rk3399_mid/test/test-music.wav:system/media/audio/test-music.wav 

Spdif-test 實際為測試指令碼
Test-music.wav 實際為測試音訊

測試指令碼 spdif-tset

如下

#!/system/bin/sh 

tinymix -D 0 "Stereo DAC MIXL DAC L1 Switch" 1 
tinymix -D 0 "Stereo DAC MIXR DAC R1 Switch" 1 
tinymix -D 0 "OUT MIXL DAC L1 Switch" 1 
tinymix -D 0 "OUT MIXR DAC R1 Switch" 1 
tinymix -D 0 "HPOVOL L Switch" 1 
tinymix -D 0 "HPOVOL R Switch" 1 
tinymix -D 0 "HPO MIX HPVOL Switch"
1 tinymix -D 0 "HPO L Playback Switch" 1 tinymix -D 0 "HPO R Playback Switch" 1 tinyplay /system/media/audio/test-music.wav -D 1 -d 0

App 呼叫

在 App 中通過 SystemProperties.set(“ctl.start”,”spdiftest”);
呼叫 spdiftest 服務(實際是 spdif-test 指令碼)

    private void setSpdifOn() throws IOException {
        SystemProperties.set("ctl.start","spdiftest");
        Log.v(TAG, "Call System Service 'spdiftest' in init.rc to test SPDIF.");
    }