Android 获取第三方应用程序的清单文件

Android 获取第三方应用程序的清单文件,android,android-manifest,Android,Android Manifest,这允许您浏览应用程序的清单文件。它是怎么做到的?我在操作系统的API中找不到用于获取其他应用程序清单文件的任何内容。构建应用程序时,清单文件不会隐藏。它按原样放在.apk文件中。你可以用一个档案员来检查,比如7zip。所以只要用7zip打开apk文件(它会识别它),您就会在那里看到AndroidManifest.xml文件 我想,该应用程序只是在应用程序文件夹中查找该文件。首先,您可以获得如下应用程序列表: PackageManager pm = getActivity().getPackage

这允许您浏览应用程序的清单文件。它是怎么做到的?我在操作系统的API中找不到用于获取其他应用程序清单文件的任何内容。

构建应用程序时,清单文件不会隐藏。它按原样放在.apk文件中。你可以用一个档案员来检查,比如7zip。所以只要用7zip打开apk文件(它会识别它),您就会在那里看到AndroidManifest.xml文件


我想,该应用程序只是在应用程序文件夹中查找该文件。

首先,您可以获得如下应用程序列表:

PackageManager pm = getActivity().getPackageManager();
List<ApplicationInfo> apps = pm.getInstalledApplications(
        PackageManager.GET_META_DATA | PackageManager.GET_SHARED_LIBRARY_FILES
    );
上述值将具有如下值:

/data/app/com.example.someonesapp.apk
从那里可以从.apk访问清单文件,如下所示:

try {
    ZipFile apk = new ZipFile("/data/app/com.example.someonesapp.apk");
    ZipEntry manifest = apk.getEntry("AndroidManifest.xml");
    if (manifest != null){
        Log.d("ManifestGetter", "Manifest size = " + manifest.getSize());
        InputStream stream = apk.getInputStream(manifest);
        // do stuff with the file here e.g. get contents
        stream.close();
    }
    apk.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} 

最重要的是,不需要root。真不敢相信Android会允许这样。需要它做什么?一个应用程序的某些方面无法被另一个使用常规API的应用程序查询。例如,您无法通过API直接了解应用程序支持的意图。但是,您可以通过读取其清单来实现这一点。所以你可以触发它的一些公众意图。我想如果这是一个安全风险,谷歌早就把它堵上了。我想,虽然私有意图的字符串值将被公开,但最主要的是它们不能被所属应用程序之外的任何东西触发。但我想知道的是,如何隐藏我的来源!无论其他应用程序是否可以访问APK,混淆可能是所有可以预料到的事情,因为任何用户都可以在他们的手机上访问APK,不管怎样。难道没有任何android对象/服务允许你解析它吗?也许packagemanager公开了一些API?
try {
    ZipFile apk = new ZipFile("/data/app/com.example.someonesapp.apk");
    ZipEntry manifest = apk.getEntry("AndroidManifest.xml");
    if (manifest != null){
        Log.d("ManifestGetter", "Manifest size = " + manifest.getSize());
        InputStream stream = apk.getInputStream(manifest);
        // do stuff with the file here e.g. get contents
        stream.close();
    }
    apk.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}