From ec7f06cc372a7298c85bf96cb4133d7dc8807419 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Fri, 9 Feb 2018 11:01:26 -0800 Subject: [PATCH] Revert "AssetManager2: Fix list function" This reverts commit adc0b87ec235a71d722fb8d6aad50ceaeac8c6d5. Bug:73134570 Change-Id: I9e652245e7661eb7a34dadb5f363a08bc8c9e57e --- core/jni/android_util_AssetManager.cpp | 32 +++++--- libs/androidfw/ApkAssets.cpp | 16 ++-- libs/androidfw/tests/AssetManager2_test.cpp | 72 +----------------- libs/androidfw/tests/data/app/app.apk | Bin 1402 -> 1138 bytes .../tests/data/app/assets/app_file.txt | 1 - libs/androidfw/tests/data/app/assets/file.txt | 1 - libs/androidfw/tests/data/app/build | 9 +-- .../tests/data/system/assets/file.txt | 1 - .../data/system/assets/subdir/subdir_file.txt | 1 - libs/androidfw/tests/data/system/build | 4 +- .../data/system/res/values-sv/values.xml | 1 + .../tests/data/system/res/values/themes.xml | 1 - libs/androidfw/tests/data/system/system.apk | Bin 1624 -> 1417 bytes 13 files changed, 31 insertions(+), 108 deletions(-) delete mode 100644 libs/androidfw/tests/data/app/assets/app_file.txt delete mode 100644 libs/androidfw/tests/data/app/assets/file.txt delete mode 100644 libs/androidfw/tests/data/system/assets/file.txt delete mode 100644 libs/androidfw/tests/data/system/assets/subdir/subdir_file.txt diff --git a/core/jni/android_util_AssetManager.cpp b/core/jni/android_util_AssetManager.cpp index 2334e03031e79..c623ca6212921 100644 --- a/core/jni/android_util_AssetManager.cpp +++ b/core/jni/android_util_AssetManager.cpp @@ -403,30 +403,38 @@ static jobjectArray NativeList(JNIEnv* env, jclass /*clazz*/, jlong ptr, jstring return nullptr; } - ScopedLock assetmanager(AssetManagerFromLong(ptr)); - std::unique_ptr asset_dir = - assetmanager->OpenDir(path_utf8.c_str()); - if (asset_dir == nullptr) { - jniThrowException(env, "java/io/FileNotFoundException", path_utf8.c_str()); - return nullptr; + std::vector all_file_paths; + { + StringPiece normalized_path = path_utf8.c_str(); + if (normalized_path.data()[0] == '/') { + normalized_path = normalized_path.substr(1); + } + std::string root_path = StringPrintf("assets/%s", normalized_path.data()); + ScopedLock assetmanager(AssetManagerFromLong(ptr)); + for (const ApkAssets* assets : assetmanager->GetApkAssets()) { + assets->ForEachFile(root_path, [&](const StringPiece& file_path, FileType type) { + if (type == FileType::kFileTypeRegular) { + all_file_paths.push_back(file_path.to_string()); + } + }); + } } - const size_t file_count = asset_dir->getFileCount(); - - jobjectArray array = env->NewObjectArray(file_count, g_stringClass, nullptr); + jobjectArray array = env->NewObjectArray(all_file_paths.size(), g_stringClass, nullptr); if (array == nullptr) { return nullptr; } - for (size_t i = 0; i < file_count; i++) { - jstring java_string = env->NewStringUTF(asset_dir->getFileName(i).string()); + jsize index = 0; + for (const std::string& file_path : all_file_paths) { + jstring java_string = env->NewStringUTF(file_path.c_str()); // Check for errors creating the strings (if malformed or no memory). if (env->ExceptionCheck()) { return nullptr; } - env->SetObjectArrayElement(array, i, java_string); + env->SetObjectArrayElement(array, index++, java_string); // If we have a large amount of string in our array, we might overflow the // local reference table of the VM. diff --git a/libs/androidfw/ApkAssets.cpp b/libs/androidfw/ApkAssets.cpp index 60f8a18339192..da0205d721254 100644 --- a/libs/androidfw/ApkAssets.cpp +++ b/libs/androidfw/ApkAssets.cpp @@ -231,16 +231,12 @@ bool ApkAssets::ForEachFile(const std::string& root_path, while ((result = ::Next(cookie, &entry, &name)) == 0) { StringPiece full_file_path(reinterpret_cast(name.name), name.name_length); StringPiece leaf_file_path = full_file_path.substr(root_path_full.size()); - - if (!leaf_file_path.empty()) { - auto iter = std::find(leaf_file_path.begin(), leaf_file_path.end(), '/'); - if (iter != leaf_file_path.end()) { - std::string dir = - leaf_file_path.substr(0, std::distance(leaf_file_path.begin(), iter)).to_string(); - dirs.insert(std::move(dir)); - } else { - f(leaf_file_path, kFileTypeRegular); - } + auto iter = std::find(leaf_file_path.begin(), leaf_file_path.end(), '/'); + if (iter != leaf_file_path.end()) { + dirs.insert( + leaf_file_path.substr(0, std::distance(leaf_file_path.begin(), iter)).to_string()); + } else if (!leaf_file_path.empty()) { + f(leaf_file_path, kFileTypeRegular); } } ::EndIteration(cookie); diff --git a/libs/androidfw/tests/AssetManager2_test.cpp b/libs/androidfw/tests/AssetManager2_test.cpp index 7cac2b3417b57..eaf79cb129011 100644 --- a/libs/androidfw/tests/AssetManager2_test.cpp +++ b/libs/androidfw/tests/AssetManager2_test.cpp @@ -36,10 +36,6 @@ namespace lib_one = com::android::lib_one; namespace lib_two = com::android::lib_two; namespace libclient = com::android::libclient; -using ::testing::Eq; -using ::testing::NotNull; -using ::testing::StrEq; - namespace android { class AssetManager2Test : public ::testing::Test { @@ -68,9 +64,6 @@ class AssetManager2Test : public ::testing::Test { system_assets_ = ApkAssets::Load(GetTestDataPath() + "/system/system.apk", true /*system*/); ASSERT_NE(nullptr, system_assets_); - - app_assets_ = ApkAssets::Load(GetTestDataPath() + "/app/app.apk"); - ASSERT_THAT(app_assets_, NotNull()); } protected: @@ -82,7 +75,6 @@ class AssetManager2Test : public ::testing::Test { std::unique_ptr libclient_assets_; std::unique_ptr appaslib_assets_; std::unique_ptr system_assets_; - std::unique_ptr app_assets_; }; TEST_F(AssetManager2Test, FindsResourceFromSingleApkAssets) { @@ -473,68 +465,8 @@ TEST_F(AssetManager2Test, GetResourceId) { assetmanager.GetResourceId("main", "layout", "com.android.basic")); } -TEST_F(AssetManager2Test, OpensFileFromSingleApkAssets) { - AssetManager2 assetmanager; - assetmanager.SetApkAssets({system_assets_.get()}); +TEST_F(AssetManager2Test, OpensFileFromSingleApkAssets) {} - std::unique_ptr asset = assetmanager.Open("file.txt", Asset::ACCESS_BUFFER); - ASSERT_THAT(asset, NotNull()); - - const char* data = reinterpret_cast(asset->getBuffer(false /*wordAligned*/)); - ASSERT_THAT(data, NotNull()); - EXPECT_THAT(std::string(data, asset->getLength()), StrEq("file\n")); -} - -TEST_F(AssetManager2Test, OpensFileFromMultipleApkAssets) { - AssetManager2 assetmanager; - assetmanager.SetApkAssets({system_assets_.get(), app_assets_.get()}); - - std::unique_ptr asset = assetmanager.Open("file.txt", Asset::ACCESS_BUFFER); - ASSERT_THAT(asset, NotNull()); - - const char* data = reinterpret_cast(asset->getBuffer(false /*wordAligned*/)); - ASSERT_THAT(data, NotNull()); - EXPECT_THAT(std::string(data, asset->getLength()), StrEq("app override file\n")); -} - -TEST_F(AssetManager2Test, OpenDir) { - AssetManager2 assetmanager; - assetmanager.SetApkAssets({system_assets_.get()}); - - std::unique_ptr asset_dir = assetmanager.OpenDir(""); - ASSERT_THAT(asset_dir, NotNull()); - ASSERT_THAT(asset_dir->getFileCount(), Eq(2u)); - - EXPECT_THAT(asset_dir->getFileName(0), Eq(String8("file.txt"))); - EXPECT_THAT(asset_dir->getFileType(0), Eq(FileType::kFileTypeRegular)); - - EXPECT_THAT(asset_dir->getFileName(1), Eq(String8("subdir"))); - EXPECT_THAT(asset_dir->getFileType(1), Eq(FileType::kFileTypeDirectory)); - - asset_dir = assetmanager.OpenDir("subdir"); - ASSERT_THAT(asset_dir, NotNull()); - ASSERT_THAT(asset_dir->getFileCount(), Eq(1u)); - - EXPECT_THAT(asset_dir->getFileName(0), Eq(String8("subdir_file.txt"))); - EXPECT_THAT(asset_dir->getFileType(0), Eq(FileType::kFileTypeRegular)); -} - -TEST_F(AssetManager2Test, OpenDirFromManyApks) { - AssetManager2 assetmanager; - assetmanager.SetApkAssets({system_assets_.get(), app_assets_.get()}); - - std::unique_ptr asset_dir = assetmanager.OpenDir(""); - ASSERT_THAT(asset_dir, NotNull()); - ASSERT_THAT(asset_dir->getFileCount(), Eq(3u)); - - EXPECT_THAT(asset_dir->getFileName(0), Eq(String8("app_file.txt"))); - EXPECT_THAT(asset_dir->getFileType(0), Eq(FileType::kFileTypeRegular)); - - EXPECT_THAT(asset_dir->getFileName(1), Eq(String8("file.txt"))); - EXPECT_THAT(asset_dir->getFileType(1), Eq(FileType::kFileTypeRegular)); - - EXPECT_THAT(asset_dir->getFileName(2), Eq(String8("subdir"))); - EXPECT_THAT(asset_dir->getFileType(2), Eq(FileType::kFileTypeDirectory)); -} +TEST_F(AssetManager2Test, OpensFileFromMultipleApkAssets) {} } // namespace android diff --git a/libs/androidfw/tests/data/app/app.apk b/libs/androidfw/tests/data/app/app.apk index c8ad86ded8519b81b604adf03a37489b422356a3..ccb08242a656e387a1e2c914dd99e2119c746edf 100644 GIT binary patch literal 1138 zcmWIWW@Zs#U}E54U}%`nxO0!V(>ewQh7v{w24NuWn3qzNpPAyDn3tKBT3n)6k(-m+ z=PlG^Am9?;vw!aWR&M_XOlEpI`OXjdbz7MD9w^!@E5G1(M5u7tE~}R>eU2L~F-nN| z#PF*o`>ut5>*fN{yhE`P0x$P1R!|l^+$B8KD&2d9Ugy#`o=B zMD(xU@8fEs^lYc;Khlu@RrzWzC;R_(lgw6?|4ZN5^Jnj=p2!ZhL%~l~7b@3Yz7Shl zI&Zb_U+(3Rh3B6q%igZKzvkM4CI%j`4AAckj0`eBhzj6*CI!YdKojbL(#Z_@47m(?42cYR3@HpnKwc)0 z2Js7kaQFiSU|<1*f*}D)gM17MI|m>Q5{Cg57z0T205J z!Ky&|eSj=n`UQY;Y{2j?1%`YQP!GrqPKFSM3?Mrfi1ir!fwB;@n3x0@M1b;;I0Z65 zY$hL|T?nxNAlm{YK_(CYn-0+ovIhtlf!Rrb1;~Ke5Aq9C4sJh8j2iYs%w}SQ(2VsU z`$6mgZ$>6@X51MZs00WU7`8QnXe`+sW&lVUR6?L7o3ssH!IL@C9e@muxqjni4Kb>|~874ET4j&gf>dR87sNWaLtukt?G zx4G)4A1JzTM zGUPC%f>nX^+W=W`{Xnyk^>YH{*x2$)bCXhw7&tjYGE#F>_5Aa|nwgjc7({^bAm_lG z#K;r^G#?=r0c1M>F{MBNZUfvdMqs`Y0A?@-m^(mzKz9dBjGFF%*ulgIp&9Ez?f|h- z)4#-SZ)Q;FfiNh)Cl(i{mK5tJ78Jy%W#**nl~j}f*$N;w7phKiKj+s%Kph~=kI;#% zE59tYs3YEDMii|%hEz06oc k0o?#}?;{M*0>(Bp7-4}C;LXYgQosU)zkzfnC_yj)0PP3TrvLx| diff --git a/libs/androidfw/tests/data/app/assets/app_file.txt b/libs/androidfw/tests/data/app/assets/app_file.txt deleted file mode 100644 index b214e06d6ece9..0000000000000 --- a/libs/androidfw/tests/data/app/assets/app_file.txt +++ /dev/null @@ -1 +0,0 @@ -app file diff --git a/libs/androidfw/tests/data/app/assets/file.txt b/libs/androidfw/tests/data/app/assets/file.txt deleted file mode 100644 index 0811542725207..0000000000000 --- a/libs/androidfw/tests/data/app/assets/file.txt +++ /dev/null @@ -1 +0,0 @@ -app override file diff --git a/libs/androidfw/tests/data/app/build b/libs/androidfw/tests/data/app/build index 09af842e70fb6..d418158c547b1 100755 --- a/libs/androidfw/tests/data/app/build +++ b/libs/androidfw/tests/data/app/build @@ -17,11 +17,4 @@ set -e -aapt2 compile --dir res -o compiled.flata -aapt2 link \ - --manifest AndroidManifest.xml \ - -I ../system/system.apk \ - -A assets \ - -o app.apk \ - compiled.flata -rm compiled.flata +aapt package -I ../system/system.apk -M AndroidManifest.xml -S res -F app.apk -f diff --git a/libs/androidfw/tests/data/system/assets/file.txt b/libs/androidfw/tests/data/system/assets/file.txt deleted file mode 100644 index f73f3093ff865..0000000000000 --- a/libs/androidfw/tests/data/system/assets/file.txt +++ /dev/null @@ -1 +0,0 @@ -file diff --git a/libs/androidfw/tests/data/system/assets/subdir/subdir_file.txt b/libs/androidfw/tests/data/system/assets/subdir/subdir_file.txt deleted file mode 100644 index 3f74eb6e64412..0000000000000 --- a/libs/androidfw/tests/data/system/assets/subdir/subdir_file.txt +++ /dev/null @@ -1 +0,0 @@ -subdir file diff --git a/libs/androidfw/tests/data/system/build b/libs/androidfw/tests/data/system/build index b65145a8454f4..bfbdf4ca770b9 100755 --- a/libs/androidfw/tests/data/system/build +++ b/libs/androidfw/tests/data/system/build @@ -17,6 +17,4 @@ set -e -aapt2 compile --dir res -o compiled.flata -aapt2 link --manifest AndroidManifest.xml -A assets -o system.apk compiled.flata -rm compiled.flata +aapt package -x -M AndroidManifest.xml -S res -F system.apk -f diff --git a/libs/androidfw/tests/data/system/res/values-sv/values.xml b/libs/androidfw/tests/data/system/res/values-sv/values.xml index 5f60d214c7448..b97bdb68aca7e 100644 --- a/libs/androidfw/tests/data/system/res/values-sv/values.xml +++ b/libs/androidfw/tests/data/system/res/values-sv/values.xml @@ -15,5 +15,6 @@ --> + 1 diff --git a/libs/androidfw/tests/data/system/res/values/themes.xml b/libs/androidfw/tests/data/system/res/values/themes.xml index 7893c946e2999..35d43c77fc7a1 100644 --- a/libs/androidfw/tests/data/system/res/values/themes.xml +++ b/libs/androidfw/tests/data/system/res/values/themes.xml @@ -18,7 +18,6 @@ - diff --git a/libs/androidfw/tests/data/system/system.apk b/libs/androidfw/tests/data/system/system.apk index 9045d6c4de2122c5a95a6f42e517de14f9ba9a40..1299016a0f836d9ae4406f7643a7412a44a23f3d 100644 GIT binary patch literal 1417 zcmd^9T}V@L6hHTFE{(Mo4vJ~Dq==%eB8ok(h!C&RpxFmwtGN#w=@$3y%9IQh!-vF| zgbIR)S|J6!MM2OAe2G#ih#u5chz}v8FMU04cnvoCHW9M=>=lssu`TGC&_e&bWk=OgJZR5K*H*R1LX56_eA+SW_gGOvIIpC)?f@8j@^%KKsFf*LmVw@Zr4K zlg}+!!+md8R~_gvWxXGBdoS&-n;OY9sp{wBbwd_wO*r3wa<1##rpXHf^N!oM-fwko zmz&?nH;=rotsiz@9p00>=3dBeyc-<3Tz`LCpr$ie{9d^DCv4UQgbsP=eYST^+D**6!o%|7=Pr@xY4n+VNo6E!^E`QeL+ zh}i~6jw@+Zj>Z*FL{_3ASv3#FC4p-3Ev1qzx`YX2;J65-C`K}+DGB-ikqb*OW9%!s zq4YVEXp~HygnifbE zSPLxfkVq8m#C7;?hzt<u0J<0ax5RhRPPl|RabA#sf3AHE6!z(uAxl2) z(SaE5Pmj_1<1;fbKlFd;kL&C6>r&wQ>xqg*fef9BMlU=`c`v768(4WSN(UT&NR{Y- zbMbDt2G_Jh8u!F63F2DQ^6%baITt8 literal 1624 zcmWIWW@cev-~d8~hWU&PNI)3KcFapD%Fj&kP0Y(oOD!(ZtH{kM?f2$7H?nI9!c(T>8Ll9G>YtI|C|>ksdTL2u1IWf?A^0RBDS&daL+r?k-w&@Mk}Ue zw}IO76nEdFk)qS)WK8Mfop~wP<7V;X%ai&3tlTxVYG%pt(5=(1w|{>hCv7&RO15b+ z=k>W;oQf^oSAH-E^K12-vD&9)x{`;JO6}dtw>yrcdtLs!{_3N??C=F26Yi&<`?K>i zTYxt^$NxCDI}3sC_W}AS0PI7s$ACVxoqqWD7G?$p5awfGVkk;2&Mz%WPA%3;EGkZB z0E+N{Bf$RGoRNB}4Z=QAlV_5jTQsY_(YV@P2rV#sI61kxi9D1ZV12uh$dhz$z6 z5FiZ9!js%cG2O4yYz+zC|!c4q^USOk#m0K}96kQ+hvfB=MM1i3?&f#LsuMg|z0 z;Xlkxp!i01QwER^6GL`WaT&-&@&E_WB_K0FVFj`aHHRPUe520_6a`^^AWkeUPAw_c zPs_|n)hnqe0nuEjI^6SaXoAus2m?I^(@|WSl#*Gb524~=`XO8es4