android封裝管理員

來源:互聯網
上載者:User

包管理服務調用ContextImpl類的getPakcageManager()函數返回PackageManager對象
系統許可權的目錄有兩個地方:
一個是/system/etc/permissions/*
比如這下面的platform.xml檔案,該檔案為某些uid和gid分配特定的許可權,
比如
<assign-permission name="android.permission.DELETE_PACKAGES" uid="shell" />
為shell這個uid分配刪除安裝包的許可權。
 
<permission name="android.permission.WRITE_EXTERNAL_STORAGE" >
    <group gid="sdcard_rw" />
</permission>
這個是為sdcard_rw的gid分配訪問SD卡的許可權。
 
而在應用程式中要獲得相關許可權,需要在AndroidManifest.xml中添加,比如擷取wifi許可權
<use-feature  android:name=”android.hardware.wifi” android:required=”true”>
其中required=”true”表示沒有wifi這個feature的話,程式不能被運行。
 
在/data/system/packages.xml檔案中儲存了所有安裝程式基本資料:包名、安裝路徑、程式需要的許可權、本地庫、userid等,比如
<package name="com.android.email" codePath="/system/app/Email.apk" nativeLibraryPath="/data/data/com.android.email/lib" flags="1" ft="1397c473c98" it="1397c473c98" ut="1397c473c98" version="234000" userId="10026">
 
ft  fix time
it  install time
ut  update time
 
 
包管理服務在啟動的時候,會解析相關的xml檔案,建立包資訊。包管理服務有兩個輔助的服務。DefaultContainerService.java和Installer.java
安裝位置:
     系統程式都儲存在/system/app下。使用者安裝的程式在/data/app下面,以”包名”+”-安裝次數”來給程式命名.通過dalvik原始碼可以知道,/data/dalvik-cache目錄是程式的可執行代碼,即dex檔案,通過dexopt產生的,看看裡面的檔案就知道命名規則了。
 
重要的成員變數Settings
 
包管理的代碼packageManagerService.java
    public static final IPackageManager main(Context context, boolean factoryTest) {
        PackageManagerService m = new PackageManagerService(context, factoryTest);
        ServiceManager.addService("package", m);
        return m;
    }
在packageManagerService.java裡有內部類Settings的建構函式
        Settings() {
            mSettingsFilename = new File(systemDir, "packages.xml");
            mBackupSettingsFilename = new File(systemDir, "packages-backup.xml");
            mPackageListFilename = new File(systemDir, "packages.list");
}
可以看到包管理的檔案是packages.xml,備份檔案是packages-backup.xml,安裝包的資訊是packages.list
從shell看看檔案的屬性,可以知道這幾個檔案所有使用者都是可以讀取的。
-rw-rw-r-- system   system       3644 2011-01-03 15:23 packages.list
-rw-rw-r-- system   system      60526 2011-01-03 15:23 packages.xml
開啟packages.list,裡面的每一行代表一個應用
com.android.launcher 10029 0 /data/data/com.android.launcher
第一項是包名,第二項是user id或shared user id,第三項表示是否可以被debug,最後是程式資料檔案的目錄
final HashMap<String, PackageParser.Package> mPackages是掃描程式目錄下APK檔案產生的
private final HashMap<String, PackageSetting> mPackages是讀取packages.xml產生的。
final HashMap<String, PackageSetting> mDisabledSysPackages是沒通過標準卸載方法刪除的程式列表
標準卸載會清楚packages.xml對應的項,如果用adb或直接操作檔案刪除apk,則packages.xml裡不會刪除,每次開機包管理服務會檢查packages.xml裡的程式在不在,不在則加到mDisabledSysPackages
 
已經刪除的包外部,資料還沒有清除的儲存在下面這個變數中。
// Packages that have been uninstalled and still need their external
// storage data deleted.
final ArrayList<String> mPackagesToBeCleaned
 
下面幾個變數是監聽對應的目錄是否有訪問、建立、修改、刪除、移動、關閉等操作等動作。具體可以參考FileObserver,使用linux的inotify來實現的,但是監控/data/data目錄需要system許可權才可以。
 
// This is the object monitoring the framework dir.
  final FileObserver mFrameworkInstallObserver;
// This is the object monitoring the system app dir.
  final FileObserver mSystemInstallObserver;
// This is the object monitoring the system app dir.
  final FileObserver mVendorInstallObserver;
// This is the object monitoring mAppInstallDir.
  final FileObserver mAppInstallObserver;
// This is the object monitoring mDrmAppPrivateInstallDir.
  final FileObserver mDrmAppInstallObserver;
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.