zoukankan      html  css  js  c++  java
  • 设置-安全-手机加密功能解说

    设置-安全-手机加密功能解说

            此功能能够用来加密手机上的全部数据,包含 Google 帐户、应用数据、音乐和其它媒体信息、已下载的信息等。假设运行了加密操作,您每次开机时都必须输入数字 PIN 或password。
    请注意,上述 PIN 或password与您在未加密状态下解锁手机时所用的同样,无法单独设置。
    警告:加密操作无法撤消。要将手机恢复为未加密状态,唯一的方法是恢复出厂设置,但这会清除您的全部数据。
    假设您的手机遭窃,加密可提供额外保护,某些组织可能要求或建议使用加密。在启用加密前,请先咨询您的系统管理员。非常多情况下。您设置的加密 PIN 或password是由系统管理员控制的。


    在启用加密前,请做好下面准备:
    (1) 设置锁定屏幕 PIN 或password。

    (2) 为电池充电。
    (3) 为手机插上电源。

    (4) 安排一个小时或更长时间进行加密过程。切勿中断此过程,否则会丢失部分或所有数据。

    准备好启用加密后。请运行下面操作:
    (1) 在主屏幕或全部应用屏幕中,触摸设置图标
    (2) 依次触摸个人 > 安全 > 加密 > 加密手机
    (3) 请细致阅读关于加密的信息。

        假设您没有为电池充电或为手机插上电源。则无法使用加密手机button。假设您改变主意,不希望加密手机了,请触摸返回button。

    警告:中断加密过程会导致数据丢失。
    (4) 触摸加密手机
    (5) 输入锁定屏幕 PIN 或password,然后触摸继续

    (6) 再次触摸加密手机
    此时加密过程開始,屏幕上会显示其进度。

    加密过程可能须要一个小时或更长时间。在此期间。您的手机可能会多次又一次启动。

    加密完毕后,系统会提示您输入 PIN 或password。
    以后,您每次开机时都须要输入 PIN 或password才干解密。
    2、重置手机后。用户须要又一次输入首次设置手机时须要输入的同样信息。

    假设用户一直是将数据备份到 Google 帐户的,则可通过设置过程中的某个选项恢复这些数据。





    代码的解析:

    一、加密的几种状态


    http://osxr.org/android/source/frameworks/base/core/java/android/app/admin/DevicePolicyManager.java#1142 




    1117      * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
    1118      * indicating that encryption is not supported.
    1119      */
    1120     public static final int ENCRYPTION_STATUS_UNSUPPORTED = 0;
    1121 
    1122     /**
    1123      * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
    1124      * indicating that encryption is supported, but is not currently active.
    1125      */
    1126     public static final int ENCRYPTION_STATUS_INACTIVE = 1;
    1127 
    1128     /**
    1129      * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
    1130      * indicating that encryption is not currently active, but is currently
    1131      * being activated.  This is only reported by devices that support
    1132      * encryption of data and only when the storage is currently
    1133      * undergoing a process of becoming encrypted.  A device that must reboot and/or wipe data
    1134      * to become encrypted will never return this value.
    1135      */
    1136     public static final int ENCRYPTION_STATUS_ACTIVATING = 2;
    1137 
    1138     /**
    1139      * Result code for {@link #setStorageEncryption} and {@link #getStorageEncryptionStatus}:
    1140      * indicating that encryption is active.
    1141      */
    1142     public static final int ENCRYPTION_STATUS_ACTIVE = 3;




    二 、service的调用


    http://osxr.org/android/source/frameworks/base/services/java/com/android/server/DevicePolicyManagerService.java#2029 




    2023     /**
    2024      * Hook to low-levels:  Reporting the current status of encryption.
    2025      * @return A value such as {@link DevicePolicyManager#ENCRYPTION_STATUS_UNSUPPORTED} or
    2026      * {@link DevicePolicyManager#ENCRYPTION_STATUS_INACTIVE} or
    2027      * {@link DevicePolicyManager#ENCRYPTION_STATUS_ACTIVE}.
    2028      */
    2029     private int getEncryptionStatus() {
    2030         String status = SystemProperties.get("ro.crypto.state", "unsupported");
    2031         if ("encrypted".equalsIgnoreCase(status)) {
    2032             return DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE;
    2033         } else if ("unencrypted".equalsIgnoreCase(status)) {
    2034             return DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE;
    2035         } else {
    2036             return DevicePolicyManager.ENCRYPTION_STATUS_UNSUPPORTED;
    2037         }
    2038     }
    2039 




    三、最后调用 


    http://osxr.org/android/source/frameworks/base/services/java/com/android/server/DevicePolicyManagerService.java#2029
    2005     /**
    2006      * Get the current encryption status of the device.
    2007      */
    2008     public int getStorageEncryptionStatus() {
    2009         return getEncryptionStatus();


    2010     }






    四、settings的使用(一)


    http://osxr.org/android/source/packages/apps/Settings/src/com/android/settings/SecuritySettings.java#0145  


    0140         // Add options for device encryption
    0141         DevicePolicyManager dpm =
    0142                 (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
    0143 
    0144         if (UserId.myUserId() == 0) {
    0145             switch (dpm.getStorageEncryptionStatus()) {
    0146             case DevicePolicyManager.ENCRYPTION_STATUS_ACTIVE:
    0147                 // The device is currently encrypted.
    0148                 addPreferencesFromResource(R.xml.security_settings_encrypted);
    0149                 break;
    0150             case DevicePolicyManager.ENCRYPTION_STATUS_INACTIVE:
    0151                 // This device supports encryption but isn't encrypted.
    0152                 addPreferencesFromResource(R.xml.security_settings_unencrypted);
    0153                 break;
    0154             }
    0155         }






    四、setting的使用(二)




    0017 package com.android.settings;
    0018 
    0019 import android.app.Activity;
    0020 import android.app.Fragment;
    0021 import android.app.StatusBarManager;
    0022 import android.content.Context;
    0023 import android.content.Intent;
    0024 import android.os.Bundle;
    0025 import android.os.Handler;
    0026 import android.os.IBinder;
    0027 import android.os.ServiceManager;
    0028 import android.os.storage.IMountService;
    0029 import android.util.Log;
    0030 import android.view.LayoutInflater;
    0031 import android.view.View;
    0032 import android.view.ViewGroup;
    0033 import android.widget.Button;
    0034 
    0035 public class CryptKeeperConfirm extends Fragment {
    0036 
    0037     public static class Blank extends Activity {
    0038         private Handler mHandler = new Handler();
    0039 
    0040         @Override
    0041         public void onCreate(Bundle savedInstanceState) {
    0042             super.onCreate(savedInstanceState);
    0043 
    0044             setContentView(R.layout.crypt_keeper_blank);
    0045 
    0046             if (Utils.isMonkeyRunning()) {
    0047                 finish();
    0048             }
    0049 
    0050             StatusBarManager sbm = (StatusBarManager) getSystemService(Context.STATUS_BAR_SERVICE);
    0051             sbm.disable(StatusBarManager.DISABLE_EXPAND
    0052                     | StatusBarManager.DISABLE_NOTIFICATION_ICONS
    0053                     | StatusBarManager.DISABLE_NOTIFICATION_ALERTS
    0054                     | StatusBarManager.DISABLE_SYSTEM_INFO
    0055                     | StatusBarManager.DISABLE_HOME
    0056                     | StatusBarManager.DISABLE_RECENT
    0057                     | StatusBarManager.DISABLE_BACK);
    0058 
    0059             // Post a delayed message in 700 milliseconds to enable encryption.
    0060             // NOTE: The animation on this activity is set for 500 milliseconds
    0061             // I am giving it a little extra time to complete.
    0062             mHandler.postDelayed(new Runnable() {
    0063                 public void run() {
    0064                     IBinder service = ServiceManager.getService("mount");
    0065                     if (service == null) {
    0066                         Log.e("CryptKeeper", "Failed to find the mount service");
    0067                         finish();
    0068                         return;
    0069                     }
    0070 
    0071                     IMountService mountService = IMountService.Stub.asInterface(service);
    0072                     try {
    0073                         Bundle args = getIntent().getExtras();
    0074                         mountService.encryptStorage(args.getString("password"));
    0075                     } catch (Exception e) {
    0076                         Log.e("CryptKeeper", "Error while encrypting...", e);
    0077                     }
    0078                 }
    0079             }, 700);
    0080         }
    0081     }
    0082 
    0083     private View mContentView;
    0084     private Button mFinalButton;
    0085     private Button.OnClickListener mFinalClickListener = new Button.OnClickListener() {
    0086 
    0087         public void onClick(View v) {
    0088             if (Utils.isMonkeyRunning()) {
    0089                 return;
    0090             }
    0091 
    0092             Intent intent = new Intent(getActivity(), Blank.class);
    0093             intent.putExtras(getArguments());
    0094 
    0095             startActivity(intent);
    0096         }
    0097     };
    0098 
    0099     private void establishFinalConfirmationState() {
    0100         mFinalButton = (Button) mContentView.findViewById(R.id.execute_encrypt);
    0101         mFinalButton.setOnClickListener(mFinalClickListener);
    0102     }
    0103 
    0104     @Override
    0105     public View onCreateView(LayoutInflater inflater, ViewGroup container,
    0106             Bundle savedInstanceState) {
    0107         mContentView = inflater.inflate(R.layout.crypt_keeper_confirm, null);
    0108         establishFinalConfirmationState();
    0109         return mContentView;
    0110     }
    0111 }






    <string name="crypt_keeper_desc" product="tablet" msgid="3839235202103924154">"您能够加密自己的帐户、设置、已下载的应用及其数据、媒体和其它文件。加密平板电脑后。您每次开机时都须要输入数字 PIN 或password才干解密。取消加密的唯一方法就是恢复出厂设置。但这会清除平板电脑上的所有数据。" "加密过程须要 1 小时或更长时间。在開始加密前。电池必须有电,而且在加密完毕前必须一直连接电源。假设您中断加密过程。则会丢失部分或所有数据。"</string>




    <string name="crypt_keeper_button_text" product="default" msgid="2008346408473255519">"加密手机"</string>










    五、encryptStorage的来源


    http://osxr.org/android/source/frameworks/base/core/java/android/os/storage/IMountService.java#0628 




    public int encryptStorage(String password) throws RemoteException {
    0629                 Parcel _data = Parcel.obtain();
    0630                 Parcel _reply = Parcel.obtain();
    0631                 int _result;
    0632                 try {
    0633                     _data.writeInterfaceToken(DESCRIPTOR);
    0634                     _data.writeString(password);
    0635                     mRemote.transact(Stub.TRANSACTION_encryptStorage, _data, _reply, 0);
    0636                     _reply.readException();
    0637                     _result = _reply.readInt();
    0638                 } finally {
    0639                     _reply.recycle();
    0640                     _data.recycle();
    0641                 }
    0642                 return _result;
    0643             }
    0644 







    针对手机加密之后,不插SD卡,SHARED宏开启 是无法进行OTA升级的。所以对系统进行了优化,在检測到手机加密状态之后。把升级包copy到cache文件夹以下,然后进行升级。

    主要是在framework/base/.../os/ RecoverySystem.java 
    在调用installpackage(context,filepackage)里面进行 处理
    推断,删除Cache,拷贝文件。







  • 相关阅读:
    Uploadify & jQuery.imgAreaSelect 插件实现图片上传裁剪
    Web 开发者不可不知的15条编码原则
    ASP.net 判断上传文件类型的三种方法
    《JavaScript 实战》:实现图片幻滑动展示效果
    如何构建一个很棒网站页脚(Website Footer)
    机器为什么可以学习(1)---测试和训练过程
    机器什么时候可以学习(4) --- 学习的可能性(feasibility of learning)
    算法学习--二分查找的学习
    逻辑回归-监督学习
    线性回归—监督学习
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6984414.html
Copyright © 2011-2022 走看看