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

	....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章