AndroidQ+ 手机搬家 微信等数据迁移方案
发布日期:2021-06-29 11:30:15 浏览次数:2 分类:技术文章

本文共 7893 字,大约阅读时间需要 26 分钟。

diff --git a/frameworks/base/core/java/android/content/pm/IPackageManager.aidl b/frameworks/base/core/java/android/content/pm/IPackageManager.aidl

index a7eecd7f43..71223d999a 100644
--- a/frameworks/base/core/java/android/content/pm/IPackageManager.aidl
+++ b/frameworks/base/core/java/android/content/pm/IPackageManager.aidl
@@ -468,6 +468,10 @@ interface IPackageManager {
      */
     void clearApplicationUserData(in String packageName, IPackageDataObserver observer, int userId);
 
+//zyf test satrt
+    void cpApplicationData(in String packageName,in String srcPath,
+                                         in String destPath,in int groupId, in int userId);
+//zyf test end
     /**
      * Clear the profile data of an application.
      * @param packageName The package name of the application whose profile data
diff --git a/frameworks/base/core/java/android/content/pm/PackageManager.java b/frameworks/base/core/java/android/content/pm/PackageManager.java
index e08f4a28e7..f4f47cbfd5 100644
--- a/frameworks/base/core/java/android/content/pm/PackageManager.java
+++ b/frameworks/base/core/java/android/content/pm/PackageManager.java
@@ -7388,4 +7388,15 @@ public abstract class PackageManager {
             "sendDeviceCustomizationReadyBroadcast not implemented in subclass");
     }
 
+    //zyf test start
+    /**
+     * @hide
+     */
+    public void  cpApplicationData(String packageName, String srcPath,
+                                   String destPath,  int groupId,  int userId){
+        throw new UnsupportedOperationException(
+                "cpApplicationData not implemented in subclass");
+    }
+    //zyf test end
+
 }
diff --git a/frameworks/base/services/core/java/com/android/server/pm/Installer.java b/frameworks/base/services/core/java/com/android/server/pm/Installer.java
index adcd19e9bb..d6edd5463b 100644
--- a/frameworks/base/services/core/java/com/android/server/pm/Installer.java
+++ b/frameworks/base/services/core/java/com/android/server/pm/Installer.java
@@ -210,6 +210,18 @@ public class Installer extends SystemService {
         }
     }
 
+    //zyf test start
+    public int copyDirFiles(String uuid, String srcPath , String destPath, int groupId, int userId) throws InstallerException {
+        if (!checkBeforeRemote()) return -1;
+        try {
+            mInstalld.copyDirFiles(uuid, srcPath, destPath , groupId, userId);
+        } catch (Exception e) {
+            throw InstallerException.from(e);
+        }
+        return 0;
+    }
+    //zyf test end
+
     public void destroyAppData(String uuid, String packageName, int userId, int flags,
             long ceDataInode) throws InstallerException {
         if (!checkBeforeRemote()) return;
diff --git a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
index e8d439d288..1503a1d871 100644
--- a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -20073,6 +20073,39 @@ public class PackageManagerService extends IPackageManager.Stub
         });
     }
 
+    //zyf test start
+    //void cpApplicationData(in String packageName,in String srcPath,
+    //                       in String destPath,in int groupId, in int userId);
+    @Override
+    public void cpApplicationData(final String packageName,final String srcPath,
+                                  final  String destPath, final int groupId, final int userId) {
+
+        final int callingUid = Binder.getCallingUid();
+
+
+
+        final PackageParser.Package pkg;
+        synchronized (mPackages) {
+            pkg = mPackages.get(packageName);
+        }
+        final String volumeUuid = pkg.volumeUuid;
+
+        mHandler.post(new Runnable() {
+            public void run() {
+                final boolean succeeded;
+                synchronized (mInstallLock) {
+                    try {
+                        mInstaller.copyDirFiles(volumeUuid, srcPath, destPath, groupId,
+                                userId);
+                    } catch (InstallerException e) {
+                        Slog.w(TAG, String.valueOf(e));
+                    }
+                }
+            } //end run
+        });
+    }
+    //zyf test end
+
     private boolean clearApplicationUserDataLIF(String packageName, int userId) {
         if (packageName == null) {
             Slog.w(TAG, "Attempt to delete null packageName.");
diff --git a/frameworks/native/cmds/installd/InstalldNativeService.cpp b/frameworks/native/cmds/installd/InstalldNativeService.cpp
index caac2e89a7..7655be2c99 100644
--- a/frameworks/native/cmds/installd/InstalldNativeService.cpp
+++ b/frameworks/native/cmds/installd/InstalldNativeService.cpp
@@ -623,6 +623,9 @@ binder::Status InstalldNativeService::clearAppData(const std::unique_ptr<std::st
             }
         }
     }
+    //zyf test start
+    //copy_dir_files("/data/data/com.tencent.mm/MicroMsg","/data/data/com.tencent.mm/MicroMsg_test",1000,1000);
+    //zyf test end
     return res;
 }
 
