前言
設備出廠前需要進行全檢,需要用到 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;
}
}
....