Android下得到APK包含資訊

來源:互聯網
上載者:User

標籤:android   style   blog   http   io   color   ar   for   sp   

很多情況下,我們需要通過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.

例如:

1 <application android:label="@string/app_name" android:debuggable="true">2     <activity android:name=".HelloJni" android:label="@string/app_name">3         <intent-filter>4             <action android:name="android.intent.action.MAIN" />5             <category android:name="android.intent.category.LAUNCHER" />6         </intent-filter>7     </activity>8 </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包含資訊

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.