terminate() doesn't kill adb, it just stops a few long running ddmlib threads. We should absolutely call it, if we're not doing it it's a a bug.
The trick is to kill it at the right time. I'll look into it. On Thu, Apr 23, 2015 at 8:36 AM, 'Siva Velusamy' via adt-dev < [email protected]> wrote: > I'm not sure what the gradle plugin does, maybe xav@ can chime in. > > But as far as gradle invoked from Studio goes, we don't invoke anything > that uses the device directly from the IDE...Unless ofcourse you explicitly > invoke a gradle task such as the one for running tests. > > On Wed, Apr 22, 2015 at 11:22 PM, Roman Mazur <[email protected]> > wrote: > >> So is it true that Android Gradle plugin does not call terminate? Because >> otherwise it would kill adb server started by Android Studio? >> >> On Thu, 23 Apr 2015 at 01:51 'Siva Velusamy' via adt-dev < >> [email protected]> wrote: >> >>> The usage as followed by Studio is: >>> >>> To create: >>> >>> 1. AndroidDebugBridge.init(clientSupport); >>> 2. bridge = AndroidDebugBridge.createBridge(myAdb.getPath(), false); >>> >>> Finally, when the IDE is closing: >>> >>> 1. AndroidDebugBridge.disconnectBridge(); >>> 2. AndroidDebugBridge.terminate(); >>> >>> >>> You can see this in action at >>> https://android.googlesource.com/platform/tools/adt/idea/+/studio-1.3-dev/android/src/com/android/tools/idea/ddms/adb/AdbService.java >>> >>> The issue here is that terminate() will result in the adb server being >>> killed. This is not always appropriate, see >>> https://code.google.com/p/android/issues/detail?id=73772: some users >>> run Studio from the command line, and expect adb server to be running after >>> Studio quits. The proposed solution right now would be to kill the server >>> only if it was actually started by Studio. But we don't have an API for >>> that yet in ddmlib. >>> >>> Coming to your use case, I don't know the exact interactions between the >>> gradle plugin and the spoon plugin, but if your plugin terminates adb >>> server that it launched, then that would be ok, but if it happens to >>> terminate adb launched by gradle, then it seems like you are violating the >>> assumption of the gradle plugin. >>> >>> So for now, you could call terminate() if you know somehow that the >>> entire gradle invocation is terminating, or not call it and live with the >>> issue that the adb server will keep running.. >>> >>> >>> On Wed, Apr 22, 2015 at 3:15 PM, Roman Mazur <[email protected]> >>> wrote: >>> >>>> AndroidDebugBridge is a part of ddms Java library. It provides Java >>>> interface to what we can do with adb command line. >>>> >>>> To get an ADB client using this library, one can use a sequence of init >>>> and createBridge methods. >>>> AndroidDebugBridge also has terminate method. And its documentation >>>> says that this method must be called when you are done with the client. >>>> >>>> AndroidDebugBridge is apparently used by Android Gradle plugin. For >>>> example, in tasks that install APK on a device. >>>> Here is an example: >>>> >>>> https://android.googlesource.com/platform/tools/base/+/gradle_1.1.3/build-system/builder/src/main/java/com/android/builder/testing/ConnectedDeviceProvider.java#60 >>>> Although we can see how init and createBridge are used, I cannot find >>>> any calls to terminate() in Android Gradle plugin. Usage search in >>>> IDEA shows only 2 usages in AndroidDebugBridgeTest. >>>> >>>> This was the reason I contributed some changes to the Spoon tool. This >>>> tool runs instrumentation test on devices accessible via USB and generates >>>> pretty test reports that include screenshots. To do this, the tool uses >>>> AndroidDebugBridge to install APKs and pull screenshot files from a >>>> device. >>>> >>>> In older versions ADB was initialized with init(false) method (that >>>> cannot be called twice beforeterminate is invoked) and createBridge >>>> invocation >>>> that was forcing a new bridge. >>>> >>>> https://github.com/square/spoon/blob/parent-1.1.5/spoon-runner/src/main/java/com/squareup/spoon/SpoonUtils.java#L100-L104 >>>> When all the tests have been run and screenshots pulled from the >>>> device, Spoon would call terminate()method: >>>> >>>> https://github.com/square/spoon/blob/parent-1.1.5/spoon-runner/src/main/java/com/squareup/spoon/SpoonDeviceRunner.java#L359 >>>> >>>> Such an implementation was causing troubles when spoon was run from the >>>> Gradle plugin for multiple flavors: >>>> stanfy/spoon-gradle-plugin#4 (comment) >>>> <https://github.com/stanfy/spoon-gradle-plugin/issues/4#issuecomment-35062456> >>>> >>>> As a result I changed how AndroidDebugBridge is used in Spoon. Now >>>> initialization matches the code inConnectedDevice >>>> >>>> https://github.com/square/spoon/blob/parent-1.1.9/spoon-runner/src/main/java/com/squareup/spoon/SpoonUtils.java#L101-L105 >>>> and terminate() is not used. >>>> >>>> Now it works well with Gradle plugin and I can easily get Spoon reports >>>> for multiple application/library bariants. >>>> However, this seems to have sparked new problems to some guys that use >>>> standalone Spoon tool. >>>> square/spoon#251 <https://github.com/square/spoon/issues/251> >>>> Standalone tool hangs after reports are generated. >>>> >>>> Hence, I'm going to push another change :). And my guess is that >>>> correct usage would be gettingterminate() invocation back to the code >>>> but stick to not forcing a new bridge in createBridge. >>>> >>>> Could somebody clarify what is the correct usage scenario for >>>> AndroidDebugBridge taking into account that we want to call >>>> createBridge multiple times (to get Spoon reports for different build >>>> variants)?. >>>> Thanks! >>>> >>> -- >>>> You received this message because you are subscribed to the Google >>>> Groups "adt-dev" group. >>>> To unsubscribe from this group and stop receiving emails from it, send >>>> an email to [email protected]. >>> >>> >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> -- >>> You received this message because you are subscribed to a topic in the >>> Google Groups "adt-dev" group. >>> To unsubscribe from this topic, visit >>> https://groups.google.com/d/topic/adt-dev/1BgTs8Bs6_Q/unsubscribe. >>> To unsubscribe from this group and all its topics, send an email to >>> [email protected]. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- >> You received this message because you are subscribed to the Google Groups >> "adt-dev" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > > -- > You received this message because you are subscribed to the Google Groups > "adt-dev" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- Xavier Ducrohet Android SDK Tech Lead Google Inc. http://developer.android.com | http://tools.android.com Please do not send me questions directly. Thanks! -- You received this message because you are subscribed to the Google Groups "adt-dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
