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 <tomas.p...@gmail.com> > 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 <tomas.p...@gmail.com> >>> 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 <tomas.p...@gmail.com> >>>>> 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 < >>>>>>> tomas.p...@gmail.com> 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 < >>>>>>>>> tomas.p...@gmail.com> 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 < >>>>>>>>>>>>> tomas.p...@gmail.com> 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 < >>>>>>>>>>>>>>> tomas.p...@gmail.com> 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 < >>>>>>>>>>>>>>>>> tomas.p...@gmail.com> 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 adt...@googlegroups.com. >>>>>>>>>>>>>>>>>> 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 adt...@googlegroups.com. >>>>>>>>>>>>>>>> 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 adt...@googlegroups.com. >>>>>>>>>>>>>> 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 adt-dev+u...@googlegroups.com. >>>>>>>>>> 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 adt-dev+u...@googlegroups.com. >>>>>>>> >>>>>>> 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 adt-dev+u...@googlegroups.com. >>>>>> >>>>> 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 adt-dev+u...@googlegroups.com. >>>> >>> 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 adt-dev+u...@googlegroups.com. >> > 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 adt-dev+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/adt-dev/3f28e3c0-1f54-4fec-8ee6-0a761b9dec3cn%40googlegroups.com.