很多情况下,我们需要通过APK文件来得到它的一些信息。 (此时此APK不一定被安装了)

0. 基础知识:
可以通过android.content.Context的方法 getPackageManager()得到一个PackageManager实例。
PackageManager有一个方法:
PackageInfo getPackageArchiveInfo (String archiveFilePath, int flags);
其中参数一:archiveFilePath。就是指一个APK文件绝对路径。

请注意它的返回值。是个PackageInfo。它包含Pakcage所有信息,可以认为,这些信息都是从AndroidManifest.xml中收集而来。

1. 得到APK中Activity信息:
PackageInfo中包含:public ActivityInfo[] activities
它会得到AndroidManifest.xml中<application>中所有<Activity> tag.

例如:

 <application android:label="@string/app_name" android:debuggable="true">
<activity android:name=".HelloJni" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

ActivityInfo:从 AndroidManifest.xml's <activity> and <receiver> tags得到的信息。

可以从这一项中得到和Activity有关的所有信息。这些内容都是从<activity>或<receiver>中得到。

例1:得到Activity各信息:
想要得到Activity信息,需要参数2设置为: PackageManager.GET_ACTIVITIES
PackageInfo PI = PM.getPackageArchiveInfo("/data/hellojni.apk", PackageManager.GET_ACTIVITIES);

//PackageInfo中得到的PackageName
Log.w("3DiJoy", "PackageInfo . PackageName:" + PI.packageName); Log.w("3DiJoy", String.format("There are [%d] Activity", PI.activities.length));
Log.w("3DiJoy", String.format("Activity in Porcess Name: [%s]", PI.activities[0].processName));
//注意:此处第一次看到ProcessName:
//The name of the process this component should run in. From the "android:process" attribute or, //if not set, the same as applicationInfo.processName
//即此项从main.xml中得到,为android:process项目内容。如果没有设置,则与applicationInfo.processName相同。(注1)

//Activity 所在的PackageName。应该与上面PockageInfo中得到的PackageName相同。
Log.w("3DiJoy", "Activity in Package PackageName:" + PI.activities[0].packageName);

//Activity Name:<activity android:name=".HelloJni"。中读取到的
Log.w("3DiJoy", "Activity Name:" + PI.activities[0].name);

2. 得到APK中Application信息:
Information collected from the <application> tag, or null if there was none。
呵呵,如之前所述,其实PackageInfo中所有项目都是从Main.xml中取到的,之前的Activity如此,现在的Application也是如此。

PackageInfo中有一项:
public ApplicationInfo applicationInfo

Log.w("3DiJoy", "Appliction DataDir:" + PI.applicationInfo.dataDir);
Log.w("3DiJoy", "Application SourceDir:" + PI.applicationInfo.sourceDir);
//Log.w("3DiJoy", "Application JNI LIbdir:" + PI.applicationInfo.nativeLibraryDir);
Log.w("3DiJoy", "Application permission:" + PI.applicationInfo.permission);
Log.w("3DiJoy", "Application in porcessName is :" + PI.applicationInfo.processName);//(注2)
Log.w("3DiJoy", String.format("minSDK Version: [%d]", PI.applicationInfo.targetSdkVersion));
Log.w("3DiJoy", "Application Name:" + PI.applicationInfo.name);
Log.w("3DiJoy", "Application in Package " + PI.applicationInfo.packageName);

3.得到APK中版本信息:
//<manifest> tag's "name" attribute.
Log.w("3DiJoy", "PackageInfo . PackageName:" + PI.packageName);

Log.w("3DiJoy", "PackageInfo . Version String:" + PI.versionName);
Log.w("3DiJoy", String.format("Version code:[%d]", PI.versionCode));
分别从: <manifest> tag's versionCode attribute和 <manifest> tag's versionName attribute.中得到信息。

注1:
ProcessName相关内容:
PI.activities[0].processName .它其实是activityInfo的父类: android.content.pm.ComponentInfo
的成员变量。是指此activity所运行的Process的名字。
此信息从main.xml的 "android:process" attribute中得到。如果没有设置,则与applicationInfo.processName相同。

注2:
PI.applicationInfo.processName
此Application将要运行的ProcessName.从Main.xml的"process" attribute得到。如果没有设置,则应该与PackageName相同。

注3:
PI.applicationInfo.packageName
Application所在的PackageName。

但在Android2.2下。
从Activity中取得ProcessName,为null.(PI.activities[0].processName)
从Application中取得ProcessName也为空。(PI.applicationInfo.processName)
但从Application中取得packageName却是正确的(PI.applicationInfo.packageName, 与PI.packageName相同)

注4:
getPackageArchiveInfo () 的参数1, archive 指的就是APK文件。

http://blog.sina.com.cn/s/blog_602f877001017pva.html

