diff options
author | Ryan Mitchell <rtmitchell@google.com> | 2020-02-10 13:35:24 -0800 |
---|---|---|
committer | Ryan Mitchell <rtmitchell@google.com> | 2020-02-10 14:12:00 -0800 |
commit | 155d539634571bcd97f07884f28c61ef18b863c2 (patch) | |
tree | de788b2215f2201cf59e2363cef31df120b76e10 /libs/androidfw/tests | |
parent | dc7efcc2ce8a57ae0a5d57825e08e8d6ad23583f (diff) |
Sort bag by attribute key when using libs
When shared libraries are assigned package ids in a different order
than compile order, bag resources that use attributes from both
multiple libraries will not be sorted in ascending attribute id order.
This change detects when the attribute ids are not in order and sorts
the bag entries accordingly.
The change is designed to be less invasive. Deduping the GetBag logic
should probably be spun off in a separate bug.
Bug: 147674078
Test: libandroidfw_tests
Change-Id: Id8ce8e9c7ef294fcc312b77468136067d392dbd0
Diffstat (limited to 'libs/androidfw/tests')
-rw-r--r-- | libs/androidfw/tests/AssetManager2_test.cpp | 21 | ||||
-rw-r--r-- | libs/androidfw/tests/data/lib_two/R.h | 12 | ||||
-rw-r--r-- | libs/androidfw/tests/data/lib_two/lib_two.apk | bin | 1426 -> 1586 bytes | |||
-rw-r--r-- | libs/androidfw/tests/data/lib_two/res/values/values.xml | 11 | ||||
-rw-r--r-- | libs/androidfw/tests/data/libclient/R.h | 1 | ||||
-rw-r--r-- | libs/androidfw/tests/data/libclient/libclient.apk | bin | 1982 -> 2168 bytes | |||
-rw-r--r-- | libs/androidfw/tests/data/libclient/res/values/values.xml | 6 |
7 files changed, 44 insertions, 7 deletions
diff --git a/libs/androidfw/tests/AssetManager2_test.cpp b/libs/androidfw/tests/AssetManager2_test.cpp index 2f6f3dfcaf1c..35fea7ab86cb 100644 --- a/libs/androidfw/tests/AssetManager2_test.cpp +++ b/libs/androidfw/tests/AssetManager2_test.cpp @@ -285,6 +285,27 @@ TEST_F(AssetManager2Test, FindsBagResourceFromSharedLibrary) { EXPECT_EQ(0x03, get_package_id(bag->entries[1].key)); } +TEST_F(AssetManager2Test, FindsBagResourceFromMultipleSharedLibraries) { + AssetManager2 assetmanager; + + // libclient is built with lib_one and then lib_two in order. + // Reverse the order to test that proper package ID re-assignment is happening. + assetmanager.SetApkAssets( + {lib_two_assets_.get(), lib_one_assets_.get(), libclient_assets_.get()}); + + const ResolvedBag* bag = assetmanager.GetBag(libclient::R::style::ThemeMultiLib); + ASSERT_NE(nullptr, bag); + ASSERT_EQ(bag->entry_count, 2u); + + // First attribute comes from lib_two. + EXPECT_EQ(2, bag->entries[0].cookie); + EXPECT_EQ(0x02, get_package_id(bag->entries[0].key)); + + // The next two attributes come from lib_one. + EXPECT_EQ(2, bag->entries[1].cookie); + EXPECT_EQ(0x03, get_package_id(bag->entries[1].key)); +} + TEST_F(AssetManager2Test, FindsStyleResourceWithParentFromSharedLibrary) { AssetManager2 assetmanager; diff --git a/libs/androidfw/tests/data/lib_two/R.h b/libs/androidfw/tests/data/lib_two/R.h index 92b9cc10e7a8..fd5a910961cb 100644 --- a/libs/androidfw/tests/data/lib_two/R.h +++ b/libs/androidfw/tests/data/lib_two/R.h @@ -30,16 +30,22 @@ struct R { }; }; + struct integer { + enum : uint32_t { + bar = 0x02020000, // default + }; + }; + struct string { enum : uint32_t { - LibraryString = 0x02020000, // default - foo = 0x02020001, // default + LibraryString = 0x02030000, // default + foo = 0x02030001, // default }; }; struct style { enum : uint32_t { - Theme = 0x02030000, // default + Theme = 0x02040000, // default }; }; }; diff --git a/libs/androidfw/tests/data/lib_two/lib_two.apk b/libs/androidfw/tests/data/lib_two/lib_two.apk Binary files differindex 486c23000276..8193db637eed 100644 --- a/libs/androidfw/tests/data/lib_two/lib_two.apk +++ b/libs/androidfw/tests/data/lib_two/lib_two.apk diff --git a/libs/androidfw/tests/data/lib_two/res/values/values.xml b/libs/androidfw/tests/data/lib_two/res/values/values.xml index 340d14c34c5d..4e1d69aa5a5a 100644 --- a/libs/androidfw/tests/data/lib_two/res/values/values.xml +++ b/libs/androidfw/tests/data/lib_two/res/values/values.xml @@ -18,14 +18,17 @@ <public type="attr" name="attr3" id="0x00010000" /> <attr name="attr3" format="integer" /> - <public type="string" name="LibraryString" id="0x00020000" /> + <public type="integer" name="bar" id="0x00020000" /> + <integer name="bar">1337</integer> + + <public type="string" name="LibraryString" id="0x00030000" /> <string name="LibraryString">Hi from library two</string> - <public type="string" name="foo" id="0x00020001" /> + <public type="string" name="foo" id="0x00030001" /> <string name="foo">Foo from lib_two</string> - <public type="style" name="Theme" id="0x02030000" /> + <public type="style" name="Theme" id="0x00040000" /> <style name="Theme"> - <item name="com.android.lib_two:attr3">800</item> + <item name="com.android.lib_two:attr3">@integer/bar</item> </style> </resources> diff --git a/libs/androidfw/tests/data/libclient/R.h b/libs/androidfw/tests/data/libclient/R.h index 43d1f9bb68e7..e21b3ebae826 100644 --- a/libs/androidfw/tests/data/libclient/R.h +++ b/libs/androidfw/tests/data/libclient/R.h @@ -34,6 +34,7 @@ struct R { struct style { enum : uint32_t { Theme = 0x7f020000, // default + ThemeMultiLib = 0x7f020001, // default }; }; diff --git a/libs/androidfw/tests/data/libclient/libclient.apk b/libs/androidfw/tests/data/libclient/libclient.apk Binary files differindex 17990248e862..4b9a8833c64a 100644 --- a/libs/androidfw/tests/data/libclient/libclient.apk +++ b/libs/androidfw/tests/data/libclient/libclient.apk diff --git a/libs/androidfw/tests/data/libclient/res/values/values.xml b/libs/androidfw/tests/data/libclient/res/values/values.xml index fead7c323767..a29f473e3c17 100644 --- a/libs/androidfw/tests/data/libclient/res/values/values.xml +++ b/libs/androidfw/tests/data/libclient/res/values/values.xml @@ -27,6 +27,12 @@ <item name="bar">@com.android.lib_one:string/foo</item> </style> + <public type="style" name="ThemeMultiLib" id="0x7f020001" /> + <style name="ThemeMultiLib" > + <item name="com.android.lib_one:attr1">@com.android.lib_one:string/foo</item> + <item name="com.android.lib_two:attr3">@com.android.lib_two:integer/bar</item> + </style> + <public type="string" name="foo_one" id="0x7f030000" /> <string name="foo_one">@com.android.lib_one:string/foo</string> |