Merge changes I6da18cdb,I9de6ba64,I1af88c6d,I154783ff into sc-dev
* changes: idmap2: fix cpplint warnings OMS: include idmap data in dump idmap2: create in-memory FRRO before creating file OMS: update shell command --help
This commit is contained in:
committed by
Android (Google) Code Review
commit
dc628e77a1
@@ -15,4 +15,4 @@
|
|||||||
set noparent
|
set noparent
|
||||||
linelength=100
|
linelength=100
|
||||||
root=..
|
root=..
|
||||||
filter=+build/include_alpha,-runtime/references,-build/c++
|
filter=+build/include_alpha,-runtime/references,-build/c++,-build/include_alpha
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
#include "idmap2/CommandUtils.h"
|
||||||
#include "idmap2/Idmap.h"
|
#include "idmap2/Idmap.h"
|
||||||
#include "idmap2/Result.h"
|
#include "idmap2/Result.h"
|
||||||
#include "idmap2/SysTrace.h"
|
#include "idmap2/SysTrace.h"
|
||||||
|
|||||||
@@ -14,8 +14,10 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IDMAP2_IDMAP2_COMMAND_UTILS_H_
|
#ifndef IDMAP2_IDMAP2_COMMANDUTILS_H_
|
||||||
#define IDMAP2_IDMAP2_COMMAND_UTILS_H_
|
#define IDMAP2_IDMAP2_COMMANDUTILS_H_
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "idmap2/PolicyUtils.h"
|
#include "idmap2/PolicyUtils.h"
|
||||||
#include "idmap2/Result.h"
|
#include "idmap2/Result.h"
|
||||||
@@ -24,4 +26,4 @@ android::idmap2::Result<android::idmap2::Unit> Verify(
|
|||||||
const std::string& idmap_path, const std::string& target_path, const std::string& overlay_path,
|
const std::string& idmap_path, const std::string& target_path, const std::string& overlay_path,
|
||||||
const std::string& overlay_name, PolicyBitmask fulfilled_policies, bool enforce_overlayable);
|
const std::string& overlay_name, PolicyBitmask fulfilled_policies, bool enforce_overlayable);
|
||||||
|
|
||||||
#endif // IDMAP2_IDMAP2_COMMAND_UTILS_H_
|
#endif // IDMAP2_IDMAP2_COMMANDUTILS_H_
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "androidfw/ResourceTypes.h"
|
#include "androidfw/ResourceTypes.h"
|
||||||
|
|||||||
@@ -26,6 +26,8 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <ostream>
|
#include <ostream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "android-base/macros.h"
|
#include "android-base/macros.h"
|
||||||
#include "android-base/stringprintf.h"
|
#include "android-base/stringprintf.h"
|
||||||
@@ -33,6 +35,7 @@
|
|||||||
#include "idmap2/BinaryStreamVisitor.h"
|
#include "idmap2/BinaryStreamVisitor.h"
|
||||||
#include "idmap2/FileUtils.h"
|
#include "idmap2/FileUtils.h"
|
||||||
#include "idmap2/Idmap.h"
|
#include "idmap2/Idmap.h"
|
||||||
|
#include "idmap2/PrettyPrintVisitor.h"
|
||||||
#include "idmap2/Result.h"
|
#include "idmap2/Result.h"
|
||||||
#include "idmap2/SysTrace.h"
|
#include "idmap2/SysTrace.h"
|
||||||
|
|
||||||
@@ -45,6 +48,7 @@ using android::idmap2::FabricatedOverlayContainer;
|
|||||||
using android::idmap2::Idmap;
|
using android::idmap2::Idmap;
|
||||||
using android::idmap2::IdmapHeader;
|
using android::idmap2::IdmapHeader;
|
||||||
using android::idmap2::OverlayResourceContainer;
|
using android::idmap2::OverlayResourceContainer;
|
||||||
|
using android::idmap2::PrettyPrintVisitor;
|
||||||
using android::idmap2::TargetResourceContainer;
|
using android::idmap2::TargetResourceContainer;
|
||||||
using android::idmap2::utils::kIdmapCacheDir;
|
using android::idmap2::utils::kIdmapCacheDir;
|
||||||
using android::idmap2::utils::kIdmapFilePermissionMask;
|
using android::idmap2::utils::kIdmapFilePermissionMask;
|
||||||
@@ -262,17 +266,17 @@ Status Idmap2Service::createFabricatedOverlay(
|
|||||||
path.c_str(), uid));
|
path.c_str(), uid));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const auto frro = builder.Build();
|
||||||
|
if (!frro) {
|
||||||
|
return error(StringPrintf("failed to serialize '%s:%s': %s", overlay.packageName.c_str(),
|
||||||
|
overlay.overlayName.c_str(), frro.GetErrorMessage().c_str()));
|
||||||
|
}
|
||||||
// Persist the fabricated overlay.
|
// Persist the fabricated overlay.
|
||||||
umask(kIdmapFilePermissionMask);
|
umask(kIdmapFilePermissionMask);
|
||||||
std::ofstream fout(path);
|
std::ofstream fout(path);
|
||||||
if (fout.fail()) {
|
if (fout.fail()) {
|
||||||
return error("failed to open frro path " + path);
|
return error("failed to open frro path " + path);
|
||||||
}
|
}
|
||||||
const auto frro = builder.Build();
|
|
||||||
if (!frro) {
|
|
||||||
return error(StringPrintf("failed to serialize '%s:%s': %s", overlay.packageName.c_str(),
|
|
||||||
overlay.overlayName.c_str(), frro.GetErrorMessage().c_str()));
|
|
||||||
}
|
|
||||||
auto result = frro->ToBinaryStream(fout);
|
auto result = frro->ToBinaryStream(fout);
|
||||||
if (!result) {
|
if (!result) {
|
||||||
unlink(path.c_str());
|
unlink(path.c_str());
|
||||||
@@ -352,4 +356,24 @@ binder::Status Idmap2Service::deleteFabricatedOverlay(const std::string& overlay
|
|||||||
return ok();
|
return ok();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
binder::Status Idmap2Service::dumpIdmap(const std::string& overlay_path,
|
||||||
|
std::string* _aidl_return) {
|
||||||
|
assert(_aidl_return);
|
||||||
|
|
||||||
|
const auto idmap_path = Idmap::CanonicalIdmapPathFor(kIdmapCacheDir, overlay_path);
|
||||||
|
std::ifstream fin(idmap_path);
|
||||||
|
const auto idmap = Idmap::FromBinaryStream(fin);
|
||||||
|
fin.close();
|
||||||
|
if (!idmap) {
|
||||||
|
return error(idmap.GetErrorMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::stringstream stream;
|
||||||
|
PrettyPrintVisitor visitor(stream);
|
||||||
|
(*idmap)->accept(&visitor);
|
||||||
|
*_aidl_return = stream.str();
|
||||||
|
|
||||||
|
return ok();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace android::os
|
} // namespace android::os
|
||||||
|
|||||||
@@ -24,7 +24,9 @@
|
|||||||
#include <idmap2/ResourceContainer.h>
|
#include <idmap2/ResourceContainer.h>
|
||||||
#include <idmap2/Result.h>
|
#include <idmap2/Result.h>
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
namespace android::os {
|
namespace android::os {
|
||||||
|
|
||||||
@@ -60,6 +62,8 @@ class Idmap2Service : public BinderService<Idmap2Service>, public BnIdmap2 {
|
|||||||
binder::Status getFabricatedOverlayInfos(
|
binder::Status getFabricatedOverlayInfos(
|
||||||
std::vector<os::FabricatedOverlayInfo>* _aidl_return) override;
|
std::vector<os::FabricatedOverlayInfo>* _aidl_return) override;
|
||||||
|
|
||||||
|
binder::Status dumpIdmap(const std::string& overlay_path, std::string* _aidl_return) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// idmap2d is killed after a period of inactivity, so any information stored on this class should
|
// idmap2d is killed after a period of inactivity, so any information stored on this class should
|
||||||
// be able to be recalculated if idmap2 dies and restarts.
|
// be able to be recalculated if idmap2 dies and restarts.
|
||||||
|
|||||||
@@ -16,8 +16,8 @@
|
|||||||
|
|
||||||
package android.os;
|
package android.os;
|
||||||
|
|
||||||
import android.os.FabricatedOverlayInternal;
|
|
||||||
import android.os.FabricatedOverlayInfo;
|
import android.os.FabricatedOverlayInfo;
|
||||||
|
import android.os.FabricatedOverlayInternal;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @hide
|
* @hide
|
||||||
@@ -40,4 +40,5 @@ interface IIdmap2 {
|
|||||||
@nullable FabricatedOverlayInfo createFabricatedOverlay(in FabricatedOverlayInternal overlay);
|
@nullable FabricatedOverlayInfo createFabricatedOverlay(in FabricatedOverlayInternal overlay);
|
||||||
List<FabricatedOverlayInfo> getFabricatedOverlayInfos();
|
List<FabricatedOverlayInfo> getFabricatedOverlayInfos();
|
||||||
boolean deleteFabricatedOverlay(@utf8InCpp String path);
|
boolean deleteFabricatedOverlay(@utf8InCpp String path);
|
||||||
|
@utf8InCpp String dumpIdmap(@utf8InCpp String overlayApkPath);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,15 +14,17 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IDMAP2_INCLUDE_IDMAP2_FABRICATEDOVERLAY_H
|
#ifndef IDMAP2_INCLUDE_IDMAP2_FABRICATEDOVERLAY_H_
|
||||||
#define IDMAP2_INCLUDE_IDMAP2_FABRICATEDOVERLAY_H
|
#define IDMAP2_INCLUDE_IDMAP2_FABRICATEDOVERLAY_H_
|
||||||
|
|
||||||
#include <libidmap2/proto/fabricated_v1.pb.h>
|
#include <libidmap2/proto/fabricated_v1.pb.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "idmap2/ResourceContainer.h"
|
#include "idmap2/ResourceContainer.h"
|
||||||
#include "idmap2/Result.h"
|
#include "idmap2/Result.h"
|
||||||
@@ -68,7 +70,8 @@ struct FabricatedOverlay {
|
|||||||
Result<SerializedData*> InitializeData() const;
|
Result<SerializedData*> InitializeData() const;
|
||||||
Result<uint32_t> GetCrc() const;
|
Result<uint32_t> GetCrc() const;
|
||||||
|
|
||||||
FabricatedOverlay(pb::FabricatedOverlay&& overlay, std::optional<uint32_t> crc_from_disk = {});
|
explicit FabricatedOverlay(pb::FabricatedOverlay&& overlay,
|
||||||
|
std::optional<uint32_t> crc_from_disk = {});
|
||||||
|
|
||||||
pb::FabricatedOverlay overlay_pb_;
|
pb::FabricatedOverlay overlay_pb_;
|
||||||
std::optional<uint32_t> crc_from_disk_;
|
std::optional<uint32_t> crc_from_disk_;
|
||||||
@@ -102,4 +105,4 @@ struct FabricatedOverlayContainer : public OverlayResourceContainer {
|
|||||||
|
|
||||||
} // namespace android::idmap2
|
} // namespace android::idmap2
|
||||||
|
|
||||||
#endif // IDMAP2_INCLUDE_IDMAP2_FABRICATEDOVERLAY_H
|
#endif // IDMAP2_INCLUDE_IDMAP2_FABRICATEDOVERLAY_H_
|
||||||
|
|||||||
@@ -14,9 +14,10 @@
|
|||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef IDMAP2_INCLUDE_IDMAP2_RESOURCECONTAINER_H
|
#ifndef IDMAP2_INCLUDE_IDMAP2_RESOURCECONTAINER_H_
|
||||||
#define IDMAP2_INCLUDE_IDMAP2_RESOURCECONTAINER_H
|
#define IDMAP2_INCLUDE_IDMAP2_RESOURCECONTAINER_H_
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <variant>
|
#include <variant>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@@ -103,4 +104,4 @@ struct OverlayResourceContainer : public ResourceContainer {
|
|||||||
|
|
||||||
} // namespace android::idmap2
|
} // namespace android::idmap2
|
||||||
|
|
||||||
#endif // IDMAP2_INCLUDE_IDMAP2_RESOURCECONTAINER_H
|
#endif // IDMAP2_INCLUDE_IDMAP2_RESOURCECONTAINER_H_
|
||||||
|
|||||||
@@ -23,6 +23,10 @@
|
|||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <map>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
namespace android::idmap2 {
|
namespace android::idmap2 {
|
||||||
|
|
||||||
@@ -89,7 +93,7 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() {
|
|||||||
auto package = entries.find(package_name);
|
auto package = entries.find(package_name);
|
||||||
if (package == entries.end()) {
|
if (package == entries.end()) {
|
||||||
package = entries
|
package = entries
|
||||||
.insert(std::make_pair<>(
|
.insert(std::make_pair(
|
||||||
package_name, std::map<std::string, std::map<std::string, TargetValue>>()))
|
package_name, std::map<std::string, std::map<std::string, TargetValue>>()))
|
||||||
.first;
|
.first;
|
||||||
}
|
}
|
||||||
@@ -98,13 +102,13 @@ Result<FabricatedOverlay> FabricatedOverlay::Builder::Build() {
|
|||||||
if (type == package->second.end()) {
|
if (type == package->second.end()) {
|
||||||
type =
|
type =
|
||||||
package->second
|
package->second
|
||||||
.insert(std::make_pair<>(type_name.to_string(), std::map<std::string, TargetValue>()))
|
.insert(std::make_pair(type_name.to_string(), std::map<std::string, TargetValue>()))
|
||||||
.first;
|
.first;
|
||||||
}
|
}
|
||||||
|
|
||||||
auto entry = type->second.find(entry_name.to_string());
|
auto entry = type->second.find(entry_name.to_string());
|
||||||
if (entry == type->second.end()) {
|
if (entry == type->second.end()) {
|
||||||
entry = type->second.insert(std::make_pair<>(entry_name.to_string(), TargetValue())).first;
|
entry = type->second.insert(std::make_pair(entry_name.to_string(), TargetValue())).first;
|
||||||
}
|
}
|
||||||
|
|
||||||
entry->second = TargetValue{res_entry.data_type, res_entry.data_value};
|
entry->second = TargetValue{res_entry.data_type, res_entry.data_value};
|
||||||
@@ -299,4 +303,4 @@ Result<std::string> FabContainer::GetResourceName(ResourceId /* id */) const {
|
|||||||
return Error("Fabricated overlay does not contain resources.");
|
return Error("Fabricated overlay does not contain resources.");
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace android::idmap2
|
} // namespace android::idmap2
|
||||||
|
|||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include <istream>
|
#include <istream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
#include "android-base/macros.h"
|
#include "android-base/macros.h"
|
||||||
#include "android-base/stringprintf.h"
|
#include "android-base/stringprintf.h"
|
||||||
|
|||||||
@@ -18,6 +18,8 @@
|
|||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstdarg>
|
#include <cstdarg>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
#include "android-base/macros.h"
|
#include "android-base/macros.h"
|
||||||
#include "android-base/stringprintf.h"
|
#include "android-base/stringprintf.h"
|
||||||
|
|||||||
@@ -16,6 +16,11 @@
|
|||||||
|
|
||||||
#include "idmap2/ResourceContainer.h"
|
#include "idmap2/ResourceContainer.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <utility>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "androidfw/ApkAssets.h"
|
#include "androidfw/ApkAssets.h"
|
||||||
#include "androidfw/AssetManager.h"
|
#include "androidfw/AssetManager.h"
|
||||||
#include "androidfw/Util.h"
|
#include "androidfw/Util.h"
|
||||||
@@ -445,4 +450,4 @@ Result<std::unique_ptr<OverlayResourceContainer>> OverlayResourceContainer::From
|
|||||||
return std::unique_ptr<OverlayResourceContainer>(result->release());
|
return std::unique_ptr<OverlayResourceContainer>(result->release());
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace android::idmap2
|
} // namespace android::idmap2
|
||||||
|
|||||||
@@ -17,6 +17,7 @@
|
|||||||
#include "idmap2/ResourceUtils.h"
|
#include "idmap2/ResourceUtils.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "androidfw/StringPiece.h"
|
#include "androidfw/StringPiece.h"
|
||||||
#include "androidfw/Util.h"
|
#include "androidfw/Util.h"
|
||||||
|
|||||||
@@ -19,6 +19,7 @@
|
|||||||
#include <idmap2/FabricatedOverlay.h>
|
#include <idmap2/FabricatedOverlay.h>
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
namespace android::idmap2 {
|
namespace android::idmap2 {
|
||||||
|
|
||||||
@@ -135,4 +136,4 @@ TEST(FabricatedOverlayTests, SerializeAndDeserialize) {
|
|||||||
EXPECT_EQ(Res_value::TYPE_INT_DEC, entry->data_type);
|
EXPECT_EQ(Res_value::TYPE_INT_DEC, entry->data_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace android::idmap2
|
} // namespace android::idmap2
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ TEST(IdmapTests, IdmapFailParsingDifferentVersion) {
|
|||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
stream << android::kIdmapMagic;
|
stream << android::kIdmapMagic;
|
||||||
stream << 0xffffffffU;
|
stream << 0xffffffffU;
|
||||||
stream << std::string(kJunkSize, (char)0xffU);
|
stream << std::string(kJunkSize, static_cast<char>(0xffU));
|
||||||
ASSERT_FALSE(Idmap::FromBinaryStream(stream));
|
ASSERT_FALSE(Idmap::FromBinaryStream(stream));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ TEST(IdmapTests, IdmapFailParsingDifferentMagic) {
|
|||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
stream << 0xffffffffU;
|
stream << 0xffffffffU;
|
||||||
stream << android::kIdmapCurrentVersion;
|
stream << android::kIdmapCurrentVersion;
|
||||||
stream << std::string(kJunkSize, (char)0xffU);
|
stream << std::string(kJunkSize, static_cast<char>(0xffU));
|
||||||
ASSERT_FALSE(Idmap::FromBinaryStream(stream));
|
ASSERT_FALSE(Idmap::FromBinaryStream(stream));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,8 +66,8 @@ namespace R::overlay {
|
|||||||
constexpr ResourceId str1 = 0x7f02000b;
|
constexpr ResourceId str1 = 0x7f02000b;
|
||||||
constexpr ResourceId str3 = 0x7f02000c;
|
constexpr ResourceId str3 = 0x7f02000c;
|
||||||
constexpr ResourceId str4 = 0x7f02000d;
|
constexpr ResourceId str4 = 0x7f02000d;
|
||||||
}
|
} // namespace string
|
||||||
}
|
} // namespace R::overlay
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
} // namespace android::idmap2
|
} // namespace android::idmap2
|
||||||
|
|||||||
@@ -170,6 +170,16 @@ class IdmapDaemon {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String dumpIdmap(@NonNull String overlayPath) {
|
||||||
|
try (Connection c = connect()) {
|
||||||
|
String dump = mService.dumpIdmap(overlayPath);
|
||||||
|
return TextUtils.nullIfEmpty(dump);
|
||||||
|
} catch (Exception e) {
|
||||||
|
Slog.wtf(TAG, "failed to dump idmap", e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private IBinder getIdmapService() throws TimeoutException, RemoteException {
|
private IBinder getIdmapService() throws TimeoutException, RemoteException {
|
||||||
SystemService.start(IDMAP_DAEMON);
|
SystemService.start(IDMAP_DAEMON);
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,6 @@ import static com.android.server.om.OverlayManagerService.TAG;
|
|||||||
import android.annotation.NonNull;
|
import android.annotation.NonNull;
|
||||||
import android.content.om.OverlayInfo;
|
import android.content.om.OverlayInfo;
|
||||||
import android.content.om.OverlayableInfo;
|
import android.content.om.OverlayableInfo;
|
||||||
import android.content.pm.PackageParser;
|
|
||||||
import android.os.Build.VERSION_CODES;
|
import android.os.Build.VERSION_CODES;
|
||||||
import android.os.FabricatedOverlayInfo;
|
import android.os.FabricatedOverlayInfo;
|
||||||
import android.os.FabricatedOverlayInternal;
|
import android.os.FabricatedOverlayInternal;
|
||||||
@@ -141,6 +140,14 @@ final class IdmapManager {
|
|||||||
return mIdmapDaemon.deleteFabricatedOverlay(path);
|
return mIdmapDaemon.deleteFabricatedOverlay(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the idmap data associated with an overlay, in dump format.
|
||||||
|
* Only indented for debugging.
|
||||||
|
*/
|
||||||
|
String dumpIdmap(@NonNull String overlayPath) {
|
||||||
|
return mIdmapDaemon.dumpIdmap(overlayPath);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks if overlayable and policies should be enforced on the specified overlay for backwards
|
* Checks if overlayable and policies should be enforced on the specified overlay for backwards
|
||||||
* compatibility with pre-Q overlays.
|
* compatibility with pre-Q overlays.
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import static android.content.om.OverlayInfo.STATE_MISSING_TARGET;
|
|||||||
import static android.content.om.OverlayInfo.STATE_NO_IDMAP;
|
import static android.content.om.OverlayInfo.STATE_NO_IDMAP;
|
||||||
import static android.content.om.OverlayInfo.STATE_OVERLAY_IS_BEING_REPLACED;
|
import static android.content.om.OverlayInfo.STATE_OVERLAY_IS_BEING_REPLACED;
|
||||||
import static android.content.om.OverlayInfo.STATE_TARGET_IS_BEING_REPLACED;
|
import static android.content.om.OverlayInfo.STATE_TARGET_IS_BEING_REPLACED;
|
||||||
|
import static android.os.UserHandle.USER_SYSTEM;
|
||||||
|
|
||||||
import static com.android.server.om.OverlayManagerService.DEBUG;
|
import static com.android.server.om.OverlayManagerService.DEBUG;
|
||||||
import static com.android.server.om.OverlayManagerService.TAG;
|
import static com.android.server.om.OverlayManagerService.TAG;
|
||||||
@@ -38,6 +39,7 @@ import android.os.FabricatedOverlayInternal;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
|
import android.util.Pair;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
|
|
||||||
import com.android.internal.content.om.OverlayConfig;
|
import com.android.internal.content.om.OverlayConfig;
|
||||||
@@ -682,8 +684,38 @@ final class OverlayManagerServiceImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void dump(@NonNull final PrintWriter pw, @NonNull DumpState dumpState) {
|
void dump(@NonNull final PrintWriter pw, @NonNull DumpState dumpState) {
|
||||||
|
Pair<OverlayIdentifier, String> overlayIdmap = null;
|
||||||
|
if (dumpState.getPackageName() != null) {
|
||||||
|
OverlayIdentifier id = new OverlayIdentifier(dumpState.getPackageName(),
|
||||||
|
dumpState.getOverlayName());
|
||||||
|
OverlayInfo oi = mSettings.getNullableOverlayInfo(id, USER_SYSTEM);
|
||||||
|
if (oi != null) {
|
||||||
|
overlayIdmap = new Pair<>(id, oi.baseCodePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// settings
|
||||||
mSettings.dump(pw, dumpState);
|
mSettings.dump(pw, dumpState);
|
||||||
if (dumpState.getPackageName() == null) {
|
|
||||||
|
// idmap data
|
||||||
|
if (dumpState.getField() == null) {
|
||||||
|
Set<Pair<OverlayIdentifier, String>> allIdmaps = (overlayIdmap != null)
|
||||||
|
? Set.of(overlayIdmap) : mSettings.getAllIdentifiersAndBaseCodePaths();
|
||||||
|
for (Pair<OverlayIdentifier, String> pair : allIdmaps) {
|
||||||
|
pw.println("IDMAP OF " + pair.first);
|
||||||
|
String dump = mIdmapManager.dumpIdmap(pair.second);
|
||||||
|
if (dump != null) {
|
||||||
|
pw.println(dump);
|
||||||
|
} else {
|
||||||
|
OverlayInfo oi = mSettings.getNullableOverlayInfo(pair.first, USER_SYSTEM);
|
||||||
|
pw.println((oi != null && !mIdmapManager.idmapExists(oi))
|
||||||
|
? "<missing idmap>" : "<internal error>");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// default overlays
|
||||||
|
if (overlayIdmap == null) {
|
||||||
pw.println("Default overlays: " + TextUtils.join(";", mDefaultOverlays));
|
pw.println("Default overlays: " + TextUtils.join(";", mDefaultOverlays));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import android.content.om.OverlayInfo;
|
|||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
|
import android.util.Pair;
|
||||||
import android.util.Slog;
|
import android.util.Slog;
|
||||||
import android.util.TypedXmlPullParser;
|
import android.util.TypedXmlPullParser;
|
||||||
import android.util.TypedXmlSerializer;
|
import android.util.TypedXmlSerializer;
|
||||||
@@ -205,6 +206,12 @@ final class OverlayManagerSettings {
|
|||||||
return paths;
|
return paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Set<Pair<OverlayIdentifier, String>> getAllIdentifiersAndBaseCodePaths() {
|
||||||
|
final Set<Pair<OverlayIdentifier, String>> set = new ArraySet<>();
|
||||||
|
mItems.forEach(item -> set.add(new Pair(item.mOverlay, item.mBaseCodePath)));
|
||||||
|
return set;
|
||||||
|
}
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
List<OverlayInfo> removeIf(@NonNull final Predicate<OverlayInfo> predicate, final int userId) {
|
List<OverlayInfo> removeIf(@NonNull final Predicate<OverlayInfo> predicate, final int userId) {
|
||||||
return removeIf(info -> (predicate.test(info) && info.userId == userId));
|
return removeIf(info -> (predicate.test(info) && info.userId == userId));
|
||||||
|
|||||||
@@ -35,12 +35,9 @@ import android.os.ShellCommand;
|
|||||||
import android.os.UserHandle;
|
import android.os.UserHandle;
|
||||||
import android.util.TypedValue;
|
import android.util.TypedValue;
|
||||||
|
|
||||||
import com.android.internal.util.ArrayUtils;
|
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -103,9 +100,8 @@ final class OverlayManagerShellCommand extends ShellCommand {
|
|||||||
out.println(" Print debugging information about the overlay manager.");
|
out.println(" Print debugging information about the overlay manager.");
|
||||||
out.println(" With optional parameters PACKAGE and NAME, limit output to the specified");
|
out.println(" With optional parameters PACKAGE and NAME, limit output to the specified");
|
||||||
out.println(" overlay or target. With optional parameter FIELD, limit output to");
|
out.println(" overlay or target. With optional parameter FIELD, limit output to");
|
||||||
out.println(" the value of that SettingsItem field. Field names are");
|
out.println(" the corresponding SettingsItem field. Field names are all lower case");
|
||||||
out.println(" case insensitive and out.println the m prefix can be omitted,");
|
out.println(" and omit the m prefix, i.e. 'userid' for SettingsItem.mUserId.");
|
||||||
out.println(" so the following are equivalent: mState, mstate, State, state.");
|
|
||||||
out.println(" list [--user USER_ID] [PACKAGE[:NAME]]");
|
out.println(" list [--user USER_ID] [PACKAGE[:NAME]]");
|
||||||
out.println(" Print information about target and overlay packages.");
|
out.println(" Print information about target and overlay packages.");
|
||||||
out.println(" Overlay packages are printed in priority order. With optional");
|
out.println(" Overlay packages are printed in priority order. With optional");
|
||||||
@@ -129,6 +125,11 @@ final class OverlayManagerShellCommand extends ShellCommand {
|
|||||||
out.println(" Load a package and print the value of a given resource");
|
out.println(" Load a package and print the value of a given resource");
|
||||||
out.println(" applying the current configuration and enabled overlays.");
|
out.println(" applying the current configuration and enabled overlays.");
|
||||||
out.println(" For a more fine-grained alternative, use 'idmap2 lookup'.");
|
out.println(" For a more fine-grained alternative, use 'idmap2 lookup'.");
|
||||||
|
out.println(" fabricate [--user USER_ID] [--target-name OVERLAYABLE] --target PACKAGE");
|
||||||
|
out.println(" --name NAME PACKAGE:TYPE/NAME ENCODED-TYPE-ID ENCODED-VALUE");
|
||||||
|
out.println(" Create an overlay from a single resource. Caller must be root. Example:");
|
||||||
|
out.println(" fabricate --target android --name LighterGray \\");
|
||||||
|
out.println(" android:color/lighter_gray 0x1c 0xffeeeeee");
|
||||||
}
|
}
|
||||||
|
|
||||||
private int runList() throws RemoteException {
|
private int runList() throws RemoteException {
|
||||||
|
|||||||
Reference in New Issue
Block a user