{"id":1130,"date":"2014-11-05T23:18:20","date_gmt":"2014-11-05T15:18:20","guid":{"rendered":"http:\/\/blog.qdac.cc\/?p=1130"},"modified":"2015-04-15T16:16:15","modified_gmt":"2015-04-15T08:16:15","slug":"delphi%e7%bc%96%e5%86%99%e7%9a%84android%e7%a8%8b%e5%ba%8f%e8%8e%b7%e5%8f%96root%e6%9d%83%e9%99%90%e5%ae%9e%e7%8e%b0","status":"publish","type":"post","link":"https:\/\/blog.qdac.cc\/?p=1130","title":{"rendered":"Delphi\u7f16\u5199\u7684Android\u7a0b\u5e8f\u83b7\u53d6Root\u6743\u9650\u5b9e\u73b0(2015.4.15\u66f4\u65b0\uff0c\u652f\u6301Android 4.4)"},"content":{"rendered":"<p>\u501f\u52a9\u8c37\u6b4c\uff0c\u5e76\u7ecf\u8fc7\u672c\u5927\u4fa0\u65bd\u5c55\u5751\u3001\u8499\u3001\u62d0\u3001\u9a97\u3001\u5077\u4e94\u5927\u7edd\u6280\uff0c\u7ec8\u4e8e\u6210\u529f\u5b9e\u73b0\u5728Delphi\u4e0b\u83b7\u53d6Root\u6743\u9650\u5e76\u5c06\u5176\u6269\u5c55\u4e3a\u4e00\u4e2a\u5b8c\u6574\u529f\u80fd\u66f4\u52a0\u5b8c\u6574\u7684TQAndroidShell\u8bb0\u5f55\uff0c\u5728\u534e\u4e3a\u8363\u80002\uff08Android 4.2\uff09\u3001Nubia Z5S\uff08Android 4.4\uff09\u6d4b\u8bd5\u901a\u8fc7\u3002\u53c2\u8003\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre class=\"lang:delphi decode:true\">unit QAndroid.Shell;\r\n\r\ninterface\r\n\r\n{\r\n  \u672c\u6e90\u7801\u6765\u81eaQDAC\u9879\u76ee\uff0c\u7248\u6743\u5f52swish(QQ:109867294)\u6240\u6709\u3002\r\n  (1)\u3001\u4f7f\u7528\u8bb8\u53ef\u53ca\u9650\u5236\r\n  \u60a8\u53ef\u4ee5\u81ea\u7531\u590d\u5236\u3001\u5206\u53d1\u3001\u4fee\u6539\u672c\u6e90\u7801\uff0c\u4f46\u60a8\u7684\u4fee\u6539\u5e94\u8be5\u53cd\u9988\u7ed9\u4f5c\u8005\uff0c\u5e76\u5141\u8bb8\u4f5c\u8005\u5728\u5fc5\u8981\u65f6\uff0c\r\n  \u5408\u5e76\u5230\u672c\u9879\u76ee\u4e2d\u4ee5\u4f9b\u4f7f\u7528\uff0c\u5408\u5e76\u540e\u7684\u6e90\u7801\u540c\u6837\u9075\u5faaQDAC\u7248\u6743\u58f0\u660e\u9650\u5236\u3002\r\n  \u60a8\u7684\u4ea7\u54c1\u7684\u5173\u4e8e\u4e2d\uff0c\u5e94\u5305\u542b\u4ee5\u4e0b\u7684\u7248\u672c\u58f0\u660e:\r\n  \u672c\u4ea7\u54c1\u4f7f\u7528\u7684QAndroidShell\u6765\u81eaQDAC\u9879\u76ee\uff0c\u7248\u6743\u5f52\u4f5c\u8005\u6240\u6709\u3002\r\n  (2)\u3001\u6280\u672f\u652f\u6301\r\n  \u6709\u6280\u672f\u95ee\u9898\uff0c\u60a8\u53ef\u4ee5\u52a0\u5165QDAC\u5b98\u65b9QQ\u7fa4250530692\u5171\u540c\u63a2\u8ba8\u3002\r\n  (3)\u3001\u8d5e\u52a9\r\n  \u60a8\u53ef\u4ee5\u81ea\u7531\u4f7f\u7528\u672c\u6e90\u7801\u800c\u4e0d\u9700\u8981\u652f\u4ed8\u4efb\u4f55\u8d39\u7528\u3002\u5982\u679c\u60a8\u89c9\u5f97\u672c\u6e90\u7801\u5bf9\u60a8\u6709\u5e2e\u52a9\uff0c\u60a8\u53ef\u4ee5\u8d5e\r\n  \u52a9\u672c\u9879\u76ee\uff08\u975e\u5f3a\u5236\uff09\uff0c\u4ee5\u4f7f\u4f5c\u8005\u4e0d\u4e3a\u751f\u6d3b\u6240\u8feb\uff0c\u6709\u66f4\u591a\u7684\u7cbe\u529b\u4e3a\u60a8\u5448\u73b0\u66f4\u597d\u7684\u4f5c\u54c1\uff1a\r\n  \u8d5e\u52a9\u65b9\u5f0f\uff1a\r\n  \u652f\u4ed8\u5b9d\uff1a guansonghuan@sina.com \u59d3\u540d\uff1a\u7ba1\u8038\u5bf0\r\n  \u5efa\u8bbe\u94f6\u884c\uff1a\r\n  \u6237\u540d\uff1a\u7ba1\u8038\u5bf0\r\n  \u8d26\u53f7\uff1a4367 4209 4324 0179 731\r\n  \u5f00\u6237\u884c\uff1a\u5efa\u8bbe\u94f6\u884c\u957f\u6625\u56e2\u98ce\u50a8\u84c4\u6240\r\n}\r\n{\r\n  \u672c\u5355\u5143\u5b9e\u73b0\u4e86\u4e00\u4e2a\u4f2a\u7684Shell\uff0c\u53ef\u4ee5\u7528\u4e8e\u5728Android\u7a0b\u5e8f\u4e2d\u6267\u884cShell\u547d\u4ee4\uff0c\u5982\u679c\u9700\u8981Root\u6743\u9650\uff0c\r\n  \u5219\u5728\u6267\u884c\u524d\uff0c\u8c03\u7528AskForRoot\u65b9\u6cd5\u6765\u83b7\u53d6\u7528\u6237\u7684Root\u6388\u6743\uff0c\u5982\u679c\u4e0d\u518d\u9700\u8981\u5728Root\u8d26\u53f7\u4e0b\u6267\u884c\r\n  \u547d\u4ee4\uff0c\u5219\u8c03\u7528ExitRoot\u65b9\u6cd5\u6765\u9000\u51faRoot\u8d26\u53f7\u8fd4\u56de\u666e\u901a\u8d26\u53f7\u6a21\u5f0f\u3002\r\n  1\u3001\u8c03\u7528TQAndroidShell.Initialize\u65b9\u6cd5\u6765\u521d\u59cb\u5316\u5f53\u524d\u5b9e\u4f8b\r\n  AShell.Initialize;\r\n  2\u3001\u5982\u679c\u9700\u8981Root\u6743\u9650\u6267\u884c\u67d0\u4e9b\u547d\u4ee4\uff0c\u8c03\u7528TQAndroidShell.AskForRoot\u83b7\u5f97Root\u6743\u9650\uff0c\u5426\u5219\u5ffd\u7565\u6b64\u6b65\u9aa4\r\n  if AShell.AskForRoot then\r\n  begin\r\n  ...\r\n  end\r\n  else \/\/\u8fdb\u5165\u5931\u8d25\uff0c\u624b\u673a\u672aRoot\u6216\u8005\u7528\u6237\u62d2\u7edd\u7ed9\u4e88Root\u6743\u9650\r\n  ...;\r\n  3\u3001\u8c03\u7528Execute\u65b9\u6cd5\u6765\u6267\u884c\u547d\u4ee4\u884c\u5e76\u83b7\u5f97\u8fd4\u56de\u7684\u7ed3\u679c\r\n  AShell.Execute('ls \/proc -l');\r\n  4\u3001\u5982\u679c\u8981\u5207\u6362\u56de\u666e\u901a\u8d26\u53f7\u6a21\u5f0f\uff0c\u8c03\u7528AShell.ExitRoot\u6765\u8fd4\u56de\u5f53\u524d\u666e\u901a\u8d26\u53f7\u6a21\u5f0f\r\n  \u3010\u6ce8\u610f\u3011TQAndroidShell\u662f\u4e00\u4e2a\u8bb0\u5f55\uff0c\u4e0d\u9700\u8981\u624b\u5de5\u91ca\u653e\uff08\u9664\u975e\u4f60\u662fNew\u751f\u6210\u7684\uff09\r\n\r\n}\r\n\r\nuses System.SysUtils, System.Diagnostics, Androidapi.Jni,\r\n  Androidapi.JNIBridge,\r\n  Androidapi.Jni.GraphicsContentViewText,\r\n  Androidapi.Jni.JavaTypes,\r\n  Androidapi.Helpers,\r\n  FMX.Helpers.Android, FMX.Forms, FMX.Dialogs, qstring;\r\n\r\ntype\r\n  PQAndroidShell = ^TQAndroidShell;\r\n\r\n  TQAndroidShell = record\r\n  private\r\n    FRuntime: JObject;\r\n    FProcess: JObject;\r\n    FInRoot: Boolean;\r\n    function GetIsRooted: Boolean;\r\n    function InternalReadReply(AProcess: JObject; ATimeout: Cardinal): QStringW;\r\n    \/\/\/ &lt;summary&gt;\u53d1\u9001\u4e00\u4e2a\u547d\u4ee4\u884c&lt;\/summary&gt;\r\n    \/\/\/ &lt;param name=\"ACmdline\"&gt;\u8981\u53d1\u9001\u7684\u547d\u4ee4\u884c\u5185\u5bb9&lt;\/param&gt;\r\n    \/\/\/ &lt;returns&gt;\u6210\u529f\uff0c\u8fd4\u56detrue\uff0c\u5931\u8d25\uff0c\u8fd4\u56defalse&lt;\/returns&gt;\r\n    \/\/\/ &lt;remarks&gt;\u4ec5\u7528\u4e8eRoot\u6a21\u5f0f\u4e0b&lt;\/remarks&gt;\r\n    function SendCmd(const ACmdline: QStringW): Boolean;\r\n    function ReadReply(ATimeout: Cardinal = INFINITE): QStringW;\r\n  public\r\n    \/\/\/ &lt;summary&gt;\u521d\u59cb\u5316\u51fd\u6570\uff0c\u7528\u4e8e\u521d\u59cb\u5316\u4e00\u4e2aTQAndroidShell\u5b9e\u4f8b&lt;\/summary&gt;\r\n    \/\/\/ &lt;returns&gt;\u8fd4\u56de\u5f53\u524d\u8bb0\u5f55\u7684\u6307\u9488&lt;\/returns&gt;\r\n    function Initliaize: PQAndroidShell;\r\n    \/\/\/ &lt;summary&gt;\u8bf7\u6c42Root\u6743\u9650\u4ee5\u8fdb\u5165Root\u8d26\u53f7\u51c6\u5907\u6267\u884c\u540e\u7eed\u7684\u547d\u4ee4&lt;\/summary&gt;\r\n    \/\/\/ &lt;returns&gt;\u6210\u529f\uff0c\u8fd4\u56deTrue\uff0c\u5931\u8d25\uff0c\u8fd4\u56deFalse&lt;\/returns&gt;\r\n    \/\/\/ &lt;remarks&gt;\u5982\u679c\u5931\u8d25\uff0c\u4e00\u822c\u6709\u4e24\u79cd\u53ef\u80fd\uff1a\r\n    \/\/\/ 1\u3001\u8bbe\u5907\u672aRoot\uff0c\u6b64\u65f6IsRooted\u5c5e\u6027\u4e3aFalse\uff1b\r\n    \/\/\/ 2\u3001\u7528\u6237\u62d2\u7edd\u6388\u6743\r\n    \/\/\/ &lt;\/remarks&gt;\r\n    function AskForRoot: Boolean;\r\n    \/\/\/ &lt;summary&gt;\u6267\u884c\u6307\u5b9a\u7684\u547d\u4ee4\u884c\u5e76\u7b49\u5f85\u8fd4\u56de&lt;\/summary&gt;\r\n    \/\/\/ &lt;param name=\"ACmdline\"&gt;\u547d\u4ee4\u884c\u5185\u5bb9&lt;\/param&gt;\r\n    \/\/\/ &lt;param name=\"ATimeout\"&gt;\u7b49\u5f85\u547d\u4ee4\u6267\u884c\u524d\u7b49\u5f85\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2&lt;\/param&gt;\r\n    \/\/\/ &lt;returns&gt;\u8fd4\u56de\u547d\u4ee4\u884c\u7684\u8f93\u51fa\u7ed3\u679c&lt;\/returns&gt;\r\n    function Execute(const ACmdline: QStringW; ATimeout: Cardinal = INFINITE)\r\n      : QStringW;\r\n    \/\/\/ &lt;summary&gt;\u9000\u51faRoot\u6a21\u5f0f&lt;\/summary&gt;\r\n    \/\/\/ &lt;remarks&gt;\u5982\u679c\u672a\u5904\u4e8eRoot\u6a21\u5f0f\uff0c\u4ec0\u4e48\u4e5f\u4e0d\u4f1a\u53d1\u751f&lt;\/remarks&gt;\r\n    procedure ExitRoot;\r\n    \/\/\/ &lt;summary&gt;\u5f53\u524d\u662f\u5426\u5904\u4e8eRoot\u6a21\u5f0f&lt;\/summary&gt;\r\n    property InRoot: Boolean read FInRoot;\r\n    \/\/\/ &lt;summary&gt;\u5f53\u524d\u8bbe\u5907\u662f\u5426\u5df2\u7ecfRoot\u8fc7\u4e86&lt;\/summary&gt;\r\n    property IsRooted: Boolean read GetIsRooted;\r\n  end;\r\n\r\nimplementation\r\n\r\ntype\r\n  JProcess = interface;\r\n  JRuntime = interface;\r\n\r\n  \/\/ ----------------------------------JProcess----------------------\r\n  JProcessClass = interface(JObjectClass)\r\n    ['{7BFD2CCB-89B6-4382-A00B-A7B5BB0BC7C9}']\r\n\r\n  end;\r\n\r\n  [JavaSignature('java\/lang\/Process')]\r\n  JProcess = interface(JObject)\r\n    ['{476414FD-570F-4EDF-B678-A2FE459EA6EB}']\r\n    { Methods }\r\n    procedure destroy; cdecl;\r\n    function exitValue: integer; cdecl;\r\n    function getErrorStream: JInputStream; cdecl;\r\n    function getInputStream: JInputStream; cdecl;\r\n    function getOutputStream: JOutputStream; cdecl;\r\n    function waitFor: integer; cdecl;\r\n  end;\r\n\r\n  TJProcess = class(TJavaGenericImport&lt;JProcessClass, JProcess&gt;)\r\n  end;\r\n\r\n  \/\/ ----------------------------------Jruntime----------------------\r\n  JRuntimeClass = interface(JObjectClass)\r\n    ['{3F2E949D-E97C-4AD8-B5B9-19CB0A6A29F3}']\r\n    { costant }\r\n  end;\r\n\r\n  [JavaSignature('java\/lang\/Runtime')]\r\n  JRuntime = interface(JObject)\r\n    ['{C097A7EC-677B-4BCB-A4BD-7227160750A5}']\r\n    { Methods }\r\n    procedure addShutdownHook(hook: JThread); cdecl;\r\n    function availableProcessors: integer; cdecl;\r\n    function exec(progArray, envp: array of JString): JProcess; overload; cdecl;\r\n    function exec(progArray: JString; envp: array of JString; directory: JFile)\r\n      : JProcess; overload; cdecl;\r\n    function exec(progArray, envp: array of JString; directory: JFile)\r\n      : JProcess; overload; cdecl;\r\n    function exec(prog: JString; envp: array of JString): JProcess; cdecl;\r\n      overload; cdecl;\r\n    function exec(progArray: array of JString): JProcess; overload; cdecl;\r\n    function exec(prog: JString): JProcess; cdecl; overload; cdecl;\r\n    procedure Exit(code: integer); cdecl;\r\n    function freeMemory: LongInt; cdecl;\r\n    procedure gc; cdecl;\r\n    function getLocalizedInputStream(stream: JInputStream): JInputStream; cdecl;\r\n    function getLocalizedOutputStream(stream: JOutputStream)\r\n      : JOutputStream; cdecl;\r\n    function getRuntime: JRuntime; cdecl;\r\n    procedure halt(code: integer); cdecl;\r\n    procedure load(pathName: JString); cdecl;\r\n    procedure loadLibrary(libName: JString); cdecl;\r\n    function maxMemory: LongInt; cdecl;\r\n    function RemoveShutdownHook(hook: JThread): Boolean; cdecl;\r\n    procedure runFinalization; cdecl;\r\n    procedure runFinalizersOnExit(run: Boolean); cdecl;\r\n    function totalMemory: LongInt; cdecl;\r\n    procedure traceInstructions(enable: Boolean); cdecl;\r\n    procedure traceMethodCalls(enable: Boolean); cdecl;\r\n  end;\r\n\r\n  TJRuntime = class(TJavaGenericImport&lt;JRuntimeClass, JRuntime&gt;)\r\n  end;\r\n\r\n  { TQAndroidShell }\r\n\r\nfunction TQAndroidShell.AskForRoot: Boolean;\r\nbegin\r\nResult := InRoot;\r\nif not Result then\r\n  begin\r\n  Result := IsRooted;\r\n  if not Assigned(FProcess) then\r\n    begin\r\n    Result := False;\r\n    if IsRooted then\r\n      begin\r\n      FProcess := (FRuntime as JRuntime).exec(StringToJString('su'));\r\n      if Assigned(FProcess) then\r\n        begin\r\n        \/\/ \u901a\u8fc7\u68c0\u67e5\u5f53\u524d\u8d26\u53f7\u6765\u5224\u65ad\u4e0b\u81ea\u5df1\u662f\u5426\u6210\u529f\u83b7\u53d6root\u6743\u9650\r\n        if SendCmd('id -nu') then\r\n          begin\r\n          FInRoot := StrStrW(PQCharW(ReadReply), 'root') &lt;&gt; nil;\r\n          Result := FInRoot;\r\n          end;\r\n        end;\r\n      if not Result then\r\n        FProcess := nil;\r\n      end;\r\n    end;\r\n  end;\r\nend;\r\n\r\nfunction TQAndroidShell.Initliaize: PQAndroidShell;\r\nbegin\r\nFRuntime := TJRuntime.Create;\r\nFProcess := nil;\r\nFInRoot := False;\r\nResult := @Self;\r\nend;\r\n\r\nfunction TQAndroidShell.Execute(const ACmdline: QStringW; ATimeout: Cardinal)\r\n  : QStringW;\r\nvar\r\n  AProcess: JProcess;\r\nbegin\r\nSetLength(Result, 0);\r\nif InRoot then\r\n  begin\r\n  if SendCmd(ACmdline) then\r\n    Result := ReadReply(ATimeout);\r\n  end\r\nelse\r\n  begin\r\n  AProcess := (FRuntime as JRuntime).exec(StringToJString(ACmdline));\r\n  if Assigned(AProcess) then\r\n    Result := InternalReadReply(AProcess, ATimeout);\r\n  end;\r\nend;\r\n\r\nprocedure TQAndroidShell.ExitRoot;\r\nbegin\r\nif InRoot then\r\n  begin\r\n  if SendCmd('exit') then\r\n    begin\r\n    (FProcess as JProcess).waitFor;\r\n    FProcess := nil;\r\n    FInRoot := False;\r\n    end;\r\n  end;\r\nend;\r\n\r\nfunction TQAndroidShell.GetIsRooted: Boolean;\r\nbegin\r\nResult := FileExists('\/system\/bin\/su') or FileExists('\/system\/xbin\/su');\r\nend;\r\n\r\nfunction TQAndroidShell.InternalReadReply(AProcess: JObject; ATimeout: Cardinal)\r\n  : QStringW;\r\nvar\r\n  AError, AInput, AResultStream: JInputStream;\r\n  AWatch: TStopWatch;\r\n  ABuf: TJavaArray&lt;Byte&gt;;\r\nbegin\r\nAError := (AProcess as JProcess).getErrorStream;\r\nAInput := (AProcess as JProcess).getInputStream;\r\nAWatch := TStopWatch.StartNew;\r\nAResultStream := nil;\r\nrepeat\r\n  if AInput.available &gt; 0 then\r\n    AResultStream := AInput\r\n  else if AError.available &gt; 0 then\r\n    AResultStream := AError;\r\nuntil (AWatch.ElapsedMilliseconds &gt; ATimeout) or (AResultStream &lt;&gt; nil);\r\nif Assigned(AResultStream) then\r\n  begin\r\n  ABuf := TJavaArray&lt;Byte&gt;.Create(AResultStream.available);\r\n  try\r\n    AResultStream.read(ABuf);\r\n    Result := qstring.Utf8Decode(PQCharA(ABuf.Data), ABuf.Length);\r\n  finally\r\n    FreeAndNil(ABuf);\r\n  end;\r\n  end\r\nelse\r\n  SetLength(Result, 0);\r\nend;\r\n\r\nfunction TQAndroidShell.ReadReply(ATimeout: Cardinal): QStringW;\r\nbegin\r\nResult := InternalReadReply(FProcess, ATimeout);\r\nend;\r\n\r\nfunction TQAndroidShell.SendCmd(const ACmdline: QStringW): Boolean;\r\nvar\r\n  S: QStringA;\r\n  ABuf: TJavaArray&lt;Byte&gt;;\r\n  AStream: JOutputStream;\r\nbegin\r\nS := qstring.Utf8Encode(ACmdline + SLineBreak);\r\nABuf := TJavaArray&lt;Byte&gt;.Create(S.Length);\r\ntry\r\n  Move(PQCharA(S)^, ABuf.Data^, S.Length);\r\n  AStream := (FProcess as JProcess).getOutputStream;\r\n  AStream.write(ABuf);\r\n  AStream.flush;\r\n  Result := True;\r\nexcept\r\n  Result := False;\r\nend;\r\nFreeAndNil(ABuf);\r\nend;\r\n\r\nend.<\/pre>\n<p><strong>\u00a0\u3010\u63d0\u793a\u3011\u5e94\u4fee\u6539AndroidManifest.template.xml\u6587\u4ef6\uff0c\u52a0\u5165ACCESS_SUPERUSER\u6743\u9650\uff0c\u867d\u7136\u4e0d\u52a0\u6682\u65f6\u4e5f\u6ca1\u6709\u592a\u5927\u7684\u526f\u4f5c\u7528\u3002<\/strong><\/p>\n<pre class=\"lang:xhtml decode:true \">    &lt;uses-sdk android:minSdkVersion=\"%minSdkVersion%\" android:targetSdkVersion=\"%targetSdkVersion%\" \/&gt;\r\n&lt;%uses-permission%&gt;\r\n&lt;!-- \u6dfb\u52a0\u6b64\u884c\u6b64\u58f0\u660e\u9700\u8981\u7ba1\u7406\u5458\u6743\u9650 --&gt;\r\n\t&lt;uses-permission android:name=\"android.permission.ACCESS_SUPERUSER\" \/&gt;\r\n&lt;!-- \u6dfb\u52a0\u5b8c\u6bd5 --&gt;\r\n    &lt;application android:persistent=\"%persistent%\"<\/pre>\n<p>\u4e0d\u9700\u591a\u8bf4\uff0c\u770b\u7597\u6548\uff1a<\/p>\n<p><a href=\"https:\/\/blog.qdac.cc\/wp-content\/uploads\/2014\/11\/Android_Root2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1132\" src=\"https:\/\/blog.qdac.cc\/wp-content\/uploads\/2014\/11\/Android_Root2-168x300.png\" alt=\"Android_Root2\" width=\"168\" height=\"300\" srcset=\"https:\/\/blog.qdac.cc\/wp-content\/uploads\/2014\/11\/Android_Root2-168x300.png 168w, https:\/\/blog.qdac.cc\/wp-content\/uploads\/2014\/11\/Android_Root2-576x1024.png 576w, https:\/\/blog.qdac.cc\/wp-content\/uploads\/2014\/11\/Android_Root2.png 720w\" sizes=\"auto, (max-width: 168px) 100vw, 168px\" \/><\/a>\u00a0 \u00a0<a href=\"https:\/\/blog.qdac.cc\/wp-content\/uploads\/2014\/11\/Andriod_Root.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-1131\" src=\"https:\/\/blog.qdac.cc\/wp-content\/uploads\/2014\/11\/Andriod_Root-168x300.jpg\" alt=\"Andriod_Root\" width=\"168\" height=\"300\" srcset=\"https:\/\/blog.qdac.cc\/wp-content\/uploads\/2014\/11\/Andriod_Root-168x300.jpg 168w, https:\/\/blog.qdac.cc\/wp-content\/uploads\/2014\/11\/Andriod_Root.jpg 540w\" sizes=\"auto, (max-width: 168px) 100vw, 168px\" \/><\/a><\/p>\n<p>\u5b8c\u6574\u7684\u6e90\u7801\u4e0b\u8f7d\uff1a<a href=\"http:\/\/pan.baidu.com\/s\/1gdq1p9T\" target=\"_blank\">\u767e\u5ea6\u7f51\u76d8<\/a><\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u501f\u52a9\u8c37\u6b4c\uff0c\u5e76\u7ecf\u8fc7\u672c\u5927\u4fa0\u65bd\u5c55\u5751\u3001\u8499\u3001\u62d0\u3001\u9a97 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[69,8,21],"tags":[457,156,157,158],"class_list":["post-1130","post","type-post","status-publish","format-standard","hentry","category-c-builder","category-delphi","category-misc","tag-android","tag-root","tag-157","tag-158"],"views":13847,"_links":{"self":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts\/1130","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1130"}],"version-history":[{"count":14,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts\/1130\/revisions"}],"predecessor-version":[{"id":2320,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=\/wp\/v2\/posts\/1130\/revisions\/2320"}],"wp:attachment":[{"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1130"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1130"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.qdac.cc\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1130"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}