欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報邀請碼778899分享:USB開啟ADB設置流程

柚子快報邀請碼778899分享:USB開啟ADB設置流程

http://yzkb.51969.com/

第一步:設置里打開adb調試選項

源碼路徑:packages/apps/Settings/src/com/android/settings/development/AdbPreferenceController.java

public void onAdbDialogConfirmed() {

writeAdbSetting(true);

}

writeAdbSetting 函數(shù)所在源碼路徑:frameworks/base/packages/SettingsLib/src/com/android/settingslib/development/AbstractEnableAdbPreferenceController.java

protected void writeAdbSetting(boolean enabled) {

Settings.Global.putInt(mContext.getContentResolver(),

Settings.Global.ADB_ENABLED, enabled ? ADB_SETTING_ON : ADB_SETTING_OFF);

notifyStateChanged();

}

private void notifyStateChanged() {

LocalBroadcastManager.getInstance(mContext)

.sendBroadcast(new Intent(ACTION_ENABLE_ADB_STATE_CHANGED));

}

上述代碼主要做了兩個操作:

1)修改 Settings的 adb_enable 值

2)廣播adb狀態(tài)改變

setting應用中有監(jiān)聽adb狀態(tài)廣播:packages/apps/Settings/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java

其作用只是調用其注冊的Controller的onAdbSettingChanged方法。

private final BroadcastReceiver mEnableAdbReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

for (AbstractPreferenceController controller : mPreferenceControllers) {

if (controller instanceof AdbOnChangeListener) {

((AdbOnChangeListener) controller).onAdbSettingChanged();

}

}

}

};

private void registerReceivers() {

LocalBroadcastManager.getInstance(getContext())

.registerReceiver(mEnableAdbReceiver, new IntentFilter(

AdbPreferenceController.ACTION_ENABLE_ADB_STATE_CHANGED));

final IntentFilter filter = new IntentFilter();

filter.addAction(BluetoothA2dp.ACTION_CODEC_CONFIG_CHANGED);

getActivity().registerReceiver(mBluetoothA2dpReceiver, filter);

}

setting app 中 接口同目錄的?VerifyAppsOverUsbPreferenceController類 繼承了?AdbOnChangeListener 接口

@Override

public void updateState(Preference preference) {

final RestrictedSwitchPreference restrictedPreference =

(RestrictedSwitchPreference) preference;

if (!shouldBeEnabled()) {

restrictedPreference.setChecked(false);

restrictedPreference.setDisabledByAdmin(null);

restrictedPreference.setEnabled(false);

return;

}

final EnforcedAdmin enforcingAdmin = mRestrictedLockUtils.checkIfRestrictionEnforced(

mContext, UserManager.ENSURE_VERIFY_APPS, UserHandle.myUserId());

if (enforcingAdmin != null) {

restrictedPreference.setChecked(true);

restrictedPreference.setDisabledByAdmin(enforcingAdmin);

return;

}

restrictedPreference.setEnabled(true);

final boolean checked = Settings.Global.getInt(mContext.getContentResolver(),

Settings.Global.PACKAGE_VERIFIER_INCLUDE_ADB, SETTING_VALUE_ON)

!= SETTING_VALUE_OFF;

restrictedPreference.setChecked(checked);

}

@Override

public void onAdbSettingChanged() {

if (isAvailable()) {

updateState(mPreference);

}

}

上述代碼只是做一些狀態(tài)的改變。

第二步:開啟ADB服務連接

修改settings里adb_enable的值時,會觸發(fā)相關的監(jiān)聽。AdbService初始化時,監(jiān)聽了adb_enable 狀態(tài)改變

