diff options
-rwxr-xr-x | test/etc/default-build | 2 | ||||
-rw-r--r-- | tools/hiddenapi/hiddenapi.cc | 302 | ||||
-rw-r--r-- | tools/hiddenapi/hiddenapi_test.cc | 69 |
3 files changed, 178 insertions, 195 deletions
diff --git a/test/etc/default-build b/test/etc/default-build index 073ae2c796..8542ad0e92 100755 --- a/test/etc/default-build +++ b/test/etc/default-build @@ -321,7 +321,7 @@ function make_dexmerge() { } function make_hiddenapi() { - local args=() + local args=( "encode" ) while [[ $# -gt 0 ]]; do args+=("--dex=$1") shift diff --git a/tools/hiddenapi/hiddenapi.cc b/tools/hiddenapi/hiddenapi.cc index 97e7f4cf3c..2e1ec5a541 100644 --- a/tools/hiddenapi/hiddenapi.cc +++ b/tools/hiddenapi/hiddenapi.cc @@ -61,18 +61,16 @@ NO_RETURN static void Usage(const char* fmt, ...) { va_end(ap); UsageError("Command: %s", CommandLine().c_str()); - UsageError("Usage: hiddenapi [options]..."); + UsageError("Usage: hiddenapi [command_name] [options]..."); UsageError(""); - UsageError(" --dex=<filename>: specify dex file whose members' access flags are to be set."); - UsageError(" At least one --dex parameter must be specified."); + UsageError(" Command \"encode\": encode API list membership in boot dex files"); + UsageError(" --dex=<filename>: dex file which belongs to boot class path,"); + UsageError(" the file will be overwritten"); UsageError(""); - UsageError(" --light-greylist=<filename>:"); - UsageError(" --dark-greylist=<filename>:"); - UsageError(" --blacklist=<filename>: text files with signatures of methods/fields to be marked"); - UsageError(" greylisted/blacklisted respectively. At least one list must be provided."); - UsageError(""); - UsageError(" --print-hidden-api: dump a list of marked methods/fields to the standard output."); - UsageError(" There is no indication which API category they belong to."); + UsageError(" --light-greylist=<filename>:"); + UsageError(" --dark-greylist=<filename>:"); + UsageError(" --blacklist=<filename>:"); + UsageError(" text files with signatures of methods/fields to be annotated"); UsageError(""); exit(EXIT_FAILURE); @@ -128,11 +126,6 @@ class DexMember { UpdateUnsignedLeb128(const_cast<uint8_t*>(ptr), new_flags); } - // Returns true if this member's API entry is in `list`. - bool IsOnApiList(const std::unordered_set<std::string>& list) const { - return list.find(GetApiEntry()) != list.end(); - } - // Constructs a string with a unique signature of this class member. std::string GetApiEntry() const { std::stringstream ss; @@ -164,112 +157,44 @@ class DexMember { const ClassDataItemIterator& it_; }; -class HiddenApi FINAL { +class ClassPath FINAL { public: - HiddenApi() : print_hidden_api_(false) {} - - void ParseArgs(int argc, char** argv) { - original_argc = argc; - original_argv = argv; - - android::base::InitLogging(argv); - - // Skip over the command name. - argv++; - argc--; - - if (argc == 0) { - Usage("No arguments specified"); - } + explicit ClassPath(const std::vector<std::string>& dex_paths) { + OpenDexFiles(dex_paths); + } - for (int i = 0; i < argc; ++i) { - const StringPiece option(argv[i]); - const bool log_options = false; - if (log_options) { - LOG(INFO) << "hiddenapi: option[" << i << "]=" << argv[i]; - } - if (option == "--print-hidden-api") { - print_hidden_api_ = true; - } else if (option.starts_with("--dex=")) { - dex_paths_.push_back(option.substr(strlen("--dex=")).ToString()); - } else if (option.starts_with("--light-greylist=")) { - light_greylist_path_ = option.substr(strlen("--light-greylist=")).ToString(); - } else if (option.starts_with("--dark-greylist=")) { - dark_greylist_path_ = option.substr(strlen("--dark-greylist=")).ToString(); - } else if (option.starts_with("--blacklist=")) { - blacklist_path_ = option.substr(strlen("--blacklist=")).ToString(); - } else { - Usage("Unknown argument '%s'", option.data()); + template<typename Fn> + void ForEachDexMember(Fn fn) { + for (auto& dex_file : dex_files_) { + for (uint32_t class_idx = 0; class_idx < dex_file->NumClassDefs(); ++class_idx) { + DexClass klass(*dex_file, class_idx); + const uint8_t* klass_data = klass.GetData(); + if (klass_data != nullptr) { + for (ClassDataItemIterator it(*dex_file, klass_data); it.HasNext(); it.Next()) { + DexMember member(klass, it); + fn(member); + } + } } } } - bool ProcessDexFiles() { - if (dex_paths_.empty()) { - Usage("No DEX files specified"); - } - - if (light_greylist_path_.empty() && dark_greylist_path_.empty() && blacklist_path_.empty()) { - Usage("No API file specified"); - } - - if (!light_greylist_path_.empty() && !OpenApiFile(light_greylist_path_, &light_greylist_)) { - return false; - } - - if (!dark_greylist_path_.empty() && !OpenApiFile(dark_greylist_path_, &dark_greylist_)) { - return false; - } - - if (!blacklist_path_.empty() && !OpenApiFile(blacklist_path_, &blacklist_)) { - return false; - } - - MemMap::Init(); - if (!OpenDexFiles()) { - return false; - } - - DCHECK(!dex_files_.empty()); + void UpdateDexChecksums() { for (auto& dex_file : dex_files_) { - CategorizeAllClasses(*dex_file.get()); + // Obtain a writeable pointer to the dex header. + DexFile::Header* header = const_cast<DexFile::Header*>(&dex_file->GetHeader()); + // Recalculate checksum and overwrite the value in the header. + header->checksum_ = dex_file->CalculateChecksum(); } - - UpdateDexChecksums(); - return true; } private: - bool OpenApiFile(const std::string& path, std::unordered_set<std::string>* list) { - DCHECK(list->empty()); - DCHECK(!path.empty()); - - std::ifstream api_file(path, std::ifstream::in); - if (api_file.fail()) { - LOG(ERROR) << "Unable to open file '" << path << "' " << strerror(errno); - return false; - } - - for (std::string line; std::getline(api_file, line);) { - list->insert(line); - } - - api_file.close(); - return true; - } - - bool OpenDexFiles() { + void OpenDexFiles(const std::vector<std::string>& dex_paths) { ArtDexFileLoader dex_loader; - DCHECK(dex_files_.empty()); - - for (const std::string& filename : dex_paths_) { - std::string error_msg; - + std::string error_msg; + for (const std::string& filename : dex_paths) { File fd(filename.c_str(), O_RDWR, /* check_usage */ false); - if (fd.Fd() == -1) { - LOG(ERROR) << "Unable to open file '" << filename << "': " << strerror(errno); - return false; - } + CHECK_NE(fd.Fd(), -1) << "Unable to open file '" << filename << "': " << strerror(errno); // Memory-map the dex file with MAP_SHARED flag so that changes in memory // propagate to the underlying file. We run dex file verification as if @@ -283,96 +208,127 @@ class HiddenApi FINAL { /* verify_checksum */ true, /* mmap_shared */ true, &error_msg)); - if (dex_file.get() == nullptr) { - LOG(ERROR) << "Open failed for '" << filename << "' " << error_msg; - return false; - } + CHECK(dex_file.get() != nullptr) << "Open failed for '" << filename << "' " << error_msg; + CHECK(dex_file->IsStandardDexFile()) << "Expected a standard dex file '" << filename << "'"; + CHECK(dex_file->EnableWrite()) + << "Failed to enable write permission for '" << filename << "'"; + dex_files_.push_back(std::move(dex_file)); + } + } - if (!dex_file->IsStandardDexFile()) { - LOG(ERROR) << "Expected a standard dex file '" << filename << "'"; - return false; - } + // Opened DEX files. Note that these are opened as `const` but may be written into. + std::vector<std::unique_ptr<const DexFile>> dex_files_; +}; - // Change the protection of the memory mapping to read-write. - if (!dex_file->EnableWrite()) { - LOG(ERROR) << "Failed to enable write permission for '" << filename << "'"; - return false; - } +class HiddenApi FINAL { + public: + HiddenApi() {} - dex_files_.push_back(std::move(dex_file)); + void Run(int argc, char** argv) { + switch (ParseArgs(argc, argv)) { + case Command::kEncode: + EncodeAccessFlags(); + break; } - return true; } - void CategorizeAllClasses(const DexFile& dex_file) { - for (uint32_t class_idx = 0; class_idx < dex_file.NumClassDefs(); ++class_idx) { - DexClass klass(dex_file, class_idx); - const uint8_t* klass_data = klass.GetData(); - if (klass_data == nullptr) { - continue; - } - - for (ClassDataItemIterator it(klass.GetDexFile(), klass_data); it.HasNext(); it.Next()) { - DexMember member(klass, it); - - // Catagorize member and overwrite its access flags. - // Note that if a member appears on multiple API lists, it will be categorized - // as the strictest. - bool is_hidden = true; - if (member.IsOnApiList(blacklist_)) { - member.SetHidden(HiddenApiAccessFlags::kBlacklist); - } else if (member.IsOnApiList(dark_greylist_)) { - member.SetHidden(HiddenApiAccessFlags::kDarkGreylist); - } else if (member.IsOnApiList(light_greylist_)) { - member.SetHidden(HiddenApiAccessFlags::kLightGreylist); - } else { - member.SetHidden(HiddenApiAccessFlags::kWhitelist); - is_hidden = false; - } + private: + enum class Command { + // Currently just one command. A "list" command will be added for generating + // a full list of boot class members. + kEncode, + }; + + Command ParseArgs(int argc, char** argv) { + // Skip over the binary's path. + argv++; + argc--; - if (print_hidden_api_ && is_hidden) { - std::cout << member.GetApiEntry() << std::endl; + if (argc > 0) { + const StringPiece command(argv[0]); + if (command == "encode") { + for (int i = 1; i < argc; ++i) { + const StringPiece option(argv[i]); + if (option.starts_with("--dex=")) { + boot_dex_paths_.push_back(option.substr(strlen("--dex=")).ToString()); + } else if (option.starts_with("--light-greylist=")) { + light_greylist_path_ = option.substr(strlen("--light-greylist=")).ToString(); + } else if (option.starts_with("--dark-greylist=")) { + dark_greylist_path_ = option.substr(strlen("--dark-greylist=")).ToString(); + } else if (option.starts_with("--blacklist=")) { + blacklist_path_ = option.substr(strlen("--blacklist=")).ToString(); + } else { + Usage("Unknown argument '%s'", option.data()); + } } + return Command::kEncode; + } else { + Usage("Unknown command '%s'", command.data()); } + } else { + Usage("No command specified"); } } - void UpdateDexChecksums() { - for (auto& dex_file : dex_files_) { - // Obtain a writeable pointer to the dex header. - DexFile::Header* header = const_cast<DexFile::Header*>(&dex_file->GetHeader()); - // Recalculate checksum and overwrite the value in the header. - header->checksum_ = dex_file->CalculateChecksum(); + void EncodeAccessFlags() { + if (boot_dex_paths_.empty()) { + Usage("No boot DEX files specified"); } + + // Load dex signatures. + std::map<std::string, HiddenApiAccessFlags::ApiList> api_list; + OpenApiFile(light_greylist_path_, api_list, HiddenApiAccessFlags::kLightGreylist); + OpenApiFile(dark_greylist_path_, api_list, HiddenApiAccessFlags::kDarkGreylist); + OpenApiFile(blacklist_path_, api_list, HiddenApiAccessFlags::kBlacklist); + + // Open all dex files. + ClassPath boot_class_path(boot_dex_paths_); + + // Set access flags of all members. + boot_class_path.ForEachDexMember([&api_list](DexMember& boot_member) { + auto it = api_list.find(boot_member.GetApiEntry()); + if (it == api_list.end()) { + boot_member.SetHidden(HiddenApiAccessFlags::kWhitelist); + } else { + boot_member.SetHidden(it->second); + } + }); + + boot_class_path.UpdateDexChecksums(); } - // Print signatures of APIs which have been grey-/blacklisted. - bool print_hidden_api_; + void OpenApiFile(const std::string& path, + std::map<std::string, HiddenApiAccessFlags::ApiList>& api_list, + HiddenApiAccessFlags::ApiList membership) { + if (path.empty()) { + return; + } + + std::ifstream api_file(path, std::ifstream::in); + CHECK(!api_file.fail()) << "Unable to open file '" << path << "' " << strerror(errno); + + for (std::string line; std::getline(api_file, line);) { + CHECK(api_list.find(line) == api_list.end()) + << "Duplicate entry: " << line << " (" << api_list[line] << " and " << membership << ")"; + api_list.emplace(line, membership); + } + api_file.close(); + } // Paths to DEX files which should be processed. - std::vector<std::string> dex_paths_; + std::vector<std::string> boot_dex_paths_; // Paths to text files which contain the lists of API members. std::string light_greylist_path_; std::string dark_greylist_path_; std::string blacklist_path_; - - // Opened DEX files. Note that these are opened as `const` but eventually will be written into. - std::vector<std::unique_ptr<const DexFile>> dex_files_; - - // Signatures of DEX members loaded from `light_greylist_path_`, `dark_greylist_path_`, - // `blacklist_path_`. - std::unordered_set<std::string> light_greylist_; - std::unordered_set<std::string> dark_greylist_; - std::unordered_set<std::string> blacklist_; }; } // namespace art int main(int argc, char** argv) { - art::HiddenApi hiddenapi; - - // Parse arguments. Argument mistakes will lead to exit(EXIT_FAILURE) in UsageError. - hiddenapi.ParseArgs(argc, argv); - return hiddenapi.ProcessDexFiles() ? EXIT_SUCCESS : EXIT_FAILURE; + android::base::InitLogging(argv); + art::MemMap::Init(); + art::HiddenApi().Run(argc, argv); + return EXIT_SUCCESS; } diff --git a/tools/hiddenapi/hiddenapi_test.cc b/tools/hiddenapi/hiddenapi_test.cc index ed880e0e92..aa87f21e7f 100644 --- a/tools/hiddenapi/hiddenapi_test.cc +++ b/tools/hiddenapi/hiddenapi_test.cc @@ -66,15 +66,18 @@ class HiddenApiTest : public CommonRuntimeTest { std::vector<std::string> argv_str; argv_str.push_back(GetHiddenApiCmd()); argv_str.insert(argv_str.end(), extra_args.begin(), extra_args.end()); + argv_str.push_back("encode"); argv_str.push_back("--dex=" + out_dex->GetFilename()); argv_str.push_back("--light-greylist=" + light_greylist.GetFilename()); argv_str.push_back("--dark-greylist=" + dark_greylist.GetFilename()); argv_str.push_back("--blacklist=" + blacklist.GetFilename()); int return_code = ExecAndReturnCode(argv_str, &error); - if (return_code != 0) { - LOG(FATAL) << "HiddenApi binary exited with unexpected return code " << return_code; + if (return_code == 0) { + return OpenDex(*out_dex); + } else { + LOG(ERROR) << "HiddenApi binary exited with unexpected return code " << return_code; + return nullptr; } - return OpenDex(*out_dex); } std::unique_ptr<const DexFile> OpenDex(const ScratchFile& file) { @@ -226,6 +229,7 @@ TEST_F(HiddenApiTest, InstanceFieldNoMatch) { OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl; OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetIFieldHiddenFlags(*dex_file)); } @@ -235,6 +239,7 @@ TEST_F(HiddenApiTest, InstanceFieldLightGreylistMatch) { OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl; OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetIFieldHiddenFlags(*dex_file)); } @@ -244,6 +249,7 @@ TEST_F(HiddenApiTest, InstanceFieldDarkGreylistMatch) { OpenStream(dark_greylist) << "LMain;->ifield:I" << std::endl; OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetIFieldHiddenFlags(*dex_file)); } @@ -253,6 +259,7 @@ TEST_F(HiddenApiTest, InstanceFieldBlacklistMatch) { OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl; OpenStream(blacklist) << "LMain;->ifield:I" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetIFieldHiddenFlags(*dex_file)); } @@ -262,7 +269,7 @@ TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch1) { OpenStream(dark_greylist) << "LMain;->ifield:I" << std::endl; OpenStream(blacklist) << "LMain;->ifield:I" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetIFieldHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch2) { @@ -271,7 +278,7 @@ TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch2) { OpenStream(dark_greylist) << "LMain;->ifield:LBadType2;" << std::endl; OpenStream(blacklist) << "LMain;->ifield:I" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetIFieldHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch3) { @@ -280,7 +287,7 @@ TEST_F(HiddenApiTest, InstanceFieldTwoListsMatch3) { OpenStream(dark_greylist) << "LMain;->ifield:I" << std::endl; OpenStream(blacklist) << "LMain;->ifield:LBadType3;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetIFieldHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, StaticFieldNoMatch) { @@ -289,6 +296,7 @@ TEST_F(HiddenApiTest, StaticFieldNoMatch) { OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl; OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetSFieldHiddenFlags(*dex_file)); } @@ -298,6 +306,7 @@ TEST_F(HiddenApiTest, StaticFieldLightGreylistMatch) { OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl; OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetSFieldHiddenFlags(*dex_file)); } @@ -307,6 +316,7 @@ TEST_F(HiddenApiTest, StaticFieldDarkGreylistMatch) { OpenStream(dark_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl; OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSFieldHiddenFlags(*dex_file)); } @@ -316,6 +326,7 @@ TEST_F(HiddenApiTest, StaticFieldBlacklistMatch) { OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl; OpenStream(blacklist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSFieldHiddenFlags(*dex_file)); } @@ -325,7 +336,7 @@ TEST_F(HiddenApiTest, StaticFieldTwoListsMatch1) { OpenStream(dark_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl; OpenStream(blacklist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSFieldHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, StaticFieldTwoListsMatch2) { @@ -334,7 +345,7 @@ TEST_F(HiddenApiTest, StaticFieldTwoListsMatch2) { OpenStream(dark_greylist) << "LMain;->sfield:LBadType2;" << std::endl; OpenStream(blacklist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSFieldHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, StaticFieldTwoListsMatch3) { @@ -343,7 +354,7 @@ TEST_F(HiddenApiTest, StaticFieldTwoListsMatch3) { OpenStream(dark_greylist) << "LMain;->sfield:Ljava/lang/Object;" << std::endl; OpenStream(blacklist) << "LMain;->sfield:LBadType3;" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSFieldHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, InstanceMethodNoMatch) { @@ -352,6 +363,7 @@ TEST_F(HiddenApiTest, InstanceMethodNoMatch) { OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetIMethodHiddenFlags(*dex_file)); } @@ -361,6 +373,7 @@ TEST_F(HiddenApiTest, InstanceMethodLightGreylistMatch) { OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetIMethodHiddenFlags(*dex_file)); } @@ -370,6 +383,7 @@ TEST_F(HiddenApiTest, InstanceMethodDarkGreylistMatch) { OpenStream(dark_greylist) << "LMain;->imethod(J)V" << std::endl; OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetIMethodHiddenFlags(*dex_file)); } @@ -379,6 +393,7 @@ TEST_F(HiddenApiTest, InstanceMethodBlacklistMatch) { OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->imethod(J)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetIMethodHiddenFlags(*dex_file)); } @@ -388,7 +403,7 @@ TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch1) { OpenStream(dark_greylist) << "LMain;->imethod(J)V" << std::endl; OpenStream(blacklist) << "LMain;->imethod(J)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetIMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch2) { @@ -397,7 +412,7 @@ TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch2) { OpenStream(dark_greylist) << "LMain;->imethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->imethod(J)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetIMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch3) { @@ -406,7 +421,7 @@ TEST_F(HiddenApiTest, InstanceMethodTwoListsMatch3) { OpenStream(dark_greylist) << "LMain;->imethod(J)V" << std::endl; OpenStream(blacklist) << "LMain;->imethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetIMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, StaticMethodNoMatch) { @@ -415,6 +430,7 @@ TEST_F(HiddenApiTest, StaticMethodNoMatch) { OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetSMethodHiddenFlags(*dex_file)); } @@ -424,6 +440,7 @@ TEST_F(HiddenApiTest, StaticMethodLightGreylistMatch) { OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetSMethodHiddenFlags(*dex_file)); } @@ -433,6 +450,7 @@ TEST_F(HiddenApiTest, StaticMethodDarkGreylistMatch) { OpenStream(dark_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl; OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSMethodHiddenFlags(*dex_file)); } @@ -442,6 +460,7 @@ TEST_F(HiddenApiTest, StaticMethodBlacklistMatch) { OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSMethodHiddenFlags(*dex_file)); } @@ -451,7 +470,7 @@ TEST_F(HiddenApiTest, StaticMethodTwoListsMatch1) { OpenStream(dark_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl; OpenStream(blacklist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, StaticMethodTwoListsMatch2) { @@ -460,7 +479,7 @@ TEST_F(HiddenApiTest, StaticMethodTwoListsMatch2) { OpenStream(dark_greylist) << "LMain;->smethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, StaticMethodTwoListsMatch3) { @@ -469,7 +488,7 @@ TEST_F(HiddenApiTest, StaticMethodTwoListsMatch3) { OpenStream(dark_greylist) << "LMain;->smethod(Ljava/lang/Object;)V" << std::endl; OpenStream(blacklist) << "LMain;->smethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, InstanceNativeMethodNoMatch) { @@ -478,6 +497,7 @@ TEST_F(HiddenApiTest, InstanceNativeMethodNoMatch) { OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetINMethodHiddenFlags(*dex_file)); } @@ -487,6 +507,7 @@ TEST_F(HiddenApiTest, InstanceNativeMethodLightGreylistMatch) { OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetINMethodHiddenFlags(*dex_file)); } @@ -496,6 +517,7 @@ TEST_F(HiddenApiTest, InstanceNativeMethodDarkGreylistMatch) { OpenStream(dark_greylist) << "LMain;->inmethod(C)V" << std::endl; OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetINMethodHiddenFlags(*dex_file)); } @@ -505,6 +527,7 @@ TEST_F(HiddenApiTest, InstanceNativeMethodBlacklistMatch) { OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->inmethod(C)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetINMethodHiddenFlags(*dex_file)); } @@ -514,7 +537,7 @@ TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch1) { OpenStream(dark_greylist) << "LMain;->inmethod(C)V" << std::endl; OpenStream(blacklist) << "LMain;->inmethod(C)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetINMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch2) { @@ -523,7 +546,7 @@ TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch2) { OpenStream(dark_greylist) << "LMain;->inmethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->inmethod(C)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetINMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch3) { @@ -532,7 +555,7 @@ TEST_F(HiddenApiTest, InstanceNativeMethodTwoListsMatch3) { OpenStream(dark_greylist) << "LMain;->inmethod(C)V" << std::endl; OpenStream(blacklist) << "LMain;->inmethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetINMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, StaticNativeMethodNoMatch) { @@ -541,6 +564,7 @@ TEST_F(HiddenApiTest, StaticNativeMethodNoMatch) { OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kWhitelist, GetSNMethodHiddenFlags(*dex_file)); } @@ -550,6 +574,7 @@ TEST_F(HiddenApiTest, StaticNativeMethodLightGreylistMatch) { OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kLightGreylist, GetSNMethodHiddenFlags(*dex_file)); } @@ -559,6 +584,7 @@ TEST_F(HiddenApiTest, StaticNativeMethodDarkGreylistMatch) { OpenStream(dark_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl; OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSNMethodHiddenFlags(*dex_file)); } @@ -568,6 +594,7 @@ TEST_F(HiddenApiTest, StaticNativeMethodBlacklistMatch) { OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); + ASSERT_NE(dex_file.get(), nullptr); ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSNMethodHiddenFlags(*dex_file)); } @@ -577,7 +604,7 @@ TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch1) { OpenStream(dark_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl; OpenStream(blacklist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSNMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch2) { @@ -586,7 +613,7 @@ TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch2) { OpenStream(dark_greylist) << "LMain;->snmethod(LBadType2;)V" << std::endl; OpenStream(blacklist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kBlacklist, GetSNMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch3) { @@ -595,7 +622,7 @@ TEST_F(HiddenApiTest, StaticNativeMethodTwoListsMatch3) { OpenStream(dark_greylist) << "LMain;->snmethod(Ljava/lang/Integer;)V" << std::endl; OpenStream(blacklist) << "LMain;->snmethod(LBadType3;)V" << std::endl; auto dex_file = RunHiddenApi(light_greylist, dark_greylist, blacklist, {}, &dex); - ASSERT_EQ(HiddenApiAccessFlags::kDarkGreylist, GetSNMethodHiddenFlags(*dex_file)); + ASSERT_EQ(dex_file.get(), nullptr); } } // namespace art |