当前位置:操作系统 > 安卓/Android >>

android程序包管理器

包管理服务调用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;
 
补充:移动开发 , Android ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,