在我们所的程序的执行过程中,涉及到文件IO及动态库加载的时候,我们需要和App相关的一些路径打交道
假如我们的App的全名为com.example.appname;
App的工作目录,多数机器上为/data/data/com.example.appname/files
对于使用了原生代码的App,.so 目录的存储路径一般为/data/app-lib/com.example.appname;
我在一个第三方跨平台库中看到了这样的实现:
#if XN_PLATFORM == XN_PLATFORM_ANDROID_ARM
static void getApplicationName(XnChar* strAppName, const XnUInt32 nBufferSize)
{
FILE *pFile;
size_t length;
pFile = fopen("/proc/self/cmdline", "r");
length = fread(strAppName, 1, nBufferSize, pFile);
fclose(pFile);
}
XN_C_API XnStatus XN_C_DECL xnOSGetApplicationFilesDir(XnChar* cpDirName, const XnUInt32 nBufferSize)
{
char strAppName[1024];
getApplicationName(strAppName, sizeof(strAppName));
snprintf(cpDirName, nBufferSize, "/data/data/%s/files/", strAppName);
return (XN_STATUS_OK);
}
XN_C_API XnStatus XN_C_DECL xnOSGetApplicationLibDir(XnChar* cpDirName, const XnUInt32 nBufferSize)
{
char strAppName[1024];
getApplicationName(strAppName, sizeof(strAppName));
snprintf(cpDirName, nBufferSize, "/data/data/%s/lib/", strAppName);
return (XN_STATUS_OK);
}
#endif
这段代码的实现皆是按照我上面所述的情况来实现的,即以App的全名为参照,来确定我们要找的路径。
可就是这段代码才导致我的App无法运行。
原来,在我的手机 小米3 Android4.4.4 上,App的物理文件名有时会多出一个后缀,比如:com.example.appname-1.apk;
而App的库文件路径也是根据这个名称来的,/data/app-lib/com.example.appname-1;
而函数getApplicationName通过读取"/proc/self/cmdline"得带的App名称却是逻辑文件名com.example.appname,
这就导致xnOSGetApplicationLibDir函数始终无法找到正确的库目录,就导致库的动态加载失败。
这是否是所谓的定制系统带来的问题?