Android8.1 出厂前默认开启USB调试且自动授权,恢复出厂关闭USB调试方案

简介: Android8.1 出厂前默认开启USB调试且自动授权,恢复出厂关闭USB调试方案

前言


设备出厂前需要进行全检,需要用到 USB 调试,为了提高效率需修改系统为插入 USB 默认可直接调试,

不弹出授权框。发到客户手里则需要手动连续点击版本号才可开启调试且需要授权框.


修改方案


1、预装 UsbNova app,恢复出厂可卸载,用于区分是否出厂标志

2、在 Provision 中根据出厂标志是否开启 USB 调试

3、在 SystemUI 中根据出厂标志是否默认 USB 授权


修改文件清单


  modified:   build/make/target/product/core.mk
  modified:   frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
  modified:   packages/apps/Provision/src/com/android/provision/DefaultActivity.java
  new file:   packages/apps/UsbNova/Android.mk
  new file:   packages/apps/UsbNova/UsbNova.apk
  modified:   vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java


1、预装 UsbNova app,恢复出厂可卸载,用于区分是否出厂标志


新增 packages/apps/UsbNova,放置一个包名为 com.testusb.launcher 的空 app,在 core.mk 中增加配置

去除 PackageManagerService.java 中最新的 patch,导致 data/app 目录下的 apk 不预装


注释 else 语句块的抛出异常

frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

@@ -11668,11 +11668,12 @@ public class PackageManagerService extends IPackageManager.Stub
                                     + " but expected at " + known.codePathString
                                     + "; ignoring.");
                         }
-                    } else {
+                    }
+                    /* else {
                         throw new PackageManagerException(INSTALL_FAILED_INVALID_INSTALL_LOCATION,
                                 "Application package " + pkg.packageName
                                 + " not found; ignoring.");
-                    }
+                    }*/
                 }
             }

Android.mk 指定输出路径为 TARGET_OUT_DATA_APPS

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Module name should match apk name to be installed
LOCAL_MODULE := UsbNova
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT_DATA_APPS)
include $(BUILD_PREBUILT)

2、在 Provision 中根据出厂标志是否开启 USB 调试


Provision 在烧写完和恢复出厂时仅执行一次,所以选在这里开启 USB 调试,而且优先于其它 app 启动

通过判断我们刚刚添加的 UsbNova 包名,app 存在则为出厂前,app 不存在则已出厂,


因为出厂前会执行恢复出厂操作,会自动卸载 UsbNova


packages/apps/Provision/src/com/android/provision/DefaultActivity.java

package com.android.provision;
import android.app.Activity;
import android.content.ComponentName;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.provider.Settings;
import android.content.Context;
/**
 * Application that sets the provisioned bit, like SetupWizard does.
 */
public class DefaultActivity extends Activity {
    @Override
    protected void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        // Add a persistent setting to allow other apps to know the device has been provisioned.
        Settings.Global.putInt(getContentResolver(), Settings.Global.DEVICE_PROVISIONED, 1);
        Settings.Secure.putInt(getContentResolver(), Settings.Secure.USER_SETUP_COMPLETE, 1);
    //20190823 cczheng add default open adb model
        if(checkPackage("com.testusb.launcher", this)){
            Settings.Global.putInt(getContentResolver(), Settings.Global.ADB_ENABLED, 1);
            Settings.Global.putInt(getContentResolver(), Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, 1);
        }
        // remove this activity from the package manager.
        PackageManager pm = getPackageManager();
        ComponentName name = new ComponentName(this, DefaultActivity.class);
        pm.setComponentEnabledSetting(name, PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
                PackageManager.DONT_KILL_APP);
        try{
            Settings.System.putInt(getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 156);  
        }catch (Exception localException){
            localException.printStackTrace();
        }
        // terminate the activity.
        finish();
    }
  //20190823 cczheng add default open adb model
    public boolean checkPackage(String packageName,Context context){ 
        if (packageName == null || "".equals(packageName)) 
            return false; 
        try { 
            context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES); 
            return true; 
        }catch (Exception e){ 
             e.printStackTrace();
             return false; 
        } 
    }
}

3、在 SystemUI 中根据出厂标志是否默认 USB 授权


同样通过判断 UsbNova 包名

vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/usb/UsbDebuggingActivity.java

