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.

Reply via email to