private void initAdbState() {

try {

/*

* Use the normal bootmode persistent prop to maintain state of adb across

* all boot modes.

*/

mIsAdbUsbEnabled = true;//containsFunction(

//SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, ""),

// UsbManager.USB_FUNCTION_ADB);

mIsAdbWifiEnabled = "1".equals(

SystemProperties.get(WIFI_PERSISTENT_CONFIG_PROPERTY, "0"));

// register observer to listen for settings changes

mObserver = new AdbSettingsObserver();

mContentResolver.registerContentObserver(

Settings.Global.getUriFor(Settings.Global.ADB_ENABLED), //監(jiān)聽 adb_enable值的改變

false, mObserver);

mContentResolver.registerContentObserver(

Settings.Global.getUriFor(Settings.Global.ADB_WIFI_ENABLED),

false, mObserver);

} catch (Exception e) {

Slog.e(TAG, "Error in initAdbState", e);

}

}

private class AdbSettingsObserver extends ContentObserver {

private final Uri mAdbUsbUri = Settings.Global.getUriFor(Settings.Global.ADB_ENABLED);

private final Uri mAdbWifiUri = Settings.Global.getUriFor(Settings.Global.ADB_WIFI_ENABLED);

AdbSettingsObserver() {

super(null);

}

@Override

public void onChange(boolean selfChange, @NonNull Uri uri, @UserIdInt int userId) {

if (mAdbUsbUri.equals(uri)) {

boolean shouldEnable = true;//(Settings.Global.getInt(mContentResolver, //always enable usb adb

// Settings.Global.ADB_ENABLED, 0) > 0);

FgThread.getHandler().sendMessage(obtainMessage(

AdbService::setAdbEnabled, AdbService.this, shouldEnable,

AdbTransportType.USB));

} else if (mAdbWifiUri.equals(uri)) {

boolean shouldEnable = (Settings.Global.getInt(mContentResolver,

Settings.Global.ADB_WIFI_ENABLED, 0) > 0);

FgThread.getHandler().sendMessage(obtainMessage(

AdbService::setAdbEnabled, AdbService.this, shouldEnable,

AdbTransportType.WIFI));

}

}

}

最終調用?setAdbEnabled 來設置adb 狀態(tài),代碼如下:

private void startAdbd() {

SystemProperties.set(CTL_START, ADBD);

}

private void stopAdbd() {

if (!mIsAdbUsbEnabled && !mIsAdbWifiEnabled) {

SystemProperties.set(CTL_STOP, ADBD);

}

}

private void setAdbEnabled(boolean enable, byte transportType) {

if (DEBUG) {

Slog.d(TAG, "setAdbEnabled(" + enable + "), mIsAdbUsbEnabled=" + mIsAdbUsbEnabled

+ ", mIsAdbWifiEnabled=" + mIsAdbWifiEnabled + ", transportType="

+ transportType);

}

if (transportType == AdbTransportType.USB && enable != mIsAdbUsbEnabled) {

mIsAdbUsbEnabled = enable;

} else if (transportType == AdbTransportType.WIFI && enable != mIsAdbWifiEnabled) {

mIsAdbWifiEnabled = enable;

if (mIsAdbWifiEnabled) {

if (!AdbProperties.secure().orElse(false) && mDebuggingManager == null) {

// Start adbd. If this is secure adb, then we defer enabling adb over WiFi.

SystemProperties.set(WIFI_PERSISTENT_CONFIG_PROPERTY, "1");

mConnectionPortPoller =

new AdbDebuggingManager.AdbConnectionPortPoller(mPortListener);

mConnectionPortPoller.start();

}

} else {

// Stop adb over WiFi.

SystemProperties.set(WIFI_PERSISTENT_CONFIG_PROPERTY, "0");

if (mConnectionPortPoller != null) {

mConnectionPortPoller.cancelAndWait();

mConnectionPortPoller = null;

}

}

} else {

// No change

return;

}

if (enable) {

startAdbd();

} else {

stopAdbd();

}

for (IAdbTransport transport : mTransports.values()) {

try {

transport.onAdbEnabled(enable, transportType);

} catch (RemoteException e) {

Slog.w(TAG, "Unable to send onAdbEnabled to transport " + transport.toString());

}

}

if (mDebuggingManager != null) {

mDebuggingManager.setAdbEnabled(enable, transportType);

}

}

