you need to continue doing that, I just filed a bug : https://b.corp.google.com/issues/159993210
On Thu, Jun 25, 2020 at 11:20 PM Tomáš Procházka <tomas.procha...@gmail.com> wrote: > 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 > <https://groups.google.com/d/msgid/adt-dev/3f28e3c0-1f54-4fec-8ee6-0a761b9dec3cn%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/CAHSVgSBznPiveEf1HimGdi5UDMeLLYSXb5AjSuqqtkqQO5U8PA%40mail.gmail.com.