為Android中PackageManagerService添加方法,androidsdkmanager
PackageManagerService相關類結構
分析從可以看出若想為PackageManagerService添加方法需要進行以下改動1,在IPackageManager.aidl檔案中增加方法的聲明;2,在PackageManager類中增加抽象方法說明;3,在ApplicationPackageManager中增加方法,具體實現為調用遠程PackageManagerService的方法;4,在PackageManagerService中增加方法的具體實現;
註:由於MockPackageManager類也繼承了PackageManager類,故也需要加入一些實現的代碼;增加的方法要設定為hide,或者更改API-List加入新增加的方法
Demo
目標:在PackageManagerService加入方法public String getHello();
第一步:在IPackageManager.aidl增加getHello()方法聲明
interface IPackageManager { PackageInfo getPackageInfo(String packageName, int flags); int getPackageUid(String packageName); int[] getPackageGids(String packageName); String[] currentToCanonicalPackageNames(in String[] names); String[] canonicalToCurrentPackageNames(in String[] names); PermissionInfo getPermissionInfo(String name, int flags); List<PermissionInfo> queryPermissionsByGroup(String group, int flags); PermissionGroupInfo getPermissionGroupInfo(String name, int flags); List<PermissionGroupInfo> getAllPermissionGroups(int flags); ApplicationInfo getApplicationInfo(String packageName, int flags); ActivityInfo getActivityInfo(in ComponentName className, int flags); ActivityInfo getReceiverInfo(in ComponentName className, int flags); . . . . . . String getHello();}
第二步:PackageManager類中增加抽象方法說明
public abstract class PackageManager { /** * This exception is thrown when a given package, application, or component * name can not be found. */ public static class NameNotFoundException extends AndroidException { public NameNotFoundException() { } public NameNotFoundException(String name) { super(name); } } . . . . . . /** * @hide */ public abstract String getHello();}
第三步:在PackageManagerService中增加getHello()方法的具體實現
public class PackageManagerService extends IPackageManager.Stub { static final String TAG = "PackageManager"; static final boolean DEBUG_SETTINGS = false; private static final boolean DEBUG_PREFERRED = false; static final boolean DEBUG_UPGRADE = false; private static final boolean DEBUG_INSTALL = false; private static final boolean DEBUG_REMOVE = false; private static final boolean DEBUG_SHOW_INFO = false; private static final boolean DEBUG_PACKAGE_INFO = false; . . . . . . . public String getHello(){ return "Hello,PMS"; }}
第四步:在ApplicationPackageManager中增加getHello()方法,具體實現為調用遠程PackageManagerService的getHello()方法
final class ApplicationPackageManager extends PackageManager { private static final String TAG = "ApplicationPackageManager"; private final static boolean DEBUG = false; private final static boolean DEBUG_ICONS = false; @Override public PackageInfo getPackageInfo(String packageName, int flags) throws NameNotFoundException { try { PackageInfo pi = mPM.getPackageInfo(packageName, flags); if (pi != null) { return pi; } } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } throw new NameNotFoundException(packageName); } @Override public String[] currentToCanonicalPackageNames(String[] names) { try { return mPM.currentToCanonicalPackageNames(names); } catch (RemoteException e) { throw new RuntimeException("Package manager has died", e); } } . . . . . . . /** * @hide */ @Overridepublic String getHello() {// TODO Auto-generated method stubtry {return mPM.isThirdParty(name);} catch (RemoteException e) {throw new RuntimeException("Package manager has died", e);}}}