這里主要包括三步:

1)startAdbd 會設置?ctl.start 屬性開啟native層的adbd服務

2)調用transport.onAdbEnabled, 代碼位于?UsbDeviceManager類

3)調用?mDebuggingManager.setAdbEnabled

UsbDeviceManager類路徑位于?frameworks/base/services/usb/java/com/android/server/usb/UsbDeviceManager.java

private static class AdbTransport extends IAdbTransport.Stub {

private final UsbHandler mHandler;

AdbTransport(UsbHandler handler) {

mHandler = handler;

}

@Override

public void onAdbEnabled(boolean enabled, byte transportType) {

if (transportType == AdbTransportType.USB) {

mHandler.sendMessage(MSG_ENABLE_ADB, enabled);

}

}

}

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

………………

case MSG_ENABLE_ADB:

setAdbEnabled(true); // alway true msg.arg1 == 1

break;

………………

}

}

通過消息發(fā)送和處理后執(zhí)行? setAdbEnabled 方法。

private void setAdbEnabled(boolean enable) {

if (DEBUG) Slog.d(TAG, "setAdbEnabled: " + enable);

if (enable) {

setSystemProperty(USB_PERSISTENT_CONFIG_PROPERTY, UsbManager.USB_FUNCTION_ADB);

} else {

setSystemProperty(USB_PERSISTENT_CONFIG_PROPERTY, "");

}

setEnabledFunctions(mCurrentFunctions, true);

updateAdbNotification(false);

}

這個主要做的是設置系統(tǒng)屬性??persist.sys.usb.config = adb,然后調用?setEnabledFunctions 函數(shù)

@Override

protected void setEnabledFunctions(long usbFunctions, boolean forceRestart) {

boolean usbDataUnlocked = isUsbDataTransferActive(usbFunctions);

if (DEBUG) {

Slog.d(TAG, "setEnabledFunctions functions=" + usbFunctions + ", "

+ "forceRestart=" + forceRestart + ", usbDataUnlocked=" + usbDataUnlocked);

}

if (usbDataUnlocked != mUsbDataUnlocked) {

mUsbDataUnlocked = usbDataUnlocked;

updateUsbNotification(false);

forceRestart = true;

}

/**

* Try to set the enabled functions.

*/

final long oldFunctions = mCurrentFunctions;

final boolean oldFunctionsApplied = mCurrentFunctionsApplied;

if (trySetEnabledFunctions(usbFunctions, forceRestart)) {

return;

}

/**

* Didn't work. Try to revert changes.

* We always reapply the policy in case certain constraints changed such as

* user restrictions independently of any other new functions we were

* trying to activate.

*/

if (oldFunctionsApplied && oldFunctions != usbFunctions) {

Slog.e(TAG, "Failsafe 1: Restoring previous USB functions.");

if (trySetEnabledFunctions(oldFunctions, false)) {

return;

}

}

/**

* Still didn't work. Try to restore the default functions.

*/

Slog.e(TAG, "Failsafe 2: Restoring default USB functions.");

if (trySetEnabledFunctions(UsbManager.FUNCTION_NONE, false)) {

return;

}

/**

* Now we're desperate. Ignore the default functions.

* Try to get ADB working if enabled.

*/

Slog.e(TAG, "Failsafe 3: Restoring empty function list (with ADB if enabled).");

if (trySetEnabledFunctions(UsbManager.FUNCTION_NONE, false)) {

return;

}

/**

* Ouch.

*/

Slog.e(TAG, "Unable to set any USB functions!");

}

setEnabledFunctions? 函數(shù)主要調用 trySetEnabledFunctions 設置 usb的狀態(tài),如果設置返回失敗,則一步步還原設置usb狀態(tài)

