有時候可能為了開發使用,但又不想要讓所有使用者看到該功能,這時候該怎麼辦,也許可以模仿連續點選某處10次,或者輸入什麼神秘密碼的方式在app中,但除了這些方法外,是否還有什麼更科技一點的方式呢?
參考firebase 設定debugApp的一個方式,可以透過
adb shell setprop debug.firebase.analytics.app com.packageName
來進行設定開啟某一個app的debug資訊上傳,於是乎就想到是不是這樣就代表可以對手機寫入一個動態設定呢? 而這個設定是重開機後就不見的
問了一下chatgpt後進行設定
adb shell setprop debug.hidden_feature_enabled true
可以看到是這樣
adb shell setprop {key} {value}
透過
adb shell getprop
就可以看到他列出了系統所有的prop
[debug.atrace.tags.enableflags]: [0]
[debug.c2.use_dmabufheaps]: [1]
[debug.force_rtl]: [false]
[debug.hidden_feature_enabled]: [true]
[debug.hwc.winupdate]: [1]
[debug.hwui.use_hint_manager]: [true]
[debug.renderengine.backend]: [skiaglthreaded]
[debug.sf.dim_in_gamma_in_enhanced_screenshots]: [1]
[debug.sf.disable_backpressure]: [0]
[debug.sf.early.app.duration]: [16600000]
[debug.sf.early.sf.duration]: [16600000]
[debug.sf.earlyGl.app.duration]: [16600000]
[debug.sf.earlyGl.sf.duration]: [16600000]
[debug.sf.enable_adpf_cpu_hint]: [true]
[debug.sf.enable_gl_backpressure]: [1]
就可以看到剛剛的
[debug.hidden_feature_enabled]: [true] true
我寫了這個method
private fun readRuntimeProperty(key: String,execute: (String) -> Unit) {
with(Runtime.getRuntime().exec("getprop $key")) {
BufferedReader(InputStreamReader(inputStream)).useLines {
execute(it.first())
}
destroy()
}
}
因此可以直接透過
private fun main() {
readRuntimeProperty("debug.hidden_feature_enabled") {
toast("hasEnable:$it")
}
}
就可以得到設定的結果做動態的應用,譬如給你家的QA讓他透過ADB輸入後(或者寫成一個script),可以開啟一些特殊讓他測試用的介面或者功能
另外你可能會提到System.getProperty(propertyName) 他是只會讀到build.prop中設定值,理論上這邊是系統資訊不可更改的區域
可以用來作為快速的開關一些功能介面的隱藏指令,但建議不要把機密功能打開在裡面