indeed.
On Thu, Dec 19, 2013 at 6:30 AM, William Ferguson < william.fergu...@xandar.com.au> wrote: > Thanks Xavier, very helpful. > > If/when you decide to allow aapt to disable overlays it's going to have to > default to allow overlay otherwise lots of builds will immediately break. > > William > > > On Thursday, December 19, 2013 9:31:30 AM UTC+10, Xavier Ducrohet wrote: > >> The order of library dependencies is important. Also we recommend devs to >> use a prefix in their resources when using libraries (look at app compat, >> it uses the abc_ prefix). >> >> aapt's help output says the left most -S option is higher priority IIRC. >> (we don't use multiple -S anymore, we merge manually first so that it can >> be incremental) >> >> I've been thinking about allowing ( through the gradle file) to disable >> overlays and break on conflicts and then let developers control how the >> conflicts get resolved but it's a lot of work and low priority. >> >> >> On Wed, Dec 18, 2013 at 2:54 PM, William Ferguson < >> william....@xandar.com.au> wrote: >> >>> *bump* >>> >>> >>> On Tuesday, December 17, 2013 8:56:03 PM UTC+10, William Ferguson wrote: >>>> >>>> Great, thanks Tor, Xavier. >>>> >>>> All of that makes sense to me except for the bit about overlaying >>>> resources. >>>> >>>> If we are talking about an apk that has a dependency on a single aar >>>> then you could I guess decide that the apk resources overlay those of the >>>> aar. >>>> >>>> But what about when you have 2 aars that have similarly names >>>> resources. The aars are likely to have been developed independently with >>>> the name clash entirely unintended/unexpected. >>>> >>>> BTW when resources are provided to aapt using the "-S" flag how does it >>>> determine which resource is top most? First, last, arbitrary? >>>> >>>> William >>>> >>>> On Tuesday, December 17, 2013 5:03:14 AM UTC+10, Xavier Ducrohet wrote: >>>>> >>>>> App override library resources, always. As Tor said, we don't care >>>>> about strings.xml, we do the merge on resources, not on files. >>>>> >>>>> Libraries are compiled with non-final resource IDs, and classes.jar >>>>> does not include the R class. >>>>> R.txt is meant to clearly define what resources are in the library. >>>>> >>>>> App generate the final list of resources, merging resources from the >>>>> app and the libraries. We use aapt to generate the IDs for the combined >>>>> resources, using the app's package name and using final integers. Once >>>>> this >>>>> is done we go through all the libraries and use their R.txt file to >>>>> manually generate a R class in their own package name. These are final >>>>> integers as well. >>>>> (there's also some code to deal with the case where libraries have the >>>>> same package name, but we might move away from allowing this). >>>>> >>>>> >>>>> On Mon, Dec 16, 2013 at 10:55 AM, Tor Norbye <tno...@google.com>wrote: >>>>> >>>>>> On Mon, Dec 16, 2013 at 6:27 AM, William Ferguson < >>>>>> william....@xandar.com.au> wrote: >>>>>> >>>>>>> Can someone please explain to me how Resource id generation is going >>>>>>> to work now with AARs. >>>>>>> >>>>>>> Incorporating APKLIBs was slow but fairly straight forward. I have >>>>>>> just spent the last 48 hours trying to get the android-maven-plugin to >>>>>>> build an APK that depends on an AAR that has code referencing it own >>>>>>> resources. As part of that I have spent a large chunk of time trawling >>>>>>> through the android platform tools source and it's not clear to me that >>>>>>> all >>>>>>> use cases have been covered. >>>>>>> >>>>>>> So I hoping that someone can clarify a raft of questions that >>>>>>> surfaced as part of my investigations for which I couldn't find any >>>>>>> doco. >>>>>>> >>>>>>> An AAR contains the following (plus some optionals) >>>>>>> >>>>>>> - /AndroidManifest.xml (mandatory) >>>>>>> - /classes.jar (mandatory) >>>>>>> - /res/ (mandatory) >>>>>>> - /R.txt (mandatory) >>>>>>> >>>>>>> >>>>>>> In my APK that consumes this AAR I will presumably also have >>>>>>> resources. >>>>>>> >>>>>>> Q1: What should happen when there is a name clash between the AAR >>>>>>> and APK for those resources? Eg >>>>>>> - AAR/res/layout/layout_main.xml vs >>>>>>> APK/res/layout/layout_main.xml >>>>>>> >>>>>> - AAR/res/values/strings.xml vs APK/res/values/strings.xml >>>>>>> - AAR/res/values/strings_a.xml (string1) vs >>>>>>> APK/res/values/string_b.xml (string1) >>>>>>> Should the build break in any/all 3 cases? >>>>>>> >>>>>> >>>>>> Case 2: they are unrelated. Value files can be named anything. This >>>>>> should not be treated as a clash. >>>>>> Cases 1 and 3 are the same; for non-value resources, the resource >>>>>> name is derived from the file, so they both define @layout/layout_main. >>>>>> Again for case 3 the value of the file name doesn't matter, but >>>>>> they're defining the same string. >>>>>> >>>>>> I believe the right thing to do here is to treat this as an overlay: >>>>>> the app redefines the resource. At least that's how we treat the case >>>>>> where >>>>>> multiple flavors provide definitions for the same resource. Seems >>>>>> reasonable that a library would be treated similarly, though Xav should >>>>>> confirm. >>>>>> >>>>>> Q2: Does/Should AAR classes.jar contain a compiled R class. >>>>>>> >>>>>> >>>>>> No. The id's in the R class *must* be changed when the final app is >>>>>> assembled, so it's done at that time (it computes a global set of unique >>>>>> id's, then creates R classes for each namespace required by the various >>>>>> compiled classes, assigning those id's). >>>>>> >>>>>> Q3: Should that R class have non-final fields. As suggested by >>>>>>> http://tools.android.com/tips/non-constant-fields? >>>>>>> If it has non-final fields then how are those fields updated to >>>>>>> reflect the the values generated during the APK build. >>>>>>> If they are not updated then how are id clashes from more than >>>>>>> one dependent AARs prevented? >>>>>>> >>>>>> >>>>>> Id's in library cannot be final since if they were, they would get >>>>>> copied into the various classes.jar classes in the library, and could >>>>>> then >>>>>> clash with other libraries. By being non final, they will defer to >>>>>> runtime >>>>>> to look up the actual value, where they can find the id's actually >>>>>> assigned >>>>>> in the final app assemble. >>>>>> >>>>>> Q4: If the AAR R class either doesn't exist or has final fields then >>>>>>> the final values will have been burnt into the compiled classes that use >>>>>>> them. >>>>>>> During he APK build when the resource ids are generated for all >>>>>>> the resource contained in the APK (including the AAR resources), how are >>>>>>> the references in compiled classes updated? >>>>>>> >>>>>> >>>>>> Again, it creates multiple R classes, one for each library package, >>>>>> but ensures that the R id's are identical across these classes. >>>>>> >>>>>> -- Tor >>>>>> >>>>>> -- >>>>>> 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. >>>>>> For more options, visit https://groups.google.com/groups/opt_out. >>>>>> >>>>> >>>>> >>>>> >>>>> -- >>>>> 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 adt-dev+u...@googlegroups.com. >>> For more options, visit https://groups.google.com/groups/opt_out. >>> >> >> >> >> -- >> 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 adt-dev+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/groups/opt_out. > -- 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 adt-dev+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/groups/opt_out.