summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--core/jni/android_util_AssetManager.cpp27
-rw-r--r--libs/androidfw/ResourceTypes.cpp6
-rw-r--r--tests/SharedLibrary/lib/res/layout/main.xml26
-rw-r--r--tests/SharedLibrary/lib/res/values/strings.xml1
-rw-r--r--tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java6
5 files changed, 56 insertions, 10 deletions
diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp
index 4859ee6..8753660 100644
--- a/core/jni/android_util_AssetManager.cpp
+++ b/core/jni/android_util_AssetManager.cpp
@@ -1324,7 +1324,21 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla
config.density = 0;
// Skip through XML attributes until the end or the next possible match.
- while (ix < NX && curIdent > curXmlAttr) {
+ // We make two assumptions about the order of attributes:
+ // 1) Among attributes with the same package ID, the attributes are
+ // sorted by increasing resource ID.
+ // 2) Groups of attributes with the same package ID are in the same
+ // order.
+ // 3) The same sorting is applied to the input attributes as is
+ // to the attributes in the XML.
+ //
+ // ex: 02010000, 02010001, 010100f4, 010100f5
+ //
+ // The total order of attributes (including package ID) can not be linear
+ // as shared libraries get assigned dynamic package IDs at runtime, which
+ // may break the sort order established at build time.
+ while (ix < NX && (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(curXmlAttr) ||
+ curIdent > curXmlAttr)) {
ix++;
curXmlAttr = xmlParser->getAttributeNameResID(ix);
}
@@ -1339,7 +1353,9 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla
}
// Skip through the style values until the end or the next possible match.
- while (styleEnt < endStyleEnt && curIdent > styleEnt->map.name.ident) {
+ while (styleEnt < endStyleEnt &&
+ (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(styleEnt->map.name.ident) ||
+ curIdent > styleEnt->map.name.ident)) {
styleEnt++;
}
// Retrieve the current style attribute if it matches, and step to next.
@@ -1355,7 +1371,9 @@ static jboolean android_content_AssetManager_applyStyle(JNIEnv* env, jobject cla
}
// Skip through the default style values until the end or the next possible match.
- while (defStyleEnt < endDefStyleEnt && curIdent > defStyleEnt->map.name.ident) {
+ while (defStyleEnt < endDefStyleEnt &&
+ (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(defStyleEnt->map.name.ident) ||
+ curIdent > defStyleEnt->map.name.ident)) {
defStyleEnt++;
}
// Retrieve the current default style attribute if it matches, and step to next.
@@ -1517,7 +1535,8 @@ static jboolean android_content_AssetManager_retrieveAttributes(JNIEnv* env, job
config.density = 0;
// Skip through XML attributes until the end or the next possible match.
- while (ix < NX && curIdent > curXmlAttr) {
+ while (ix < NX && (Res_GETPACKAGE(curIdent) != Res_GETPACKAGE(curXmlAttr) ||
+ curIdent > curXmlAttr)) {
ix++;
curXmlAttr = xmlParser->getAttributeNameResID(ix);
}
diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp
index 8cef137..61a767c 100644
--- a/libs/androidfw/ResourceTypes.cpp
+++ b/libs/androidfw/ResourceTypes.cpp
@@ -1185,7 +1185,11 @@ uint32_t ResXMLParser::getAttributeNameResID(size_t idx) const
{
int32_t id = getAttributeNameID(idx);
if (id >= 0 && (size_t)id < mTree.mNumResIds) {
- return dtohl(mTree.mResIds[id]);
+ uint32_t resId = dtohl(mTree.mResIds[id]);
+ if (mTree.mDynamicRefTable == NULL ||
+ mTree.mDynamicRefTable->lookupResourceId(&resId) == NO_ERROR) {
+ return resId;
+ }
}
return 0;
}
diff --git a/tests/SharedLibrary/lib/res/layout/main.xml b/tests/SharedLibrary/lib/res/layout/main.xml
new file mode 100644
index 0000000..df0204d9
--- /dev/null
+++ b/tests/SharedLibrary/lib/res/layout/main.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:orientation="vertical">
+
+ <TextView
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/sample_layout"/>
+
+ <com.google.android.test.shared_library.AddressView xmlns:address="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_weight="1"
+ android:background="#03a9f4"
+ address:name="Librarian L"
+ address:streetNumber="21"
+ address:streetName="Android Lane"
+ address:city="AndroidVille"
+ address:state="OS"
+ address:zip="12345"
+ address:country="Mobile"/>
+
+</LinearLayout>
diff --git a/tests/SharedLibrary/lib/res/values/strings.xml b/tests/SharedLibrary/lib/res/values/strings.xml
index 6827f93..9beccd9 100644
--- a/tests/SharedLibrary/lib/res/values/strings.xml
+++ b/tests/SharedLibrary/lib/res/values/strings.xml
@@ -28,4 +28,5 @@
</string-array>
<string name="racoon">Racoon</string>
+ <string name="sample_layout">This is an example of a layout this library provides.</string>
</resources>
diff --git a/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java b/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java
index 895aced..4b4893c 100644
--- a/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java
+++ b/tests/SharedLibrary/lib/src/com/google/android/test/shared_library/ActivityMain.java
@@ -18,15 +18,11 @@ package com.google.android.test.shared_library;
import android.app.Activity;
import android.os.Bundle;
-import android.widget.TextView;
public class ActivityMain extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
-
- TextView content = new TextView(this);
- content.setText("Dummy main entry for this apk; not really needed...");
- setContentView(content);
+ setContentView(R.layout.main);
}
}