Android下得到APK包含信息的更多相关文章

  1. Android下读取logcat的信息

    有时我们需要在程序执行进程中遇到一些异常,需要收集一logcat的信息,android下就可以使用以下方法获取: private static String getLogcatInfo(){ Stri ...

  2. Android 下得到 未安装APK包含信息 等

    很多情况下,我们需要通过APK文件来得到它的一些信息. (此时此APK不一定被安装了) 0. 基础知识:可以通过android.content.Context的方法 getPackageManager ...

  3. C#获取apk版本信息

    获取很多人都会问我为什么要写这个博客,原因很简单,这次研发apk版本信息的时候网上查了很多的资料都没有这方面的信息,因此这次功能完了想写下方法,如果以后博友们遇到了可以直接copy,不用花很多的时间, ...

  4. [android]android下apk的安装过程

    /********************2016年4月23日更新********************************/ 知乎:有什么apk分析工具? 拿到了一个apk文件,怀疑不安全,在 ...

  5. [置顶] Android Studio apk打包以及获取apk签名信息

    首先说下Android Studio 主要分为以下几步 填写你的签名的一些信息 (例如签名的文件名.省份.密码 别名 就是你比如叫xxx 但是别名是xx张三 认证年限就是apk过期默认是25年 其他就 ...

  6. 在Android下通过ExifInterface类操作图片的Exif信息

    什么是Exif 先来了解什么是Exif.Exif是一种图像文件格式,它的数据存储于JPEG格式是完全相同的,实际上Exif格式就是JPEG格式头插入了 数码照片的信息,包括拍摄的光圈.快门.平衡白.I ...

  7. 上载android应用的apk文件变成了zip-网下转载的解决方案

    下载android应用的apk文件变成了zip--网上转载的解决方案 下载android应用的apk文件变成了zip--网上转载的解决方案 解决方案一. 最近把开发的android应用放在公司网站上, ...

  8. android 4.0.4系统下实现apk的静默安装和启动

    转 android 4.0.4系统下实现apk的静默安装和启动 分类: Android 2013-02-14 14:13 1762人阅读 评论(10) 收藏 举报 最近在android 4.0.4系统 ...

  9. 关于android 怎样安装 assets文件下的apk

    在自己的app中安装assets文件夹下的apk文件 public class MainActivity extends Activity { Context mContext; @Override ...

随机推荐

  1. poj 1416 Shredding Company( dfs )

    我的dfs真的好虚啊……,又是看的别人的博客做的 题目== 题目:http://poj.org/problem?id=1416 题意:给你两个数n,m;n表示最大数,m则是需要切割的数. 切割m,使得 ...

  2. 结构体buf_chunk_t

    /** Buffer pool chunk comprising buf_block_t */ typedef struct buf_chunk_struct buf_chunk_t; /** A c ...

  3. UVa 1605 (构造) Building for UN

    题意: 有n个国家,要设计一栋长方体的大楼,使得每个单位方格都属于其中一个国家,而且每个国家都要和其他国家相邻. 分析: 紫书上有一种很巧妙的构造方法: 一共有2层,每层n×n.一层是每行一个国家,另 ...

  4. POJ 3648 Wedding (2-SAT,经典)

    题意:新郎和新娘结婚,来了n-1对夫妻,这些夫妻包括新郎之间有通奸关系(包括男女,男男,女女),我们的目地是为了满足新娘,新娘对面不能坐着一对夫妻,也不能坐着有任何通奸关系的人,另外新郎一定要坐新娘对 ...

  5. 理解ThreadLocal

    ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...

  6. 通过autofac教你彻底明白依赖解耦(二)理论结合实践 - 大侠.Net

    上节说了一下基本的理论知识,例子可能不太好,不过无所谓了,目的是要让大家明白啥是依赖倒置和依赖注入,目的就达到了,简单一句话,这2玩意都是用来解耦合的. 不过依赖倒置这个词哥哥真不敢苟同,哥哥来个颠覆 ...

  7. put a ContextMenu into the header of a TabPage z

    publicclassMyTabControl:TabControl { protected override void OnMouseUp(MouseEventArgs e){ if(e.Butto ...

  8. 任务栏窗口和状态图标的闪动 z

    Demo程序: 实现任务栏窗体和图标的闪动: 整个程序是基于Windows Forms的,对于任务栏右下角状态图标的闪动,创建了一个类型:NotifyIconAnimator,基本上是包装了Windo ...

  9. NGINX(四)配置解析

    前言 nginx配置解析是在初始化ngx_cycle_t数据结构时,首先解析core模块,然后core模块依次解析自己的子模块. 配置解析过程 nginx调用ngx_conf_parse函数进行配置文 ...

  10. MAC虚拟机NAT方式共享上网设置

    有部分FY需要,我写一下我的方法吧,当初安装完MAC后,无法上网,网络搜索用的是HOST-only方法,试了几次都没有成功,后来尝试NAT方法,发现很简单. 我的主机系统:win7 64位,自动获取I ...