private class UsbDisconnectedReceiver extends BroadcastReceiver {
        private final Activity mActivity;
        public UsbDisconnectedReceiver(Activity activity) {
            mActivity = activity;
        }
        @Override
        public void onReceive(Context content, Intent intent) {
            String action = intent.getAction();
            if (!UsbManager.ACTION_USB_STATE.equals(action)) {
                return;
            }
            /*boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false);
            if (!connected) {
                mActivity.finish();
            }*/
            //20190823 cczheng add for default grant usb debug when usbnova app exist S
            boolean connected =  checkPackage("com.testusb.launcher", content);
            Log.e(TAG,"UsbDisconnectedReceiver connected="+connected);
            if (connected) {
                mActivity.finish();
                try {
                    IBinder b = ServiceManager.getService(USB_SERVICE);
                    IUsbManager service = IUsbManager.Stub.asInterface(b);
                    service.allowUsbDebugging(true, mKey);
                } catch (Exception e) {
                    Log.e(TAG, "Unable to notify Usb service", e);
                }
            }
            //E
        }
    }
    public boolean checkPackage(String packageName,Context context){ 
        if (packageName == null || "".equals(packageName)) 
            return false; 
        try { 
            context.getPackageManager().getApplicationInfo(packageName, PackageManager.GET_UNINSTALLED_PACKAGES); 
            return true; 
        }catch (Exception e){ 
             e.printStackTrace();
             return false; 
        } 
    }
  ....


目录
相关文章
|
4月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
121 0
|
1月前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
51 8
|
3月前
|
开发框架 Dart 前端开发
Android 跨平台方案对比之Flutter 和 React Native
本文对比了 Flutter 和 React Native 这两个跨平台移动应用开发框架。Flutter 使用 Dart 语言,提供接近原生的性能和丰富的组件库;React Native 则基于 JavaScript,具备庞大的社区支持和灵活性。两者各有优势,选择时需考虑团队技能和项目需求。
434 8
|
3月前
|
Web App开发 网络协议 Android开发
Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【9月更文挑战第4天】本文详细对比了在Android平台上实现一对一音视频通话时常用的WebRTC、RTMP及RTSP三种技术方案。从技术原理、性能表现与开发难度等方面进行了深入分析,并提供了示例代码。WebRTC适合追求低延迟和高质量的场景,但开发成本较高;RTMP和RTSP则在简化开发流程的同时仍能保持较好的传输效果,适用于不同需求的应用场景。
195 1
|
4月前
|
存储 安全 API
Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore
本文介绍了 Android 开发中常用的键值对存储方案,包括 SharedPreferences、MMKV 和 DataStore,并对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。
144 1
|
4月前
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
236 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
4月前
|
Android开发 C++ 开发者
Android经典实战之跨平台开发方案:Kotlin Multiplatform vs Flutter
本文对比了Kotlin Multiplatform与Flutter两大跨平台开发框架,从技术特性、性能、开发效率、UI体验、可扩展性及适用场景等维度进行了详尽分析,帮助开发者根据项目需求和技术背景选择最优方案。
185 2
|
Android开发 安全
Android Permissions管理之用户拒绝授权
Android Permissions管理之用户拒绝授权,在Marshmallow之前的安卓版本,应用的权限只需要注册一下,应用就会获取到,在Marshmallow之后,为了安全,全新的权限模型出现,每次使用对应权限的时候,都会弹出 是否让应用获取权限的弹框。
862 0
|
20天前
|
搜索推荐 前端开发 API
探索安卓开发中的自定义视图:打造个性化用户界面
在安卓应用开发的广阔天地中,自定义视图是一块神奇的画布,让开发者能够突破标准控件的限制,绘制出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战技巧,逐步揭示如何在安卓平台上创建和运用自定义视图来提升用户体验。无论你是初学者还是有一定经验的开发者,这篇文章都将为你打开新的视野,让你的应用在众多同质化产品中脱颖而出。
42 19
|
20天前
|
JSON Java API
探索安卓开发:打造你的首个天气应用
在这篇技术指南中,我们将一起潜入安卓开发的海洋,学习如何从零开始构建一个简单的天气应用。通过这个实践项目,你将掌握安卓开发的核心概念、界面设计、网络编程以及数据解析等技能。无论你是初学者还是有一定基础的开发者,这篇文章都将为你提供一个清晰的路线图和实用的代码示例,帮助你在安卓开发的道路上迈出坚实的一步。让我们一起开始这段旅程,打造属于你自己的第一个安卓应用吧!
46 14