And is there a way how to force also 'assemble' task to create signed APK
already?
Currently, I'm doing this
variant.assembleProvider.configure {
it.dependsOn(signTask)
}
Dne čtvrtek 25. června 2020 v 22:33:28 UTC+2 uživatel Jerome Dochez napsal:
> all tasks that consume APK will automatically be wired to your output
> because your task became the final provider for the public APK type, so
> install will use *your* signed APK without you having to do anything.
>
> you must use a different output folder, if this does not work with some of
> our tasks then it's a bug and we will look into it urgently.
>
>
> On Thu, Jun 25, 2020 at 12:49 PM Tomáš Procházka <[email protected]>
> wrote:
>
>> I think that *onVariantProperties* is called only when the variant is
>> actually created.
>> In my previous implementation, I'm using
>> *project.android.applicationVariants.each*
>> which works even after evaluation.
>>
>> And I need to replace the APK, I cannot put it to a different folder,
>> because I'm not at the end of the chain. There is mostly plugin to publish
>> APK to play store or to the internal maven artifactory. Or just install
>> task which uploads it to device, or connectedDeviceTest which all needs to
>> use properly signed APK in the same way how internal sign mechanism works.
>> Also directly from Android studio must be still possible to run/debug
>> release build directly. So everything must be really transparent.
>>
>> But currently, I stuck that my Task is never called. I trying to find out
>> why examples work and mine not.
>>
>> Dne čtvrtek 25. června 2020 v 17:29:29 UTC+2 uživatel Jerome Dochez
>> napsal:
>>
>>> yes it will not necessarily work if you call from the afterEvaluate
>>> because that's where we hook up the AGP in Gradle and the order matters
>>> (you are coming after us)
>>>
>>> you need to find a way to move your code out.
>>> btw, do NOT use the same folder for input and output, one is to read the
>>> unsigned APK, the other is to write out the signed, you should not use the
>>> same folder.
>>>
>>> On Thu, Jun 25, 2020 at 7:04 AM Tomáš Procházka <[email protected]>
>>> wrote:
>>>
>>>> But it looks that not understanding this API is smaller problem.
>>>> I found that *android.onVariantProperties* is never called when I call
>>>> it inside of *project.afterEvaluate*
>>>> I'm doing it because I have own configuration extension inside of my
>>>> plugin.
>>>> So setup looks like
>>>>
>>>> apply .....
>>>>
>>>> myConfigExtension {
>>>> mysetup
>>>> }
>>>>
>>>> And in the time od signing configuration I need to know about values in
>>>> myConfigExtension
>>>>
>>>> Without it it at least run the first println, but it never call
>>>> RemoteSignTask
>>>>
>>>> android.onVariantProperties { ApplicationVariantProperties
>>>> v ->
>>>>
>>>> println 'xxxxx' + "remoteSign" + v.name.capitalize() +
>>>> "Apk"
>>>>
>>>> TaskProvider singingTaskProvider =
>>>> project.tasks.register(
>>>> "remoteSign" + v.name.capitalize() + "Apk",
>>>> RemoteSignTask)
>>>>
>>>> //def transformationRequest =
>>>> v.artifacts.use(singingTaskProvider)
>>>> .wiredWithDirectories(
>>>> { it.apkFolder }, { it.apkFolder }
>>>> )
>>>> .toTransformMany(ArtifactType.APK.INSTANCE)
>>>>
>>>>
>>>>
>>>> }
>>>>
>>>>
>>>> Dne čtvrtek 25. června 2020 v 2:23:37 UTC+2 uživatel Jerome Dochez
>>>> napsal:
>>>>
>>>>> we do not have such a thing as an unsigned APK (even internally
>>>>> because we package and sign simultaneously).
>>>>> what you need to do is disable signing alltogether for your app by
>>>>> turning off v1 and v2 signing through the DSL, then your APK would be
>>>>> unsigned...
>>>>>
>>>>> On Wed, Jun 24, 2020 at 1:35 PM Tomáš Procházka <[email protected]>
>>>>> wrote:
>>>>>
>>>>>> I'm sorry, but this API doesn't make sense at all for me.
>>>>>> This WorkerEnabledTransformation example just takes the final APK and
>>>>>> copy it somewhere else.
>>>>>> But I need to replace the default sign mechanism provided by the
>>>>>> Android plugin and nobody else (a different plugin) should know about.
>>>>>> So technically I need to tell that my task needs unsigned APK on
>>>>>> input and final APK on output.
>>>>>> If I understand correctly this talk
>>>>>> https://youtu.be/OTANozHzgPc?t=1023
>>>>>> With new API I should not care about the actual task which is
>>>>>> responsible o signing. I should care just about input and output
>>>>>> artifacts.
>>>>>> So I should tell that I have a task that can handle unsigned APK on
>>>>>> the input and can sign it. And I want to replace any other task, which
>>>>>> would like do the same.
>>>>>> The replace mechanism described in the talk at
>>>>>> https://youtu.be/OTANozHzgPc?t=1023 gives much more sense for me.
>>>>>> I would expect something like this:
>>>>>>
>>>>>> artifact.use(signTaskProducer).toCreate(ArtifactType.APK.INSTANCE).from(ArtifactType.UNSIGNED_APK.INSTANCE)
>>>>>>
>>>>>>
>>>>>> Dne středa 24. června 2020 v 21:54:32 UTC+2 uživatel Jerome Dochez
>>>>>> napsal:
>>>>>>
>>>>>>> toCreate API is used to create an artifact from its input, so here
>>>>>>> that would mean creating the APK file from dex, merged manifests,
>>>>>>> resources, etc...
>>>>>>>
>>>>>>> what you want is transform :
>>>>>>>
>>>>>>> val transformationRequest = artifacts.use(singingTaskProvider)
>>>>>>> .wiredWithDirectories(
>>>>>>> SigningTask::inputApkFolder,
>>>>>>> SingingTas::outputAPKFolder)
>>>>>>> .toTransformMany(ArtifactType.APK)
>>>>>>>
>>>>>>>
>>>>>>> look at WorkerEnabledTransformation, it should be very similar
>>>>>>> except you copy and sign the files instead of just copying
>>>>>>>
>>>>>>> you can do AAB but I need to add test APK which right now are not
>>>>>>> available through the public artifact types.
>>>>>>>
>>>>>>> On Wed, Jun 24, 2020 at 8:32 AM Tomáš Procházka <
>>>>>>> [email protected]> wrote:
>>>>>>>
>>>>>>>> I'm still not sure how to use it exactly, can you help a little
>>>>>>>> bit. Currently, I have this code:
>>>>>>>>
>>>>>>>> android.onVariantProperties {
>>>>>>>> ApplicationVariantProperties v ->
>>>>>>>> TaskProvider signTaskProducer = tasks.register(
>>>>>>>> "remoteSign" + variant.name.capitalize() +
>>>>>>>> "Apk",
>>>>>>>> RemoteSignTask)
>>>>>>>>
>>>>>>>> v.artifacts.use(signTaskProducer)
>>>>>>>> .wiredWith( ? )
>>>>>>>> .toCreate(ArtifactType.APK.INSTANCE)
>>>>>>>> }
>>>>>>>>
>>>>>>>> But I'm not sure what is responsible for produce unsigned task.
>>>>>>>> And I need to sign APK, AAB and also test APK
>>>>>>>> And inside of RemoteSignTask task I need to get location of all
>>>>>>>> files which should be fixed.
>>>>>>>>
>>>>>>>> My original code working until 4.0.0 was looking like this:
>>>>>>>>
>>>>>>>> project.android.applicationVariants.each {
>>>>>>>> ApplicationVariant variant ->
>>>>>>>> if (!isReleaseBuildType(variant)) {
>>>>>>>> project.logger.info("Skipping signing, '$
>>>>>>>> variant.name' is not release.")
>>>>>>>> return
>>>>>>>> }
>>>>>>>>
>>>>>>>> variant.outputs.all { ApkVariantOutput output ->
>>>>>>>> // hack to keep proper final name also when
>>>>>>>> assemble task will be skipped
>>>>>>>> output.outputFileName =
>>>>>>>> RemoteSignTask.renameToSignedName(output.outputFileName)
>>>>>>>> }
>>>>>>>> variant.setOutputsAreSigned(true)
>>>>>>>>
>>>>>>>> // Regular APK signing
>>>>>>>> def apk =
>>>>>>>> variant.getFinalArtifact(InternalArtifactType.APK.INSTANCE)
>>>>>>>> InternalArtifactType.APK.INSTANCE
>>>>>>>> def signTask = project.tasks.register(
>>>>>>>> "remoteSign" + variant.name.capitalize() +
>>>>>>>> "Apk", RemoteSignTask,
>>>>>>>> new RemoteSignTask.ConfigAction(variant,
>>>>>>>> apk))
>>>>>>>>
>>>>>>>> // FIXME: IT should be completely outside this
>>>>>>>> task, but it is not possible now
>>>>>>>> def folderManifestTaskForApk =
>>>>>>>> project.tasks.register(
>>>>>>>> "folderManifest" +
>>>>>>>> variant.name.capitalize() + "Apk", FolderManifestTask,
>>>>>>>> new
>>>>>>>> FolderManifestTask.ConfigAction(variant, apk))
>>>>>>>>
>>>>>>>> variant.assembleProvider.configure {
>>>>>>>> it.dependsOn(signTask)
>>>>>>>> it.dependsOn(folderManifestTaskForApk)
>>>>>>>> }
>>>>>>>> signTask.configure {
>>>>>>>> folderManifestTaskForApk.get().dependsOn(it)
>>>>>>>> }
>>>>>>>>
>>>>>>>> // App bundle signing
>>>>>>>> def bundle =
>>>>>>>> variant.getFinalArtifact(InternalArtifactType.BUNDLE.INSTANCE)
>>>>>>>> def bundleSignTask = project.tasks.register(
>>>>>>>> "remoteSign" + variant.name.capitalize() +
>>>>>>>> "Bundle", RemoteSignTask,
>>>>>>>> new RemoteSignTask.ConfigAction(variant,
>>>>>>>> bundle))
>>>>>>>>
>>>>>>>> // FIXME: IT should be completely outside this tak,
>>>>>>>> but it is not possible now
>>>>>>>> def folderManifestTaskForAAB =
>>>>>>>> project.tasks.register(
>>>>>>>> "folderManifest" +
>>>>>>>> variant.name.capitalize() + "Bundle", FolderManifestTask,
>>>>>>>> new
>>>>>>>> FolderManifestTask.ConfigAction(variant, bundle))
>>>>>>>>
>>>>>>>>
>>>>>>>> variant.getVariantData().getTaskContainer().bundleTask.configure {
>>>>>>>> it.dependsOn(bundleSignTask)
>>>>>>>> it.dependsOn(folderManifestTaskForAAB)
>>>>>>>> }
>>>>>>>> bundleSignTask.configure {
>>>>>>>> folderManifestTaskForAAB.get().dependsOn(it)
>>>>>>>> }
>>>>>>>>
>>>>>>>> if (variant.testVariant != null ) {
>>>>>>>> // Test APK signing
>>>>>>>> def testApk =
>>>>>>>> variant.testVariant.getFinalArtifact(InternalArtifactType.APK.INSTANCE)
>>>>>>>> def testSignTask = project.tasks.register(
>>>>>>>> "remoteSign" +
>>>>>>>> variant.name.capitalize() + "AndroidTest", RemoteSignTask,
>>>>>>>> new
>>>>>>>> RemoteSignTask.ConfigAction(variant.testVariant, testApk))
>>>>>>>>
>>>>>>>> variant.testVariant.assembleProvider.configure {
>>>>>>>> dependsOn(testSignTask)
>>>>>>>> }
>>>>>>>>
>>>>>>>>
>>>>>>>> variant.testVariant.connectedInstrumentTestProvider.configure {
>>>>>>>> dependsOn(testSignTask)
>>>>>>>> }
>>>>>>>> }
>>>>>>>>
>>>>>>>> }
>>>>>>>>
>>>>>>>> Dne středa 24. června 2020 v 7:00:11 UTC+2 uživatel Jerome Dochez
>>>>>>>> napsal:
>>>>>>>>
>>>>>>>>> yes, just replace the artifact type with APK.
>>>>>>>>>
>>>>>>>>> On Tue, Jun 23, 2020 at 3:12 PM Tomáš Procházka <
>>>>>>>>> [email protected]> wrote:
>>>>>>>>>
>>>>>>>>>> But it looks that replace Sign mechanism should be done in the
>>>>>>>>>> same way as replace manifest merger which is shown here
>>>>>>>>>>
>>>>>>>>>> https://github.com/android/gradle-recipes/blob/master/Groovy/manifestReplacementTest/app/build.gradle
>>>>>>>>>>
>>>>>>>>>> right?
>>>>>>>>>>
>>>>>>>>>> Dne čtvrtek 11. června 2020 v 20:33:23 UTC+2 uživatel Tomáš
>>>>>>>>>> Procházka napsal:
>>>>>>>>>>
>>>>>>>>>>> This is super useful https://github.com/android/gradle-recipes
>>>>>>>>>>> Would be possible to add there how to
>>>>>>>>>>>
>>>>>>>>>>> - rename output apk/aab to a custom name
>>>>>>>>>>> - write custom apk/aab signer
>>>>>>>>>>>
>>>>>>>>>>> Please.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Dne čtvrtek 21. května 2020 8:56:13 UTC+2 Tomáš Procházka
>>>>>>>>>>> napsal(a):
>>>>>>>>>>>
>>>>>>>>>>>> Hi. Thanks. An example would be really great. So in 3.6 is the
>>>>>>>>>>>> only possible way to found last one *task *which produces APK
>>>>>>>>>>>> and do my stuff in the doLast {} closure, right?
>>>>>>>>>>>>
>>>>>>>>>>>>
>>>>>>>>>>>> Dne pátek 6. března 2020 19:02:36 UTC+1 Jerome Dochez napsal(a):
>>>>>>>>>>>>>
>>>>>>>>>>>>> it's not possible to do this in 3.6. We are hoping to deliver
>>>>>>>>>>>>> most of this during the 4.1 and 4.2 releases.
>>>>>>>>>>>>>
>>>>>>>>>>>>> for your second question, you probably will just need to get
>>>>>>>>>>>>> the PublicArtifactType.APK artifacts and have a task that depend
>>>>>>>>>>>>> on them.
>>>>>>>>>>>>> this should actually already work in 4.0 with relatively (!)
>>>>>>>>>>>>> stable APIs, I can slap an example next week if you are interested
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> On Fri, Mar 6, 2020 at 8:50 AM Tomáš Procházka <
>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>
>>>>>>>>>>>>>> Hi.
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> If. Understand it correctly.
>>>>>>>>>>>>>> New variant API is mentioned here
>>>>>>>>>>>>>> https://youtu.be/OTANozHzgPc?t=995
>>>>>>>>>>>>>> It is currently possible with 3.6.0 ?
>>>>>>>>>>>>>> Is there some more advanced article or video about this API
>>>>>>>>>>>>>> or documentation somewhere?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> For example, I'm not sure if I should use *replace *or
>>>>>>>>>>>>>> *transform* to replace the default sign mechanism?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> And I also need one new thing. I would like to count hash of
>>>>>>>>>>>>>> all APK and AAB produced during the build.
>>>>>>>>>>>>>> So I maybe can use *register, *but I don't want to force
>>>>>>>>>>>>>> production of APK or AAB. I want just wait when it happens so
>>>>>>>>>>>>>> when user
>>>>>>>>>>>>>> call bundle or assemble I need to know about every apk or
>>>>>>>>>>>>>> bundle that will
>>>>>>>>>>>>>> be produced.
>>>>>>>>>>>>>> It is possible?
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> Dne pondělí 21. října 2019 18:15:13 UTC+2 Jerome Dochez
>>>>>>>>>>>>>> napsal(a):
>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> yes there will be :
>>>>>>>>>>>>>>> 1. disable all signing in the DSL (v1 and v2)
>>>>>>>>>>>>>>> 2. obtain the built APK with new variant API
>>>>>>>>>>>>>>> 3. sign them.
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> On Sun, Oct 20, 2019 at 12:16 PM Tomáš Procházka <
>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Hi Jerome. Thanks.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Btw. Best would be if there will be a direct way how to
>>>>>>>>>>>>>>>> replace default sign mechanism, just by implementing some
>>>>>>>>>>>>>>>> interface ;-)
>>>>>>>>>>>>>>>> Without modifying tasks and dependencies between them.
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> Dne pátek 18. října 2019 19:43:29 UTC+2 Jerome Dochez
>>>>>>>>>>>>>>>> napsal(a):
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> Hi Tomas
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> we are getting closer to provide a new API that will be
>>>>>>>>>>>>>>>>> stable so you want have to handle such changes.
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> On Tue, Oct 15, 2019 at 7:26 AM Tomáš Procházka <
>>>>>>>>>>>>>>>>> [email protected]> wrote:
>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> I will reply myself. The correct form of getFinalArtifact
>>>>>>>>>>>>>>>>>> parameter
>>>>>>>>>>>>>>>>>> is InternalArtifactType.APK.INSTANCE
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> Dne neděle 13. října 2019 23:56:14 UTC+2 Tomáš Procházka
>>>>>>>>>>>>>>>>>> napsal(a):
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Hi.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Please, I need help again.
>>>>>>>>>>>>>>>>>>> My custom sign mechanism is again broken in plugin 4.6.0.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> InstallableVariantImpl.getFinalArtifact now return a
>>>>>>>>>>>>>>>>>>> different value, insead of BuildableArtifact it is
>>>>>>>>>>>>>>>>>>> there now Provider<FileCollection>.
>>>>>>>>>>>>>>>>>>> It is also necessary to call it in this way from Groovy
>>>>>>>>>>>>>>>>>>> now variant.getFinalArtifact(new
>>>>>>>>>>>>>>>>>>> InternalArtifactType.APK())
>>>>>>>>>>>>>>>>>>> I get Provider instance correctly, but the collection
>>>>>>>>>>>>>>>>>>> is always empty.
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> @TaskAction
>>>>>>>>>>>>>>>>>>> void sign() {
>>>>>>>>>>>>>>>>>>> println '>>>>>>>>>>>>>> A2 sign task: ' +
>>>>>>>>>>>>>>>>>>> inputFiles.get().files.size()
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> This is always 0.
>>>>>>>>>>>>>>>>>>> I'm calling get() in my task, which is registered in
>>>>>>>>>>>>>>>>>>> this way
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> variant.assembleProvider.configure {
>>>>>>>>>>>>>>>>>>> dependsOn(signTask)
>>>>>>>>>>>>>>>>>>> }
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> Dne čtvrtek 17. ledna 2019 12:40:06 UTC+1 Tomáš
>>>>>>>>>>>>>>>>>>> Procházka napsal(a):
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> So, here is my final solution:
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> https://gist.github.com/tprochazka/457c7eebd044c0210dcc8ba49301cda9
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> It's quite complicated. I'm using not public API, but
>>>>>>>>>>>>>>>>>>>> it looks that it works currently.
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>> I created a new feature request to make it possible in
>>>>>>>>>>>>>>>>>>>> some easier way
>>>>>>>>>>>>>>>>>>>> https://issuetracker.google.com/issues/122883577
>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>>>> 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].
>>>>>>>>>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>>>>>>>>>> https://groups.google.com/d/msgid/adt-dev/55e89d8f-5216-4ff5-b2e0-765f80025438%40googlegroups.com
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>> <https://groups.google.com/d/msgid/adt-dev/55e89d8f-5216-4ff5-b2e0-765f80025438%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>>>>>>>>> .
>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>>>> 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].
>>>>>>>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>>>>>>>> https://groups.google.com/d/msgid/adt-dev/cae178f3-d127-4803-9062-8bacbeebd250%40googlegroups.com
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>> <https://groups.google.com/d/msgid/adt-dev/cae178f3-d127-4803-9062-8bacbeebd250%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>>>>>>> .
>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>> --
>>>>>>>>>>>>>> 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].
>>>>>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>>>>>> https://groups.google.com/d/msgid/adt-dev/76a13511-fa1b-4737-9c20-8f5425867438%40googlegroups.com
>>>>>>>>>>>>>>
>>>>>>>>>>>>>> <https://groups.google.com/d/msgid/adt-dev/76a13511-fa1b-4737-9c20-8f5425867438%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>>>>>> .
>>>>>>>>>>>>>>
>>>>>>>>>>>>> --
>>>>>>>>>> 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].
>>>>>>>>>> To view this discussion on the web visit
>>>>>>>>>> https://groups.google.com/d/msgid/adt-dev/0d56caca-91f4-40d7-8069-055051881948n%40googlegroups.com
>>>>>>>>>>
>>>>>>>>>> <https://groups.google.com/d/msgid/adt-dev/0d56caca-91f4-40d7-8069-055051881948n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>>>> .
>>>>>>>>>>
>>>>>>>>> --
>>>>>>>> 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].
>>>>>>>>
>>>>>>> To view this discussion on the web visit
>>>>>>>> https://groups.google.com/d/msgid/adt-dev/2bb989c1-97d1-4d7c-9603-53eaf0ce66dcn%40googlegroups.com
>>>>>>>>
>>>>>>>> <https://groups.google.com/d/msgid/adt-dev/2bb989c1-97d1-4d7c-9603-53eaf0ce66dcn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>>>> .
>>>>>>>>
>>>>>>> --
>>>>>> 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].
>>>>>>
>>>>> To view this discussion on the web visit
>>>>>> https://groups.google.com/d/msgid/adt-dev/1d22642d-3d74-456e-af8b-8e17eda0d055n%40googlegroups.com
>>>>>>
>>>>>> <https://groups.google.com/d/msgid/adt-dev/1d22642d-3d74-456e-af8b-8e17eda0d055n%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>>> .
>>>>>>
>>>>> --
>>>> 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].
>>>>
>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/adt-dev/4113877e-5987-4d9c-bc5e-d008fdc14e6fn%40googlegroups.com
>>>>
>>>> <https://groups.google.com/d/msgid/adt-dev/4113877e-5987-4d9c-bc5e-d008fdc14e6fn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> --
>> 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].
>>
> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/adt-dev/2367a793-57b5-40c9-a4c8-590e9726df75n%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/adt-dev/2367a793-57b5-40c9-a4c8-590e9726df75n%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
--
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].
To view this discussion on the web visit
https://groups.google.com/d/msgid/adt-dev/3f28e3c0-1f54-4fec-8ee6-0a761b9dec3cn%40googlegroups.com.