ADB_Over_network을 reboot시 초기화 하지 않는 방법


전체적인 System Properties와 preference와의 일관성 유지 및 사용자와의 상호작용 그리고 초기화 매커니즘은 아래의 그림과 같다.



Android Preference 구조 그림.pptx





□ setprop persist.adb.tcp.port 5555

  • 위 명령을 adb를 이용해서 치면, 재부팅 시에도 port가 5555로 설정 되어 짐.
  • 플랫폼을 수정할 필요 없는 가장 간단한 방법
  • adbd 자체에서, 이 기능을 지원함.
  • 원상태 복구를 위해서는, setprop을 다시 직접 쳐야한다는 단점, 발생 왜냐하면, Adb deamon은 persist option에는 반응하지 않음.


□ adbd을 수정


소스코드 위치: system/core/adb/adb.c

// adb_over_network ON
property_get("service.adb.tcp.port",value,"5555");
property_get("persist.adb.tcp.port",value,"");

// adb_over_network OFF
property_get("service.adb.tcp.port",value,"");
property_get("persist.adb.tcp.port",value,"");

핵심은 뒤의 것은 default라는 것이다. 값이 존재하지 않으면, ""를 기록 하게 됨.
""로 설정하면, SystemServer에서 Empty로 인식해서, Default 값을 기록 하게 됨 (Settings App에서의 일관성 유지).
단점: 원상 복구를 위해서는 직접 property를 변경 해야함.

□ Settings App과 System Server 수정


Settings App: 사용자와의 상호작용을 담당. 설정값에 대한 입력 과 출력

System Server: System Properties로부터 값을 읽어와서 System Preference값을 그에 맞추어 변경함. 즉, 서로다른 두 레벨간의 일관성을 유지시켜 줌.

추가로, ContentObserver를 등록 시켜서, System Preference가 변경되어 지면, 그것을 System Properties에 적용 시킴.


framework/base -> service/SystemServer.java


//해당 코드는 Content가 변경 되어지면, 호출 되어 짐. (e.g: 사용자가 설정을 변경 했을 때)

 91     private class AdbPortObserver extends ContentObserver {

 92         public AdbPortObserver() {

 93             super(null);

 94         }

 95         @Override

 96         public void onChange(boolean selfChange) {

 97             int adbPort = Settings.Secure.getInt(mContentResolver,

 98                 Settings.Secure.ADB_PORT, 0);

 99             // setting this will control whether ADB runs on TCP/IP or USB

100             SystemProperties.set("service.adb.tcp.port", Integer.toString(adbPort));

// 결국, 위 코드가 Setting.Secure(java)의 내용을 SystemProperties (native) 영역으로 // 전송하는 역할을 함.

101             Log.e("SystemServer:jaynux","adbPort: "+ adbPort);

102         }

103     }



→ 새로운 옵션 추가
Settings app에 ADBTCPIP_ENABLED 옵션 추가.
위 추가한 옵션을 이용해서, TCP Port를 초기화 할지, 아니면 다른 값으로 설정할지가 결정 됨.

→ System Properties는 변경 되지 않음
system properties로부터 get 한다. 핵심은 get만 한다는 것이다. 
결국, system properties는 변경 되어 지지 않는다. 따라서, get한 내용을, 그저 putInt를 통해서 System preference에 반영하는 작업만을 한다.

→ Default 동작의 의미
service.adb.tcp.port에 대해서 값을 얻어오고, 없을 경우 -1을 default로 하게 됨.
get은 native code 이다. default가 되어지는 경우는, null이거나, empty의 경우.
adbd은 해당 값을 ""로 설정하기 때문에, 항상 default 값이 System Preference에 반영됨.
그래서, Settings app으로 확인해 보면, CheckBox가 정상적으로 잘 표현되어 짐을 알 수 있다.
하지만, 아무리 Check 되어져 있다고 해도, 설령 이 값을 변경 한다고해도, Observer는 그 후에, 
등록 되어 지므로, system properties는 변경 안됨


→ Properties와 Preference의 일관성 유지를 위해서 사용한 방법
SystemProperties.set()을 이용해서 직접 Properties를 설정해주면 된다.
persist를 쓰면 편하지만, 현재 adbd는 persist 값을 부팅시에만 반영하므로, 동작중에 변경을 하더라도, adbd은 계속해서 TCP/IP 모드로 동작하므로, 불편함이 존재 한다. 
결론적으로, adbd의 변경 없이, 자유롭게 사용하기 위해서, service.adb.tcp.port를 사용하며, set()으로 직접 설정 한다.



System property를 Setting 하는 방법은 3가지가 있습니다.


1. Native

int property_get(const char *key, char *value, const char *default_value);

int property_set(const char *key, const char *value);

2. Java

String SystemProperties.get(String key);

SystemProperties.set(String key,String value);

3. adb 명령

adb shell 

root# setprop key value

root# getprop key


+ Recent posts