Android P/Q中PackageManagerService添加接口方法
低版本android系统PackageManagerService添加方法的文章:
为Android中PackageManagerService添加方法_散落一地的蓝的博客-CSDN博客
谷歌对于所有的类和API,分为开方和非开放两种,而开放的类和API,可以通过“Javadoc标签”与源码同步生成“程序的开发文档”;当我们修改或者添加一个新的API时,我们有两种方案可以避免出现上述错误.
其一是将该接口加上 非公开的标签:/*{@hide}/;
再者可以在修改后执行:make update-api(公开),将修改内容与API的doc文件更新到一致。
对于android P和android Q,除像低版本那样修改aidl以及java等文件的代码外,还需要将添加的接口方法在下面的文件中进行声明:
android P:
aosp/prebuilts/sdk/api/28.txt
diff --git a/sdk/api/28.txt b/sdk/api/28.txt
index 26e4298..e3afc34 100644
--- a/sdk/api/28.txt
+++ b/sdk/api/28.txt
@@ -11192,6 +11192,7 @@ package android.content.pm {
method public abstract android.content.pm.PackageInfo getPackageInfo(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.pm.PackageInfo getPackageInfo(android.content.pm.VersionedPackage, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract android.content.pm.PackageInstaller getPackageInstaller();
+ method public abstract int setName(java.lang.String);
method public abstract int getPackageUid(java.lang.String, int) throws android.content.pm.PackageManager.NameNotFoundException;
method public abstract java.lang.String[] getPackagesForUid(int);
method public abstract java.util.List<android.content.pm.PackageInfo> getPackagesHoldingPermissions(java.lang.String[], int);
aosp/frameworks/base/api/current.txt
diff --git a/base/api/current.txt b/base/api/current.txt
index e2289cc..32b4828 100644
--- a/base/api/current.txt
+++ b/base/api/current.txt
@@ -11252,6 +11252,7 @@ package android.content.pm {
method public abstract android.content.pm.ResolveInfo resolveActivity(android.content.Intent, int);
method public abstract android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
method public abstract android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
+ method public abstract int setName(java.lang.String);
method public abstract void setApplicationCategoryHint(java.lang.String, int);
method public abstract void setApplicationEnabledSetting(java.lang.String, int, int);
method public abstract void setComponentEnabledSetting(android.content.ComponentName, int, int);
aosp/frameworks/base/test-mock/api/android-test-mock-current.txt
diff --git a/base/test-mock/api/android-test-mock-current.txt b/base/test-mock/api/android-test-mock-current.txt
index f3b253c..3d056ea 100644
--- a/base/test-mock/api/android-test-mock-current.txt
+++ b/base/test-mock/api/android-test-mock-current.txt
@@ -279,6 +279,7 @@ package android.test.mock {
method public android.content.pm.ProviderInfo resolveContentProvider(java.lang.String, int);
method public android.content.pm.ResolveInfo resolveService(android.content.Intent, int);
method public android.content.pm.ResolveInfo resolveServiceAsUser(android.content.Intent, int, int);
+ method public int setName(java.lang.String);
method public void setApplicationCategoryHint(java.lang.String, int);
method public void setApplicationEnabledSetting(java.lang.String, int, int);
method public void setComponentEnabledSetting(android.content.ComponentName, int, int);
current.txt和android-test-mock-current.txt在修改完prebuilts下的代码后make update-api的时候好像可以自动生成。
android Q:
aosp/prebuilts/sdk/29/public/api/android.txt
diff --git a/sdk/29/public/api/android.txt b/sdk/29/public/api/android.txt
index cd78602..178f87b 100644
--- a/sdk/29/public/api/android.txt
+++ b/sdk/29/public/api/android.txt
@@ -11648,6 +11648,7 @@ package android.content.pm {
method @Nullable public abstract android.content.pm.ResolveInfo resolveActivity(@NonNull android.content.Intent, int);
method @Nullable public abstract android.content.pm.ProviderInfo resolveContentProvider(@NonNull String, int);
method @Nullable public abstract android.content.pm.ResolveInfo resolveService(@NonNull android.content.Intent, int);
+ method public abstract int setName(String);
method public abstract void setApplicationCategoryHint(@NonNull String, int);
method @RequiresPermission(value=android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE, conditional=true) public abstract void setApplicationEnabledSetting(@NonNull String, int, int);
method @RequiresPermission(value=android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE, conditional=true) public abstract void setComponentEnabledSetting(@NonNull android.content.ComponentName, int, int);
aosp/frameworks/base/api/current.txt
diff --git a/base/api/current.txt b/base/api/current.txt
index ba17486..e3b65fb 100644
--- a/base/api/current.txt
+++ b/base/api/current.txt
@@ -11651,6 +11651,7 @@ package android.content.pm {
method @Nullable public abstract android.content.pm.ResolveInfo resolveActivity(@NonNull android.content.Intent, int);
method @Nullable public abstract android.content.pm.ProviderInfo resolveContentProvider(@NonNull String, int);
method @Nullable public abstract android.content.pm.ResolveInfo resolveService(@NonNull android.content.Intent, int);
+ method public abstract int setName(String);
method public abstract void setApplicationCategoryHint(@NonNull String, int);
method @RequiresPermission(value=android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE, conditional=true) public abstract void setApplicationEnabledSetting(@NonNull String, int, int);
method @RequiresPermission(value=android.Manifest.permission.CHANGE_COMPONENT_ENABLED_STATE, conditional=true) public abstract void setComponentEnabledSetting(@NonNull android.content.ComponentName, int, int);
另外需要注意的是,高版本中继承抽象类PackageManager的除了MockPackageManager.java和ApplicationPackageManager.java之外还有其他几个类,都找出来把抽象方法实现下就可以了。