private boolean trySetEnabledFunctions(long usbFunctions, boolean forceRestart) {

String functions = null;

if (usbFunctions != UsbManager.FUNCTION_NONE) {

functions = UsbManager.usbFunctionsToString(usbFunctions);

}

mCurrentFunctions = usbFunctions;

if (functions == null || applyAdbFunction(functions)

.equals(UsbManager.USB_FUNCTION_NONE)) {

functions = UsbManager.usbFunctionsToString(getChargingFunctions());

}

functions = applyAdbFunction(functions);

String oemFunctions = applyOemOverrideFunction(functions);

if (!isNormalBoot() && !mCurrentFunctionsStr.equals(functions)) {

setSystemProperty(getPersistProp(true), functions);

}

if ((!functions.equals(oemFunctions)

&& !mCurrentOemFunctions.equals(oemFunctions))

|| !mCurrentFunctionsStr.equals(functions)

|| !mCurrentFunctionsApplied

|| forceRestart) {

Slog.i(TAG, "Setting USB config to " + functions);

mCurrentFunctionsStr = functions;

mCurrentOemFunctions = oemFunctions;

mCurrentFunctionsApplied = false;

/**

* Kick the USB stack to close existing connections.

*/

setUsbConfig(UsbManager.USB_FUNCTION_NONE);

if (!waitForState(UsbManager.USB_FUNCTION_NONE)) {

Slog.e(TAG, "Failed to kick USB config");

return false;

}

/**

* Set the new USB configuration.

*/

setUsbConfig(oemFunctions);

if (mBootCompleted

&& (containsFunction(functions, UsbManager.USB_FUNCTION_MTP)

|| containsFunction(functions, UsbManager.USB_FUNCTION_PTP))) {

/**

* Start up dependent services.

*/

updateUsbStateBroadcastIfNeeded(getAppliedFunctions(mCurrentFunctions));

}

if (!waitForState(oemFunctions)) {

Slog.e(TAG, "Failed to switch USB config to " + functions);

return false;

}

mCurrentFunctionsApplied = true;

}

return true;

}

這里主要包含兩步:

1)調用?setUsbConfig 設置usb狀態(tài)

2)調用?waitForState 判斷狀態(tài)是否設置成功

private void setUsbConfig(String config) {

if (DEBUG) Slog.d(TAG, "setUsbConfig(" + config + ")");

/**

* set the new configuration

* we always set it due to b/23631400, where adbd was getting killed

* and not restarted due to property timeouts on some devices

*/

setSystemProperty(USB_CONFIG_PROPERTY, config);

}

設置?sys.usb.config = adb

第二步的waitForState 方法如下:

private boolean waitForState(String state) {

// wait for the transition to complete.

// give up after 1 second.

String value = null;

for (int i = 0; i < 20; i++) {

// State transition is done when sys.usb.state is set to the new configuration

value = getSystemProperty(USB_STATE_PROPERTY, "");

if (state.equals(value)) return true;

SystemClock.sleep(50);

}

Slog.e(TAG, "waitForState(" + state + ") FAILED: got " + value);

return false;

}

這個函數(shù)在 1s 內循環(huán)讀取?sys.usb.state 的值,如果最后不是預期的值,則返回false。

最后是執(zhí)行?mDebuggingManager.setAdbEnabled

public void setAdbEnabled(boolean enabled, byte transportType) {

if (transportType == AdbTransportType.USB) {

mHandler.sendEmptyMessage(enabled ? AdbDebuggingHandler.MESSAGE_ADB_ENABLED

: AdbDebuggingHandler.MESSAGE_ADB_DISABLED);

} else if (transportType == AdbTransportType.WIFI) {

mHandler.sendEmptyMessage(enabled ? AdbDebuggingHandler.MSG_ADBDWIFI_ENABLE

: AdbDebuggingHandler.MSG_ADBDWIFI_DISABLE);

} else {

throw new IllegalArgumentException(

"setAdbEnabled called with unimplemented transport type=" + transportType);

}

}

