zoukankan      html  css  js  c++  java
  • Android RK 内置应用 不可卸载

    一.第一种方案

    1.1.将客户应用 内置到system/app 也就是将应用提升至系统级别  需要注意的是要将依赖lib库 拷贝到system/lib 下面
    静默升级 也需要 更新 或者添加的库以前没有的库    建议:使用到不需要更新的apk 或者手动更新 

    二.第二种方案
    2.1.预装应有 到system/preinstall 但不允许卸载  静默升级 推荐使用

    仨.第二种方案 两种改法   OS  Android5.1

    3.1.Fist 改法

    拖动到删除按钮  直接识别到可不包名不让卸载

    diff --git a/packages/apps/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java b/packages/apps/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
    index 449bfad..5d12be9 100755
    --- a/packages/apps/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
    +++ b/packages/apps/PackageInstaller/src/com/android/packageinstaller/UninstallerActivity.java
    @@ -216,8 +216,13 @@ public class UninstallerActivity extends Activity implements OnCancelListener{
                     // Continue as the ActivityInfo isn't critical.
                 }
             }
    -
    -        showConfirmationDialog();
    +		
    +        if((packageName != null)&& packageName.contains("com.gatsby.test")){
    +			Log.d("gatsby","UninstallerActivity uninstall ");
    +			 System.exit(0);       			
    +		}else {		
    +        	showConfirmationDialog();
    +		}		
         }
         
         public void OnCreateDialog(){
    

    3.2.Second 改法  识别包名不显示 卸载按钮

    a.packages\apps\Launcher3\src\com\android\launcher3\DeleteDropTarget.java

    boolean useDeleteLabel = !useUninstallLabel && source.supportsDeleteDropTarget(); 

            if(info instanceof AppInfo){
            	AppInfo appInfo = (AppInfo) info;
            	if(appInfo.componentName.getPackageName().equals("com.gatsby.test")){        	
            	 useUninstallLabel = false;       	
            	} 
    
            }      
    控制是否显示长按 “卸载” 的选项 
        @Override
        public void onDragStart(DragSource source, Object info, int dragAction) {
            boolean isVisible = true;
            boolean useUninstallLabel = !LauncherAppState.isDisableAllApps() &&
                    isAllAppsApplication(source, info);
            boolean useDeleteLabel = !useUninstallLabel && source.supportsDeleteDropTarget();
    
            // If we are dragging an application from AppsCustomize, only show the control if we can
            // delete the app (it was downloaded), and rename the string to "uninstall" in such a case.
            // Hide the delete target if it is a widget from AppsCustomize.
            if (!willAcceptDrop(info) || isAllAppsWidget(source, info)) {
                isVisible = false;
            }
            if (useUninstallLabel) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
                    UserManager userManager = (UserManager)
                            getContext().getSystemService(Context.USER_SERVICE);
                    Bundle restrictions = userManager.getUserRestrictions();
                    if (restrictions.getBoolean(UserManager.DISALLOW_APPS_CONTROL, false)
                            || restrictions.getBoolean(UserManager.DISALLOW_UNINSTALL_APPS, false)) {
                        isVisible = false;
                    }
                }
            }
    
            if (useUninstallLabel) {
                setCompoundDrawablesRelativeWithIntrinsicBounds(mUninstallDrawable, null, null, null);
            } else if (useDeleteLabel) {
                setCompoundDrawablesRelativeWithIntrinsicBounds(mRemoveDrawable, null, null, null);
            } else {
                isVisible = false;
            }
            mCurrentDrawable = (TransitionDrawable) getCurrentDrawable();
    
            mActive = isVisible;
            resetHoverColor();
            ((ViewGroup) getParent()).setVisibility(isVisible ? View.VISIBLE : View.GONE);
            if (isVisible && getText().length() > 0) {
                setText(useUninstallLabel ? R.string.delete_target_uninstall_label
                    : R.string.delete_target_label);
            }
        }

    b. packages\apps\Settings\src\com\android\settings\applications\InstalledAppDetails.java

    设置应用信息 卸载项目

    mUninstallButton.setOnClickListener(this); 让点击无效

        private void initUninstallButtons() {
            mUpdatedSysApp = (mAppEntry.info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
            final boolean isBundled = (mAppEntry.info.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
            boolean enabled = true;
            if (mUpdatedSysApp) {
                mUninstallButton.setText(R.string.app_factory_reset);
                boolean showSpecialDisable = false;
                if (isBundled) {
                    showSpecialDisable = handleDisableable(mSpecialDisableButton);
                    mSpecialDisableButton.setOnClickListener(this);
                }
                if (mAppControlRestricted) {
                    showSpecialDisable = false;
                }
                mMoreControlButtons.setVisibility(showSpecialDisable ? View.VISIBLE : View.GONE);
            } else {
                mMoreControlButtons.setVisibility(View.GONE);
                if (isBundled) {
                    enabled = handleDisableable(mUninstallButton);
                } else if ((mPackageInfo.applicationInfo.flags
                        & ApplicationInfo.FLAG_INSTALLED) == 0
                        && mUserManager.getUsers().size() >= 2) {
                    // When we have multiple users, there is a separate menu
                    // to uninstall for all users.
                    mUninstallButton.setText(R.string.uninstall_text);
                    enabled = false;
                } else {
                    mUninstallButton.setText(R.string.uninstall_text);
                }
            }
            // If this is a device admin, it can't be uninstalled or disabled.
            // We do this here so the text of the button is still set correctly.
            if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) {
                enabled = false;
            }
    
            // Home apps need special handling.  Bundled ones we don't risk downgrading
            // because that can interfere with home-key resolution.  Furthermore, we
            // can't allow uninstallation of the only home app, and we don't want to
            // allow uninstallation of an explicitly preferred one -- the user can go
            // to Home settings and pick a different one, after which we'll permit
            // uninstallation of the now-not-default one.
            if (enabled && mHomePackages.contains(mPackageInfo.packageName)) {
                if (isBundled) {
                    enabled = false;
                } else {
                    ArrayList<ResolveInfo> homeActivities = new ArrayList<ResolveInfo>();
                    ComponentName currentDefaultHome  = mPm.getHomeActivities(homeActivities);
                    if (currentDefaultHome == null) {
                        // No preferred default, so permit uninstall only when
                        // there is more than one candidate
                        enabled = (mHomePackages.size() > 1);
                    } else {
                        // There is an explicit default home app -- forbid uninstall of
                        // that one, but permit it for installed-but-inactive ones.
                        enabled = !mPackageInfo.packageName.equals(currentDefaultHome.getPackageName());
                    }
                }
            }
    
            if (mAppControlRestricted) {
                enabled = false;
            }
    
            mUninstallButton.setEnabled(enabled);
            if (enabled) {
                // Register listener
                mUninstallButton.setOnClickListener(this);
            }
        }
    

      

  • 相关阅读:
    JavaScript中双叹号“!!”作用
    JavaScript两个变量的值交换的多种方式
    自定义npm包——typeScript版本
    自定义npm包的创建、发布、更新和撤销
    vuex概念总结及简单使用实例
    详解javascript: void(0);
    面向对象的CSS
    vue指令概览
    实现水平居中的办法
    C#分块下载文件
  • 原文地址:https://www.cnblogs.com/crushgirl/p/15730074.html
Copyright © 2011-2022 走看看