I'm giving it up for now. I found a way how to fix my old setup, so it now works on 4.0, 4.1 and even on 4.2. I don't need to put it on a different folder, it simply uses a standard location like build\outputs\apk\full\release\ and there it creates unsigned and signed APK like this:
gradle-plugin-build-sample-1.9.0-alpha2-SNAPSHOT-374-768e633-m-app,full,release,unsigned.apk gradle-plugin-build-sample-1.9.0-alpha2-SNAPSHOT-374-768e633-m-app,full,release.apk And it works for AAB and test apk. Dne pátek 26. června 2020 v 18:00:41 UTC+2 uživatel Jerome Dochez napsal: > 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.p...@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+u...@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/36fac0b6-4050-4911-8296-b2fd6ad46f31n%40googlegroups.com.