對應消息處理函數(shù):

public void handleMessage(Message msg) {

if (mAdbKeyStore == null) {

mAdbKeyStore = new AdbKeyStore();

}

switch (msg.what) {

case MESSAGE_ADB_ENABLED:

if (mAdbUsbEnabled) {

break;

}

startAdbDebuggingThread();

mAdbUsbEnabled = true;

break;

case MESSAGE_ADB_DISABLED:

if (!mAdbUsbEnabled) {

break;

}

stopAdbDebuggingThread();

mAdbUsbEnabled = false;

break;

………………………………

}

}

private void startAdbDebuggingThread() {

++mAdbEnabledRefCount;

if (DEBUG) Slog.i(TAG, "startAdbDebuggingThread ref=" + mAdbEnabledRefCount);

if (mAdbEnabledRefCount > 1) {

return;

}

registerForAuthTimeChanges();

mThread = new AdbDebuggingThread();

mThread.start();

mAdbKeyStore.updateKeyStore();

scheduleJobToUpdateAdbKeyStore();

}

startAdbDebuggingThread 開啟 java層 adb線程開始接收處理控制命令。

第三步:native層服務及屬性

上述服務完成后,java層的相關操作都已經(jīng)完成,總結來看,java層做了三個操作

1、設置?ctl.start = adb 來打開adb服務。native層 adbd服務入口函數(shù)位于?system/core/adb/daemon/main.cpp 文件。

2、設置屬性?persist.sys.usb.config = adb

3、設置屬性?sys.usb.config = adb

java函數(shù)?waitForState 會讀取?sys.usb.state 屬性的值,如果不是 adb , 會返回false, 接著?setEnabledFunctions 會執(zhí)行后續(xù)的代碼將usb狀態(tài)設置為空。那么?sys.usb.state 屬性的值是在哪設置的呢?

在init進程中會監(jiān)聽各種屬性的變化,并作出相應的處理,與adb設置相關的init主要有兩個:

system/core/rootdir/init.usb.rc

system/core/rootdir/init.usb.configfs.rc

相關的操作中,會將?sys.usb.state 的值設置成? sys.usb.config 的值

on property:init.svc.adbd=stopped

# setprop sys.usb.ffs.ready 0

on property:sys.usb.config=adb && property:sys.usb.configfs=1

start adbd

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=adb && property:sys.usb.configfs=1

write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "adb"

symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f1

write /config/usb_gadget/g1/UDC ${sys.usb.controller}

setprop sys.usb.state ${sys.usb.config}

on property:sys.usb.config=mtp && property:sys.usb.configfs=1

write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp"

symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1

write /config/usb_gadget/g1/UDC ${sys.usb.controller}

setprop sys.usb.state ${sys.usb.config}

on property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1

start adbd

on property:sys.usb.ffs.ready=1 && property:sys.usb.config=mtp,adb && property:sys.usb.configfs=1

write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "mtp_adb"

symlink /config/usb_gadget/g1/functions/mtp.gs0 /config/usb_gadget/g1/configs/b.1/f1

symlink /config/usb_gadget/g1/functions/ffs.adb /config/usb_gadget/g1/configs/b.1/f2

write /config/usb_gadget/g1/UDC ${sys.usb.controller}

setprop sys.usb.state ${sys.usb.config}

on property:sys.usb.config=ptp && property:sys.usb.configfs=1

write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "ptp"

symlink /config/usb_gadget/g1/functions/ptp.gs1 /config/usb_gadget/g1/configs/b.1/f1

write /config/usb_gadget/g1/UDC ${sys.usb.controller}

setprop sys.usb.state ${sys.usb.config}

on property:sys.usb.config=ptp,adb && property:sys.usb.configfs=1

start adbd

第四步:開機后如何保持adb自動開啟

