Android下得到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
//注意:此处第一次看到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相同。
//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
3.得到APK中版本信息:
Log.w("3DiJoy", "PackageInfo . PackageName:" + PI.packageName);
分别从: <manifest> tag's versionCode attribute和 <manifest> tag's versionName attribute.中得到信息。
===================================================================================
注1:
ProcessName相关内容:
PI.activities[0].processName .它其实是activityInfo的父类: android.content.pm.ComponentInfo
此信息从main.xml的 "android:process" attribute中得到。如果没有设置,则与applicationInfo.processName相同。
注2:
PI.applicationInfo.processName
此Application将要运行的ProcessName.从Main.xml的"process" attribute得到。如果没有设置,则应该与PackageName相同。
注3:
PI.applicationInfo.packageName
Application所在的PackageName。
但Sam发现:
在Android2.2下。
从Activity中取得ProcessName,为null.(PI.activities[0].processName)
但从Application中取得packageName却是正确的(PI.applicationInfo.packageName, 与PI.packageName相同)
getPackageArchiveInfo () 的参数1, archive 指的就是APK文件。