我想知道是否有类似于getprop/setprop
的命令存在于Android中。
我想启用在编译后的应用程序中对某些属性进行更改,而无需再次编译。
我知道在Android上我可以使用adb shell setprop
,但我没有在Linux/Mac上找到类似的东西。
有一种方法可以在Linux上用环境变量做类似的事情(也许在Mac上也是一样的事情),但是还有别的吗?
我将给出一个我想要做的例子:假设我有一个程序,它使用默认的线程数进行并行化,并且我不想在编译后更改线程数。我可以添加一个环境变量,在我的会话中设置它,然后运行我的应用程序。
下面的代码演示了这一点:#include <sstream>
#include <cstdlib>
template <class T>
bool getEnv(const char* envVariable, T& value) {
auto envValue = getenv(envVariable);
if (!envValue) {
return false;
}
if constexpr (std::is_same_v<T, int>) {
auto tempValue = strtol(envValue, nullptr, 10);
if (tempValue < std::numeric_limits<int>::min() ||
tempValue > std::numeric_limits<int>::max()) {
return false;
}
value = tempValue;
} else if constexpr (std::is_same_v<T, double>) {
auto tempValue = strtod(envValue, nullptr);
if (tempValue < std::numeric_limits<double>::min() ||
tempValue > std::numeric_limits<double>::max()) {
return false;
}
value = static_cast<double>(tempValue);
} else {
// make sure this won't compile
static_assert(!std::is_same_v<T, T>);
}
return true;
}
int main() {
int number_of_threads;
int status = getEnv("NUMBER_OF_THREADS", number_of_threads);
if (!status) {
std::cerr << "Failed to get NUMBER_OF_THREADSn";
return 1;
}
std::cout << "NUMBER_OF_THREADS=" << number_of_threads << "n";
return 0;
}
终端:
idancw:~/envTest/cmake-build-debug> export NUMBER_OF_THREADS=4
idancw:~/envTest/cmake-build-debug> ./test
NUMBER_OF_THREADS=4
idancw:~/envTest/cmake-build-debug> export NUMBER_OF_THREADS=10
idancw:~/envTest/cmake-build-debug> ./test
NUMBER_OF_THREADS=10
有没有其他方法不使用env变量,类似于Android?
我想我也可以在Mac上使用env方法,但是还有别的吗?
谢谢:)
为了回答最初的问题,让我们看看,getprop/setprop在Android上到底是做什么的。
例如,从这里我们知道,getprop/setprop只是读取和写入一些数据库的API,存储在文件系统的文件中。这个API通过名为property_service"的系统进程进行管理。
所以我们可能想要的品质是:系统范围的,通过一些本地API访问,持久的数据库。由于原生API在期望列表中,我们可以预测不会有现成的跨平台解决方案:)
在Windows上,我会说它听起来像注册表。它肯定存储在文件系统中,有WinAPI可以访问或更改它,并且它坚持重新启动。
在macOS上,我能想到的最接近的东西是NSUserDefaults。
对于linux来说,对于所有的发行版没有统一的解决方案,但是有很多地方可以存储和读取文件系统中的参数,这一点被广泛讨论。