@@ -1033,7 +1036,8 @@ binder::Status InstalldNativeService::restoreAppDataSnapshot(
 }
 
 binder::Status InstalldNativeService::destroyAppDataSnapshot(
-        const std::unique_ptr<std::string> &volumeUuid, const std::string& packageName,
+        const std::unique_ptr<std::string> &volumeUuid,
+        const std::string& packageName,
         const int32_t user, const int64_t ceSnapshotInode, const int32_t snapshotId,
         int32_t storageFlags) {
     ENFORCE_UID(AID_SYSTEM);
@@ -2827,5 +2831,29 @@ binder::Status InstalldNativeService::migrateLegacyObbData() {
     return ok();
 }
 
+//zyf test start
+binder::Status InstalldNativeService::copyDirFiles(const std::unique_ptr<std::string>& uuid, const std::string& srcpath,const std::string& destpath, int32_t groupId,int32_t userId,
+                            int32_t* _aidl_return){
+    ENFORCE_UID(AID_SYSTEM);
+    CHECK_ARGUMENT_UUID(uuid);
+    std::lock_guard<std::recursive_mutex> lock(mLock);
+
+    const char* src = srcpath.c_str();
+    const char* dest = destpath.c_str();
+
+    //const char* uuid_ = uuid ? uuid->c_str() : nullptr;
+    binder::Status res = ok();
+    if (access(src, F_OK) == 0) {
+        *_aidl_return=copy_dir_files(src, dest, userId, groupId);
+        /*
+         if (copy_dir_files(srcname, dstname, uid, gid) != 0) {
+              SLOGE("Some files failed to copy");
+         }
+         */
+     }
+    return res;
+}
+//zyf test end
+
 }  // namespace installd
 }  // namespace android
diff --git a/frameworks/native/cmds/installd/InstalldNativeService.h b/frameworks/native/cmds/installd/InstalldNativeService.h
index 2b7bf33cbc..501ecf1d69 100644
--- a/frameworks/native/cmds/installd/InstalldNativeService.h
+++ b/frameworks/native/cmds/installd/InstalldNativeService.h
@@ -70,6 +70,7 @@ public:
             const std::string& packageName, const int32_t user, const int64_t ceSnapshotInode,
             const int32_t snapshotId, int32_t storageFlags);
 
+
     binder::Status getAppSize(const std::unique_ptr<std::string>& uuid,
             const std::vector<std::string>& packageNames, int32_t userId, int32_t flags,
             int32_t appId, const std::vector<int64_t>& ceDataInodes,
@@ -157,6 +158,11 @@ public:
 
     binder::Status migrateLegacyObbData();
 
+    //zyf test start
+     binder::Status copyDirFiles(const std::unique_ptr<std::string>& uuid, const std::string& srcpath,const std::string& destpath, int32_t groupId,int32_t userId,
+                            int32_t* _aidl_return);
+    //zyf test end
+
 private:
     std::recursive_mutex mLock;
 
diff --git a/frameworks/native/cmds/installd/binder/android/os/IInstalld.aidl b/frameworks/native/cmds/installd/binder/android/os/IInstalld.aidl
index 26e9984f11..299c62779c 100644
--- a/frameworks/native/cmds/installd/binder/android/os/IInstalld.aidl
+++ b/frameworks/native/cmds/installd/binder/android/os/IInstalld.aidl
@@ -37,6 +37,7 @@ interface IInstalld {
     long[] getAppSize(@nullable @utf8InCpp String uuid, in @utf8InCpp String[] packageNames,
             int userId, int flags, int appId, in long[] ceDataInodes,
             in @utf8InCpp String[] codePaths);
+
     long[] getUserSize(@nullable @utf8InCpp String uuid, int userId, int flags, in int[] appIds);
     long[] getExternalSize(@nullable @utf8InCpp String uuid, int userId, int flags, in int[] appIds);
 
@@ -113,6 +114,9 @@ interface IInstalld {
             int userId, long ceSnapshotInode, int snapshotId, int storageFlags);
 
     void migrateLegacyObbData();
+    //zyf test start
+    int copyDirFiles(@nullable @utf8InCpp String uuid , in @utf8InCpp String srcpath,in @utf8InCpp String destpath, int groupId,int userId);
+    //zyf test end
 
     const int FLAG_STORAGE_DE = 0x1;
     const int FLAG_STORAGE_CE = 0x2;

转载地址:https://blog.csdn.net/zyfzhangyafei/article/details/114919826 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:linux setfacl 继承父目录权限
下一篇:android 高斯模糊

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月21日 10时05分21秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

知乎:硬件和软件哪个吃香? 2019-04-29
中国深圳,600架无人机的盛典! 2019-04-29
干货分享 JVM 之第 3 篇 —— Java 内存结构相关 2019-04-29
干货分享 JVM 之第 4 篇 —— 掌握 Jmeter 压力测试工具,熟悉 Jconsole.exe 工具 2019-04-29
干货分享 JVM 之第 5 篇 —— 类加载器 2019-04-29
干货分享 JVM 之第 6 篇 —— SpringBoot2.0 框架性能调优 2019-04-29
基于 Hystrix 高并发服务限流第 1 篇 —— 必须了解的相关概念 2019-04-29
基于 Hystrix 高并发服务限流第 2 篇 —— 服务隔离(线程池隔离、信号量隔离) 2019-04-29
基于 Hystrix 高并发服务限流第 3 篇 —— 服务熔断、服务降级 2019-04-29
基于 Hystrix 高并发服务限流第 4 篇 —— 基于 Feign 实现服务熔断降级处理 2019-04-29
基于 Hystrix 高并发服务限流第 5 篇 —— Hystrix 监控 2019-04-29
Eureka 如何快速的、优雅的停止某个微服务 2019-04-29
Eureka 实现安全认证 2019-04-29
基于 Hystrix 高并发服务限流第 6 篇 —— 服务限流,基于 RateLimiter 实现 2019-04-29
Nginx 反向代理、负载均衡配置、Location正则表达式 2019-04-29
SpringBoot + WebSocket 实现前后端的收发消息 2019-04-29
SpringBoot 整合 JWT 实现统一认证 2019-04-29
SpringBoot 使用 CompletableFuture 实现非阻塞异步编程 2019-04-29
即刻就业:本科毕业如何快速高薪就业? 2019-04-29
即刻就业:java的应用程序有哪些,java程序有哪些编码规范,开发java应用程序有哪些步骤 2019-04-29