*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+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to