读取清单文件:list <uses-library> </uses-library>

时间:2014-06-06 14:42:26

标签: android android-manifest

我正在开发一个图书馆,让我们说这个图书馆依赖谷歌地图作为例子。

当Android应用中有人使用它时,我想确保在他的清单中,他在应用标记中声明了以下标记:

<uses-library android:name="com.google.android.maps" android:required="true" />

我正在寻找一种阅读清单的方法,这样我就可以显示一个Toast或一个日志,上面写着&#34;嘿,伙计,你忘了包含&#34; uses-library&#34 ;在你的清单中!请更正,或者不要问我问题,我不会支持你&#34; (基本上)

到目前为止,我找到了阅读大量内容(权限等)的方法,但没有关于use-library标签的内容。

(这是一个例子,我实际上并没有使用地图v1)

1 个答案:

答案 0 :(得分:1)

我正在编写一个仪器测试,我想检查一个特定的库是否已经不再使用了。巧合的是,它是&#34; com.google.android.maps&#34;。

Google的官方文件声明

  

要检查库,可以使用反射来确定特定类是否可用。

但还有另一种阅读方法&#34; uses-library&#34;太。必须考虑以下事项:

  • 一个标志 PackageManager.GET_SHARED_LIBRARY_FILES 必须用于获取共享库信息
  • 返回列表包含链接库的完整路径,其文件名与语句
  • 中请求的库相同

以下代码适用于我:

#include <functional>
#include <iostream>
#include <string>
#include <unordered_map>
#include <vector>

class RangeSwitch {
public:
    void method(std::string key, int &result) {
        static const std::unordered_map<std::string,std::function<void(int&)>> m{
            {"one",   [](int& result){ result = 1; }},
            {"two",   [](int& result){ result = 2; }},
            {"three", [](int& result){ result = 3; }},
        };
        static const auto end = m.end();
        auto it = m.find(key);
        if (it != end) {
            it->second(result);
        } else {
            result = -1;
        }
    }
};

int main() {
    RangeSwitch rangeSwitch;
    int result;
    std::vector<std::string> strings{"one", "two", "three", "foobar"};
    for (const auto& s : strings) {
        rangeSwitch.method(s, result);
        std::cout << s << " " << result << std::endl;
    }
}