SystemServer 啟動時,會調用?startOtherServices 啟動 AdbService

private static final String ADB_SERVICE_CLASS ="com.android.server.adb.AdbService$Lifecycle";

// Start ADB Debugging Service

t.traceBegin("StartAdbService");

try {

mSystemServiceManager.startService(ADB_SERVICE_CLASS);

} catch (Throwable e) {

Slog.e(TAG, "Failure starting AdbService");

}

t.traceEnd();

AdbService 啟動代碼如下:

public static class Lifecycle extends SystemService {

private AdbService mAdbService;

public Lifecycle(Context context) {

super(context);

}

@Override

public void onStart() {

mAdbService = new AdbService(getContext());

publishBinderService(Context.ADB_SERVICE, mAdbService);

}

@Override

public void onBootPhase(int phase) {

if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {

mAdbService.systemReady();

} else if (phase == SystemService.PHASE_BOOT_COMPLETED) {

FgThread.getHandler().sendMessage(obtainMessage(

AdbService::bootCompleted, mAdbService));

}

}

}

創(chuàng)建?AdbService 服務對象并綁定到系統(tǒng)服務中,并在?onBootPhase 回調中處理?systemReady 和?bootCompleted 事件。

/**

* Called in response to {@code SystemService.PHASE_ACTIVITY_MANAGER_READY} from {@code

* SystemServer}.

*/

public void systemReady() {

if (DEBUG) Slog.d(TAG, "systemReady");

/*

* Use the normal bootmode persistent prop to maintain state of adb across

* all boot modes.

*/

mIsAdbUsbEnabled = containsFunction(

SystemProperties.get(USB_PERSISTENT_CONFIG_PROPERTY, ""),UsbManager.USB_FUNCTION_ADB);

boolean shouldEnableAdbUsb = mIsAdbUsbEnabled || SystemProperties.getBoolean(TestHarnessModeService.TEST_HARNESS_MODE_PROPERTY, false);

mIsAdbWifiEnabled = "1".equals(SystemProperties.get(WIFI_PERSISTENT_CONFIG_PROPERTY, "0"));

// make sure the ADB_ENABLED setting value matches the current state

try {

Settings.Global.putInt(mContentResolver,

Settings.Global.ADB_ENABLED, shouldEnableAdbUsb ? 1 : 0);

Settings.Global.putInt(mContentResolver,

Settings.Global.ADB_WIFI_ENABLED, mIsAdbWifiEnabled ? 1 : 0);

} catch (SecurityException e) {

// If UserManager.DISALLOW_DEBUGGING_FEATURES is on, that this setting can't be changed.

Slog.d(TAG, "ADB_ENABLED is restricted.");

}

}

/**

* Called in response to {@code SystemService.PHASE_BOOT_COMPLETED} from {@code SystemServer}.

*/

public void bootCompleted() {

if (DEBUG) Slog.d(TAG, "boot completed");

if (mDebuggingManager != null) {

mDebuggingManager.setAdbEnabled(mIsAdbUsbEnabled, AdbTransportType.USB);

mDebuggingManager.setAdbEnabled(mIsAdbWifiEnabled, AdbTransportType.WIFI);

}

}

讀取?persist.sys.usb.config 屬性值,判斷是否包含 adb, 如果包含, 初始化?mIsAdbUsbEnabled = true 。 接著設置adb_enable的值,觸發(fā) AdbService 的?AdbSettingsObserver 監(jiān)聽。后續(xù)的設置流程與上述分析一致。

柚子快報邀請碼778899分享:USB開啟ADB設置流程

http://yzkb.51969.com/

參考鏈接

評論可見,查看隱藏內容
大家都在看:

本文內容根據(jù)網(wǎng)絡資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉載請注明,如有侵權,聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/19560276.html

發(fā)布評論

您暫未設置收款碼

請在主題配置——文章設置里上傳

掃描二維碼手機訪問

文章目錄