参考文章:https://blog.csdn.net/loongembedded/article/details/54090873
只有使用特定签名的apk才可以安装,其他任何apk都不能安装

最好是应用预装一个使用对应签名的应用

需要修改的文件有以下几个
/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

/frameworks/base/core/java/android/content/pm/PackageManager.java

/packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java

/packages/apps/PackageInstaller/res/values/strings.xml

1 PackageManagerService.java

/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
添加getSignaturesByPackage()方法

//add start       private Signature[] getSignaturesByPackage(){           Signature[] signatures = null;           //已签名的已安装应用包名,与该应用签名不同的应用无法安装           String packageName = "com.xxxx.xxxxx";           PackageSetting ps = mSettings.mPackages.get(packageName);           if (ps != null) {                PackageParser.Package pkg = ps.pkg;                if (pkg == null) {                    pkg = new PackageParser.Package(packageName);                    pkg.applicationInfo.packageName = packageName;                    pkg.applicationInfo.flags = ps.pkgFlags | ApplicationInfo.FLAG_IS_DATA_ONLY;                    pkg.applicationInfo.publicSourceDir = ps.resourcePathString;                    pkg.applicationInfo.sourceDir = ps.codePathString;                    pkg.applicationInfo.dataDir = getDataPathForPackage(packageName, 0).getPath();                   // pkg.applicationInfo.nativeLibraryDir = ps.nativeLibraryPathString;                }                 PackageInfo packageInfo2 = generatePackageInfo(pkg, PackageManager.GET_SIGNATURES, UserHandle.getCallingUserId());                 if(packageInfo2 != null){                    signatures = packageInfo2.signatures;                }           }           mIsInstallApkFlag = false;           return signatures;       }     //add end

在scanPackageLI方法下加入如下代码

private PackageParser.Package scanPackageLI(PackageParser.Package pkg, int parseFlags , int scanFlags, long currentTime, UserHandle user) throws PackageManagerException {          boolean success = false;          //add start            //获得安装的应用的签名信息           Signature[] originalSignatures = getSignaturesByPackage();           if (originalSignatures != null) {               if (compareSignatures(originalSignatures, pkg.mSignatures) != PackageManager.SIGNATURE_MATCH) {                   int mLastScanError = PackageManager.INSTALL_FAILED_INVALID_SIGNATURES;                    throw new PackageManagerException(mLastScanError,                              "禁止安装,签名不符");               }          }          //add end         ...

同时要import缺少的类。

2 PackageManager.java

/frameworks/base/core/java/android/content/pm/PackageManager.java
加入错误代码 INSTALL_FAILED_INVALID_SIGNATURES

     /**       * cyh add      */      public static final int INSTALL_FAILED_INVALID_SIGNATURES = -27;

3 InstallAppProgress.java

/packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java
加入针对添加的错误代码的处理

private Handler mHandler = new Handler() {          public void handleMessage(Message msg) {              switch (msg.what) {          ...            //add start                     } else if (msg.arg1 ==  PackageManager.INSTALL_FAILED_INVALID_SIGNATURES){                       // Generic error handling for all other error codes.                          centerTextDrawable.setLevel(1);                        centerExplanationLabel = getExplanationFromErrorCode(msg.arg1);                        //centerTextLabel = R.string.install_failed_invalid_signature;                          centerTextLabel = R.string.install_failed_invalid_signature;                        mLaunchButton.setVisibility(View.INVISIBLE);                       //add end                     }  else {                         // Generic error handling for all other error codes.                         centerTextDrawable.setLevel(1);                         centerExplanationLabel = getExplanationFromErrorCode(msg.arg1);                         centerTextLabel = R.string.install_failed;                         mLaunchButton.setVisibility(View.INVISIBLE);                     }

4 strings.xml

/packages/apps/PackageInstaller/res/values/string.xml
添加错误信息install_failed_invalid_signature

禁止安装,签名不符

更多相关文章

  1. valgrind for android 编译安装
  2. andorid平板中安装完整的ubuntu系统
  3. Linux(ubuntu11.10)下 配置android4.0.3开发环境零基础教程
  4. 《Android(安卓)Fragment 非常详细的一篇》
  5. android学习轨迹之三:图片浏览+拨号程序总结
  6. Android窗口小部件开发
  7. android studio 导入module作为lib使用
  8. android环境搭配
  9. Android:Umeng(友盟)数据统计(一)

随机推荐

  1. Android中SharedPreferences的基本使用
  2. Android中的Bundle类
  3. Android-Layout布局
  4. Android官方入门文档[16]创建一个Fragmen
  5. android ListView内容无限循环显示
  6. 最近的工作记录:键盘敲入的Linux Shell命
  7. Android 新手摸石头过河
  8. android 自定义ratingbar 图片显示不全的
  9. Android接收jsp中动态生成的xml或json数
  10. NDK 学习 ndk基础