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; 
        } 
    }
  ....


目录
相关文章
|
3月前
|
Shell Linux 开发工具
"开发者的救星:揭秘如何用adb神器征服Android设备,开启高效调试之旅!"
【8月更文挑战第20天】Android Debug Bridge (adb) 是 Android 开发者必备工具,用于实现计算机与 Android 设备间通讯,执行调试及命令操作。adb 提供了丰富的命令行接口,覆盖从基础设备管理到复杂系统操作的需求。本文详细介绍 adb 的安装配置流程,并列举实用命令示例,包括设备连接管理、应用安装调试、文件系统访问等基础功能,以及端口转发、日志查看等高级技巧。此外,还提供了常见问题的故障排除指南,帮助开发者快速解决问题。掌握 adb 将极大提升 Android 开发效率,助力项目顺利推进。
87 0
|
2月前
|
开发框架 Dart 前端开发
Android 跨平台方案对比之Flutter 和 React Native
本文对比了 Flutter 和 React Native 这两个跨平台移动应用开发框架。Flutter 使用 Dart 语言,提供接近原生的性能和丰富的组件库;React Native 则基于 JavaScript,具备庞大的社区支持和灵活性。两者各有优势,选择时需考虑团队技能和项目需求。
347 8
|
2月前
|
Web App开发 网络协议 Android开发
Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【9月更文挑战第4天】本文详细对比了在Android平台上实现一对一音视频通话时常用的WebRTC、RTMP及RTSP三种技术方案。从技术原理、性能表现与开发难度等方面进行了深入分析,并提供了示例代码。WebRTC适合追求低延迟和高质量的场景,但开发成本较高;RTMP和RTSP则在简化开发流程的同时仍能保持较好的传输效果,适用于不同需求的应用场景。
160 1
|
3月前
|
存储 安全 API
Android经典实战之存储方案对比:SharedPreferences vs MMKV vs DataStore
本文介绍了 Android 开发中常用的键值对存储方案,包括 SharedPreferences、MMKV 和 DataStore,并对比了它们在性能、并发处理、易用性和稳定性上的特点。通过实际代码示例,帮助开发者根据项目需求选择最适合的存储方案,提升应用性能和用户体验。
93 1
|
3月前
|
Ubuntu Android开发
安卓系统调试与优化:(一)bootchart 的配置和使用
本文介绍了如何在安卓系统中配置和使用bootchart工具来分析系统启动时间,包括安装工具、设备端启用bootchart、PC端解析数据及分析结果的详细步骤。
191 0
安卓系统调试与优化:(一)bootchart 的配置和使用
|
3月前
|
Android开发 C++ 开发者
Android经典实战之跨平台开发方案:Kotlin Multiplatform vs Flutter
本文对比了Kotlin Multiplatform与Flutter两大跨平台开发框架,从技术特性、性能、开发效率、UI体验、可扩展性及适用场景等维度进行了详尽分析,帮助开发者根据项目需求和技术背景选择最优方案。
132 2
|
3月前
|
开发工具 Android开发
|
3月前
|
Web App开发 网络协议 Android开发
### 惊天对决!Android平台一对一音视频通话方案大比拼:WebRTC VS RTMP VS RTSP,谁才是王者?
【8月更文挑战第14天】随着移动互联网的发展,实时音视频通信已成为移动应用的关键部分。本文对比分析了Android平台上WebRTC、RTMP与RTSP三种主流技术方案。WebRTC提供端到端加密与直接数据传输,适于高质量低延迟通信;RTMP适用于直播场景,但需服务器中转;RTSP支持实时流播放,但在复杂网络下稳定性不及WebRTC。三种方案各有优劣,WebRTC功能强大但集成复杂,RTMP和RTSP实现较简单但需额外编码支持。本文还提供了示例代码以帮助开发者更好地理解和应用这些技术。
148 0
|
5月前
|
安全 API Android开发
Android打开USB调试命令
【6月更文挑战第20天】
188 1