android史上最简单修改源码让你的应用静默升级

时间:2023-06-02 14:06:01 买帖  | 投诉/举报

篇首语:本文由小编为大家整理,主要介绍了android史上最简单修改源码让你的应用静默升级相关的知识,希望对你有一定的参考价值。

事情是酱紫滴,我们公司做无人零售这一块的东西,对接了微信的刷脸支付功能,在比较顺利对照微信刷脸SDK完成功能开发之后,按照它的要求开始了对系统层面的改造工程。碰到了一个对我来说较为棘手的问题,因为微信需要使其提供的刷脸app有静默升级的功能,以便于以后刷脸app更新时这台无人零售的设备能自动进行升级。

虽然我知道静默升级酱紫是个流氓行为,但是对于无人零售来讲,你不可能让运维人员去各个地方手动点击升级吧,而且还不能让人看到安装界面,所以我就在网上各种寻找,但是真如各位大佬所说,“这些需求自己百度就行,百度一大堆”。没错,百度的确是一大堆,但特么全是你抄我我抄你,抄来抄去自己都没验证就当做是自己成果了,现在百度想搜索个有效的答案真的跟淘宝看评价买东西一样困难了,因为都是假的。。。于是我就在想,如何能最简单化的实现静默升级功能,因为如果自己大改源码的话真的太麻烦了,写代码的时候都不会报错,编译之后才会报错,而且还不方便看。

好了,废话不多说,开始进入正题:

首先声明一下前提吧,看网上很多博主说的都不是太详细,所以给很多刚接触源码的新人造成很多不便。这套定制的ROM我首先是内置了微信刷脸app为系统app的,然后就可以开始对源码进行改造了,我一共进行了6个地方的改动,当然真正实现效果的是最后3个步骤,但是我不确定前面的步骤会不会对最终结果造成影响,我也懒得去验证了,反正现在静默升级的效果是达到了。

1.增加权限

修改/frameworks/base/core/res/androidManifest.xml:

--- a/frameworks/base/core/res/AndroidManifest.xml
+++ b/frameworks/base/core/res/AndroidManifest.xml

@@ -2451,6 +2451,10 @@     <p>Not for use by third-party applications. -->     <permission android:name="android.permission.INSTALL_PACKAGES"         android:protectionLevel="signature|privileged" />+    <permission android:name="android.permission.HIDE_INSTALL_PACKAGES"+        android:protectionLevel="normal" />+    <permission android:name="android.permission.HIDE_UNINSTALL_PACKAGES"+        android:protectionLevel="normal" />

 

2. 在IPackManger.Stub中添加权限判断

--- a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

@@ -11704,7 +11704,13 @@ public class PackageManagerService extends IPackageManager.Stub      public void installPackageAsUser(String originPath, IPackageInstallObserver2 observer,             int installFlags, String installerPackageName, int userId)          android.util.SeempLog.record(90);-        mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null);+        //mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null);+        if(mContext.checkCallingPermission(android.Manifest.permission.HIDE_INSTALL_PACKAGES) == PackageManager.PERMISSION_GRANTED) +            Slog.i(TAG, "installerPackageName: checkCallingPermission "+installerPackageName);+         else +            Slog.i(TAG, "installerPackageName: checkCallingPermission PERMISSION_DENIED"+PackageManager.PERMISSION_DENIED);+            mContext.enforceCallingOrSelfPermission(android.Manifest.permission.INSTALL_PACKAGES, null);+        

3. 添加自定义app到白名单

修改/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java:

--//    if (!requestFromUnknownSource) ++      if (pkgName.equals("你需要静默升级的应用包名") || !requestFromUnknownSource)           initiateInstall();          return;        

 

4. 针对特定app执行静默安装升级(静默升级无需手动点击安装,但是弹窗仍然存在。)
修改/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java修改:

--        startInstallConfirm();++        if(pkgName.equals("com.android.test"))/*这句替换成要静默安装的apk的包名就可以了*/++            Log.i("==test==", "application upgrade sliently");++            startInstall();++         else ++            startInstallConfirm();++          

 

5. 去掉安装app时的弹窗
修改/packages/apps/PackageInstaller/AndroidManifest.xml:

<application android:label="@string/app_name"<activity android:name=".PackageInstallerActivity"                android:configChanges="orientation|keyboardHidden|screenSize"                android:excludeFromRecents="true"--              android:theme="@android :style/Theme.Holo.DialogWhenLarge">++              android:theme="@android :style/Theme.Trunslucent.NoTitleBar">...

 

6. 隐藏安装页面

修改/packages/apps/PackageInstaller/res/layout/op_progress.xml:

直接在最顶层view里添加android:visibility="gone"进行全部页面的隐藏

 

--------------------------------我是分割线--------------------------------------

自此,静默升级功能已经实现,最终效果是点击新版本的apk进行安装,不会弹出任何安装页面,过一段很短的时间之后,新版本的app已经安装成功!!!

如果小伙伴有啥疑问,可以跟我交流互相学习,我也是刚入源码这个坑。我不确定这个方法实现起来是否够优雅,但是却是改动最小然后效果也达到了了的。俗话说,不论黑猫白猫能抓得住老鼠的就是好猫嘛~

以上是关于android史上最简单修改源码让你的应用静默升级的主要内容,如果未能解决你的问题,请参考以下文章