<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>班德尔城</title>
  
  <subtitle>微笑，简单，奋发</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://tiimor.cn/"/>
  <updated>2019-10-07T09:47:37.933Z</updated>
  <id>https://tiimor.cn/</id>
  
  <author>
    <name>Tiimor</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Git-subtree&amp;submodule拆分与管理</title>
    <link href="https://tiimor.cn/Git-subtree&amp;submodule%E6%8B%86%E5%88%86%E4%B8%8E%E7%AE%A1%E7%90%86/"/>
    <id>https://tiimor.cn/Git-subtree&amp;submodule拆分与管理/</id>
    <published>2019-04-21T10:00:02.000Z</published>
    <updated>2019-10-07T09:47:37.933Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E4%B8%8D%E7%95%99%E6%B1%A1%E7%82%B9%EF%BC%8C%E9%97%AE%E5%BF%83%E6%97%A0%E6%84%A7.jpg" alt="Android" title="&#x4E0D;&#x7559;&#x6C61;&#x70B9;&#xFF0C;&#x95EE;&#x5FC3;&#x65E0;&#x6127;"></p><p><strong>&#x968F;&#x7740;&#x4E1A;&#x52A1;&#x9700;&#x6C42;&#x8D8A;&#x6765;&#x8D8A;&#x5E9E;&#x5927;&#xFF0C;Git&#x4ED3;&#x5E93;&#x5305;&#x542B;&#x5F88;&#x591A;&#x53EF;&#x4EE5;&#x72EC;&#x7ACB;&#x62C6;&#x5206;&#x7684;Module&#xFF0C;&#x56E0;&#x6B64;&#x62C6;&#x5206;&#x51FA;&#x72EC;&#x7ACB;&#x7684;&#x6A21;&#x5757;&#x51FA;&#x6765;&#xFF0C;&#x5C06;&#x5B50;&#x76EE;&#x5F55;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x4ED3;&#x5E93;&#xFF0C;&#x5E76;&#x4E14;&#x4FDD;&#x7559;Log&#x8BB0;&#x5F55;&#xFF0C;&#x540C;&#x65F6;&#x65B9;&#x4FBF;&#x5176;&#x4ED6;&#x5DE5;&#x7A0B;&#x8C03;&#x7528;</strong></p><a id="more"></a><h1 id="&#x4ED3;&#x5E93;&#x62C6;&#x5206;"><a href="#&#x4ED3;&#x5E93;&#x62C6;&#x5206;" class="headerlink" title="&#x4ED3;&#x5E93;&#x62C6;&#x5206;"></a>&#x4ED3;&#x5E93;&#x62C6;&#x5206;</h1><h2 id="&#x624B;&#x52A8;&#x5F3A;&#x62C6;"><a href="#&#x624B;&#x52A8;&#x5F3A;&#x62C6;" class="headerlink" title="&#x624B;&#x52A8;&#x5F3A;&#x62C6;"></a>&#x624B;&#x52A8;&#x5F3A;&#x62C6;</h2><p>&#x76F4;&#x63A5;copy&#x4E00;&#x4EFD;&#x76EE;&#x6807;&#x76EE;&#x5F55;&#x4EE3;&#x7801;&#xFF0C;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x4F46;&#x662F;&#x4F1A;&#x5BFC;&#x81F4;Log&#x8BB0;&#x5F55;&#x7F3A;&#x5931;&#x3002;</p><h2 id="git-filter-branch"><a href="#git-filter-branch" class="headerlink" title="git filter-branch"></a>git filter-branch</h2><ul><li><p>clone&#x4E00;&#x4EFD;&#x539F;&#x4ED3;&#x5E93;&#xFF0C;&#x5E76;&#x4E14;&#x5220;&#x9664;remote</p><figure class="highlight shell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;</span><span class="bash"> git <span class="built_in">clone</span> &lt;big-repo&gt;  &lt;new-repo&gt;</span></span><br><span class="line"><span class="meta">&gt;</span><span class="bash"> <span class="built_in">cd</span> &lt;new-repo&gt;</span></span><br><span class="line"><span class="meta">&gt;</span><span class="bash"> git remote rm origin</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x62C6;&#x5206;</p><figure class="highlight vim"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">// &#x4F1A;&#x5E26;&#x7740;<span class="keyword">tag</span>&#x8BB0;&#x5F55;</span><br><span class="line">&gt; git <span class="built_in">filter</span>-branch --<span class="keyword">tag</span>-name-<span class="built_in">filter</span> <span class="keyword">cat</span> --prune-<span class="built_in">empty</span> --subdirectory-<span class="built_in">filter</span> <span class="symbol">&lt;name-of-folder&gt;</span> -- --<span class="keyword">all</span></span><br><span class="line">// &#x6CA1;&#x6709;&#x5E26;<span class="keyword">tag</span></span><br><span class="line">&gt; git <span class="built_in">filter</span>-branch -<span class="keyword">f</span> --prune-<span class="built_in">empty</span> --subdirectory-<span class="built_in">filter</span> <span class="symbol">&lt;name-of-folder&gt;</span></span><br></pre></td></tr></tbody></table></figure></li></ul><p>&#x53C2;&#x6570;&#x8BF4;&#x660E;&#xFF1A;<br></p><figure class="highlight vim"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#x8FD9;&#x6761;&#x547D;&#x4EE4;&#x540C;&#x6837;&#x4F1A;&#x8FC7;&#x6EE4;&#x6240;&#x6709;&#x5386;&#x53F2;&#x63D0;&#x4EA4;&#xFF0C;&#x53EA;&#x4FDD;&#x7559;&#x6240;&#x6709;&#x5BF9;&#x6307;&#x5B9A;&#x5B50;&#x76EE;&#x5F55;&#x6709;&#x5F71;&#x54CD;&#x7684;&#x63D0;&#x4EA4;&#xFF0C;&#x5E76;&#x5C06;&#x8BE5;&#x5B50;&#x76EE;&#x5F55;&#x8BBE;&#x4E3A;&#x8BE5;&#x4ED3;&#x5E93;&#x7684;&#x6839;&#x76EE;&#x5F55;&#x3002;&#x8FD9;&#x91CC;&#x8BF4;&#x660E;&#x5404;&#x4E0B;&#x4E2A;&#x53C2;&#x6570;&#x7684;&#x4F5C;&#x7528;&#xFF1A;</span><br><span class="line">--<span class="keyword">tag</span>-name-<span class="built_in">filter</span> &#x8BE5;&#x53C2;&#x6570;&#x63A7;&#x5236;&#x6211;&#x4EEC;&#x8981;&#x5982;&#x4F55;&#x5904;&#x7406;&#x65E7;&#x7684; <span class="keyword">tag</span>&#xFF0C;<span class="keyword">cat</span> &#x5373;&#x8868;&#x793A;&#x539F;&#x6837;&#x8F93;&#x51FA;&#xFF1B;</span><br><span class="line">--prune-<span class="built_in">empty</span> &#x5220;&#x9664;&#x7A7A;&#x7684;&#xFF08;&#x5BF9;&#x5B50;&#x76EE;&#x5F55;&#x6CA1;&#x6709;&#x5F71;&#x54CD;&#x7684;&#xFF09;&#x63D0;&#x4EA4;&#xFF1B;</span><br><span class="line">--subdirectory-<span class="built_in">filter</span> &#x6307;&#x5B9A;&#x5B50;&#x76EE;&#x5F55;&#x8DEF;&#x5F84;&#xFF1B;</span><br><span class="line">-- --<span class="keyword">all</span> &#x8BE5;&#x53C2;&#x6570;&#x5FC5;&#x987B;&#x8DDF;&#x5728;  -- &#x540E;&#x9762;&#xFF0C;&#x8868;&#x793A;&#x5BF9;&#x6240;&#x6709;&#x5206;&#x652F;&#x8FDB;&#x884C;&#x64CD;&#x4F5C;&#x3002;&#x5982;&#x679C;&#x4F60;&#x53EA;&#x60F3;&#x4FDD;&#x5B58;&#x5F53;&#x524D;&#x5206;&#x652F;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x4E0D;&#x6DFB;&#x52A0;&#x6B64;&#x53C2;&#x6570;&#x3002;</span><br></pre></td></tr></tbody></table></figure><p></p><ul><li><p>&#x6E05;&#x7406;.git<br>&#x5F53;&#x4E0A;&#x8FF0;&#x547D;&#x4EE4;&#x6267;&#x884C;&#x5B8C;&#x6BD5;&#x540E;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x672C;&#x5730;&#x7684;&#x65B0;&#x4ED3;&#x5E93;&#x5DF2;&#x7ECF;&#x662F;&#x539F;&#x4ED3;&#x5E93;&#x5B50;&#x76EE;&#x5F55;&#x4E2D;&#x7684;&#x5185;&#x5BB9;&#x4E86;&#xFF0C;&#x4E14;&#x4FDD;&#x7559;&#x4E86;&#x5173;&#x4E8E;&#x8BE5;&#x5B50;&#x76EE;&#x5F55;&#x6240;&#x6709;&#x7684;&#x63D0;&#x4EA4;&#x5386;&#x53F2;&#x3002;&#x4E0D;&#x8FC7;&#x53EA;&#x662F;&#x8FD9;&#x6837;&#x7684;&#x8BDD;&#x65B0;&#x4ED3;&#x5E93;&#x4E2D;&#x7684;<br>.git &#x76EE;&#x5F55;&#x91CC;&#x8FD8;&#x662F;&#x4FDD;&#x5B58;&#x6709;&#x4E0D;&#x5C11;&#x65E0;&#x7528;&#x7684;&#x4E1C;&#x897F;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5C06;&#x5176;&#x6E05;&#x9664;&#x6389;&#x4EE5;&#x51CF;&#x5C0F;&#x65B0;&#x4ED3;&#x5E93;&#x7684;&#x4F53;&#x79EF;&#xFF08;&#x5982;&#x679C;&#x4F60;&#x7528;subtree &#x7684;&#x65B9;&#x6CD5;&#x7684;&#x8BDD;&#x662F;&#x4E0D;&#x9700;&#x8981;&#x6267;&#x884C;&#x8FD9;&#x4E00;&#x6B65;&#x7684;&#xFF09;&#x3002;<br>&#x4F9D;&#x6B21;&#x6267;&#x884C;&#x4EE5;&#x4E0B;&#x547D;&#x4EE4;&#xFF1A;</p><figure class="highlight jboss-cli"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&gt; git reset <span class="params">--hard</span></span><br><span class="line">&gt; git for-each-ref <span class="params">--format=</span><span class="string">&quot;%(refname)&quot;</span> refs/original/ |xargs -n 1 git update-ref -d</span><br><span class="line">&gt; git reflog expire <span class="params">--expire=now</span> <span class="params">--all</span></span><br><span class="line">&gt; git gc <span class="params">--aggressive</span> <span class="params">--prune=now</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x63A8;&#x9001;&#x65B0;&#x4ED3;&#x5E93;&#x5230;&#x8FDC;&#x7AEF;</p><figure class="highlight haxe"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">cd&#x5230;&lt;<span class="keyword">new</span><span class="type"></span>-repo&gt;</span><br><span class="line"><span class="comment">// &#x6DFB;&#x52A0;&#x8FDC;&#x7AEF;&#x5730;&#x5740;:</span></span><br><span class="line">&gt; git remote add origin &lt;<span class="keyword">new</span><span class="type"></span>-git-url&gt;</span><br><span class="line"><span class="comment">// &#x63A8;&#x9001;&#x5230;&#x8FDC;&#x7AEF;&#xFF1A;</span></span><br><span class="line">&gt; git push -u origin master</span><br></pre></td></tr></tbody></table></figure></li></ul><h2 id="git-subtree"><a href="#git-subtree" class="headerlink" title="git subtree"></a>git subtree</h2><p>git subtree&#x6BD4;&#x4E0A;&#x9762;&#x7684;&#x65B9;&#x6CD5;&#x90FD;&#x7B80;&#x5355;&#xFF0C;&#x9700;&#x8981;&#x9AD8;&#x7248;&#x672C;&#x7684;git&#x652F;&#x6301;&#xFF0C;1.8</p><ul><li>&#x8FDB;&#x5165;<big-repo> &#x6240;&#x5728;&#x7684;&#x76EE;&#x5F55;&#xFF0C;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;<name-of-new-branch>&#x7684;&#x4E34;&#x65F6;&#x5206;&#x652F;<figure class="highlight livecodeserver"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&gt; git subtree <span class="built_in">split</span> -P &lt;name-<span class="keyword">of</span>-<span class="built_in">folder</span>&gt; -b &lt;name-<span class="keyword">of</span>-<span class="built_in">new</span>-branch&gt;</span><br></pre></td></tr></tbody></table></figure></name-of-new-branch></big-repo></li></ul><p><strong>&#x8BF4;&#x660E;&#xFF1A;</strong>&#x5206;&#x79BB;&#x76EE;&#x5F55;<name-of-folder>&#xFF0C;&#x628A;&#x5B83;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;&#x540D;&#x5B57;&#x662F;<name-of-new-branch>&#x7684;branch<br><strong>&#x6CE8;&#x610F;&#xFF1A;</strong>&#x6709;&#x65F6;&#x5019;&#x5076;&#x5C14;&#x4F1A;&#x6CA1;&#x6709;&#x62C6;&#x5206;&#xFF0C;&#x4F1A;&#x62C9;&#x53D6;&#x539F;&#x4ED3;&#x5E93;&#x6240;&#x6709;&#x7684;log&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x5C31;&#x8981;&#x6CE8;&#x610F;&#x4E00;&#x4E0B;&#xFF0C;&#x62C6;&#x5206;&#x7684;&#x76EE;&#x5F55;&#x7684;Log&#x4F1A;&#x5C11;&#x4E00;&#x4E9B;&#xFF1B;&#x4E0D;&#x6210;&#x529F;&#x591A;&#x5C1D;&#x8BD5;&#x51E0;&#x6B21;</name-of-new-branch></name-of-folder></p><ul><li><p>&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684; git &#x4ED3;&#x5E93;&#xFF0C;&#x7528;&#x4E8E;&#x5206;&#x79BB;&#x7684;&#x76EE;&#x5F55;</p><figure class="highlight haxe"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&gt; mkdir &lt;<span class="keyword">new</span><span class="type"></span>-repo&gt;</span><br><span class="line">&gt; cd ../&lt;<span class="keyword">new</span><span class="type"></span>-repo&gt;</span><br><span class="line">&gt; git init</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x62C9;&#x53D6;&#x539F;&#x4ED3;&#x5E93;&lt;/path/to/big-repo&gt;&#x7684;&#x4E34;&#x65F6;&#x5206;&#x652F;<name-of-new-branch>&#x5230;&#x65B0;&#x7684;&#x4ED3;&#x5E93;<new-repo>&#x4E2D; master &#x5206;&#x652F;</new-repo></name-of-new-branch></p><figure class="highlight applescript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&gt; git pull &lt;/path/<span class="keyword">to</span>/big-repo&gt; &lt;<span class="built_in">name</span>-<span class="keyword">of</span>-new-branch&gt;</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x63A8;&#x9001;&#x5230;&#x8FDC;&#x7A0B;</p><figure class="highlight haxe"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">cd&#x5230;&lt;<span class="keyword">new</span><span class="type"></span>-repo&gt;</span><br><span class="line"><span class="comment">// &#x6DFB;&#x52A0;&#x8FDC;&#x7AEF;&#x5730;&#x5740;:</span></span><br><span class="line">&gt; git remote add origin &lt;<span class="keyword">new</span><span class="type"></span>-git-url&gt;</span><br><span class="line"><span class="comment">// &#x63A8;&#x9001;&#x5230;&#x8FDC;&#x7AEF;&#xFF1A;</span></span><br><span class="line">&gt; git push -u origin master</span><br></pre></td></tr></tbody></table></figure></li></ul><p><img src="http://cdn.tiimor.cn/images/git-subtree.png" alt="subtree"></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E4%B8%8D%E7%95%99%E6%B1%A1%E7%82%B9%EF%BC%8C%E9%97%AE%E5%BF%83%E6%97%A0%E6%84%A7.jpg&quot; alt=&quot;Android&quot; title=&quot;不留污点，问心无愧&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;随着业务需求越来越庞大，Git仓库包含很多可以独立拆分的Module，因此拆分出独立的模块出来，将子目录作为一个新的仓库，并且保留Log记录，同时方便其他工程调用&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="git" scheme="https://tiimor.cn/tags/git/"/>
    
  </entry>
  
  <entry>
    <title>Gradle多渠道代码</title>
    <link href="https://tiimor.cn/Gradle%E5%A4%9A%E6%B8%A0%E9%81%93%E4%BB%A3%E7%A0%81/"/>
    <id>https://tiimor.cn/Gradle多渠道代码/</id>
    <published>2019-03-17T06:48:47.000Z</published>
    <updated>2019-03-24T04:39:00.858Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E9%AD%94%E5%B9%BB.jpg" alt="Android" title="&#x9B54;&#x5E7B;"></p><p><strong>&#x4E00;&#x5957;&#x4EE3;&#x7801;&#x884D;&#x751F;&#x591A;&#x5957;&#x4EE3;&#x7801;&#xFF0C;&#x6253;&#x5305;&#x4E0D;&#x540C;&#x7684;APK</strong></p><a id="more"></a><p>&#x5F53;&#x9047;&#x5230;&#x9700;&#x6C42;&#xFF0C;&#x4E00;&#x5957;&#x4EE3;&#x7801;&#x6839;&#x636E;&#x4E0D;&#x540C;&#x7684;&#x5BA2;&#x6237;&#x6253;&#x5305;&#x6210;&#x4E0D;&#x540C;&#x7684;logo&#x6216;&#x8005;&#x4E0D;&#x540C;&#x7684;UI&#x98CE;&#x683C;&#x65F6;&#xFF0C;Android Studio&#x4E2D;&#x642D;&#x914D;gradle&#xFF0C;&#x4F7F;&#x7528;productFlavors&#x53EF;&#x4EE5;&#x5F88;&#x597D;&#x89E3;&#x51B3;&#x3002;<br>buildType&#x4E5F;&#x53EF;&#x4EE5;&#xFF0C;&#x4F46;&#x662F;&#x4E00;&#x822C;&#x5904;&#x7406;&#x7684;&#x662F;&#x7F16;&#x8BD1;&#x914D;&#x7F6E;&#x3002;</p><p>&#x5E38;&#x89C1;&#x7684;&#x51E0;&#x79CD;&#x60C5;&#x51B5;&#xFF1A;</p><ul><li>&#x8D44;&#x6E90;&#x6587;&#x4EF6;assets&#x3001;res&#xFF0C;&#x66FF;&#x6362;logo&#x3001;&#x56FE;&#x7247;&#x3001;strings</li><li>AndroidManifest&#x6587;&#x4EF6;</li><li>java&#x7C7B;&#x6587;&#x4EF6;</li></ul><p><strong>&#x6CE8;&#x610F;&#xFF1A;</strong>&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x3001;AndroidManifest&#x6587;&#x4EF6;&#x5728;&#x7F16;&#x8BD1;&#x90FD;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;main&#x76EE;&#x5F55;&#x91CC;&#x7684;&#x8D44;&#x6E90;&#xFF0C;&#x56E0;&#x4E3A;&#x4ED6;&#x4EEC;&#x662F;&#x5408;&#x5E76;&#x3001;&#x66FF;&#x6362;&#x6216;&#x8005;&#x8986;&#x76D6;&#xFF1B;&#x4F46;&#x662F;java&#x6587;&#x4EF6;&#x5FC5;&#x987B;&#x5728;&#x6BCF;&#x4E2A;flavor&#x4E2D;&#x5B58;&#x5728;&#xFF0C;main&#x76EE;&#x5F55;&#x5219;&#x4E0D;&#x80FD;&#x5B58;&#x6709;&#xFF0C;&#x4F1A;&#x62A5;&#x9519;&#xFF0C;&#x56E0;&#x4E3A;java&#x7C7B;&#x53EA;&#x80FD;&#x662F;&#x552F;&#x4E00;&#x3002;</p><p>&#x5F02;&#x5E38;<br></p><figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1</span><span class="selector-class">.All</span> flavors must now belong to <span class="selector-tag">a</span> named flavor dimension. Learn more at https:<span class="comment">//d.android.com/r/tools/flavorDimensions-missing-error-message.html</span></span><br><span class="line">&#x89E3;&#x51B3;&#x65B9;&#x6CD5;&#xFF1A;defaultConfig{}&#x52A0;&#x5165;flavorDimensions <span class="string">&quot;default&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="number">2</span><span class="selector-class">.Duplicate</span> class</span><br><span class="line">&#x89E3;&#x51B3;&#x65B9;&#x6CD5;&#xFF1A;&#x53BB;&#x6389;main&#x4E2D;&#x91CD;&#x590D;&#x7684;java&#x7C7B;</span><br></pre></td></tr></tbody></table></figure><p></p><p>&#x793A;&#x4F8B;<br></p><figure class="highlight puppet"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">// &#x591A;&#x6E20;&#x9053;</span><br><span class="line"><span class="keyword">productFlavors</span> {</span><br><span class="line">    <span class="literal">system</span> {</span><br><span class="line"></span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">normal</span> {</span><br><span class="line"></span><br><span class="line">    }</span><br><span class="line">}</span><br><span class="line">// &#x642D;&#x914D;productFlavors&#xFF0C;&#x6307;&#x5B9A;&#x8D44;&#x6E90;</span><br><span class="line"><span class="keyword">sourceSets</span> {</span><br><span class="line">    <span class="literal">system</span> {</span><br><span class="line">        <span class="literal">manifest</span>.srcFile <span class="string">&apos;src/main/AndroidManifest_system.xml&apos;</span></span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">normal</span> {</span><br><span class="line">        <span class="literal">manifest</span>.srcFile <span class="string">&apos;src/main/AndroidManifest.xml&apos;</span></span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p></p><h1 id="&#x8D44;&#x6E90;"><a href="#&#x8D44;&#x6E90;" class="headerlink" title="&#x8D44;&#x6E90;"></a>&#x8D44;&#x6E90;</h1><h2 id="&#x7B80;&#x5355;&#x7684;&#x8D44;&#x6E90;&#x66FF;&#x4EE3;"><a href="#&#x7B80;&#x5355;&#x7684;&#x8D44;&#x6E90;&#x66FF;&#x4EE3;" class="headerlink" title="&#x7B80;&#x5355;&#x7684;&#x8D44;&#x6E90;&#x66FF;&#x4EE3;"></a>&#x7B80;&#x5355;&#x7684;&#x8D44;&#x6E90;&#x66FF;&#x4EE3;</h2><p>&#x66FF;&#x6362;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x5728;&#x751F;&#x6210;&#x7684;BuildConfig&#x7C7B;&#x4E2D;&#x53EF;&#x4EE5;&#x627E;&#x5230;&#x3002;<strong>&#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x53EA;&#x9002;&#x7528;&#x5C11;&#x6570;&#x7684;&#x66FF;&#x6362;</strong>&#x3002;<br></p><figure class="highlight less"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">productFlavors</span> {</span><br><span class="line">    <span class="selector-tag">A</span> {</span><br><span class="line">        <span class="comment">// &#x66FF;&#x6362;&#x5B57;&#x7B26;&#x4E32;&#x53D8;&#x91CF;</span></span><br><span class="line">        <span class="selector-tag">buildConfigField</span>(<span class="string">&quot;String&quot;</span>, <span class="string">&quot;name&quot;</span>, <span class="string">&quot;A&quot;</span>)</span><br><span class="line">        <span class="comment">// &#x66FF;&#x6362;&#x8D44;&#x6E90;&#x5B57;&#x7B26;&#x4E32;&#xFF1A;R.string.type</span></span><br><span class="line">        <span class="selector-tag">resValue</span>(<span class="string">&quot;string&quot;</span>, <span class="string">&quot;type&quot;</span>, <span class="string">&quot;A&quot;</span>)</span><br><span class="line">    }</span><br><span class="line">    <span class="selector-tag">B</span> {</span><br><span class="line">        <span class="selector-tag">buildConfigField</span>(<span class="string">&quot;String&quot;</span>, <span class="string">&quot;name&quot;</span>, <span class="string">&quot;B&quot;</span>)</span><br><span class="line">        <span class="selector-tag">resValue</span>(<span class="string">&quot;string&quot;</span>, <span class="string">&quot;type&quot;</span>, <span class="string">&quot;B&quot;</span>)</span><br><span class="line">    }</span><br><span class="line">    <span class="selector-tag">C</span> {</span><br><span class="line">        <span class="selector-tag">buildConfigField</span>(<span class="string">&quot;String&quot;</span>, <span class="string">&quot;name&quot;</span>, <span class="string">&quot;C&quot;</span>)</span><br><span class="line">        <span class="selector-tag">resValue</span>(<span class="string">&quot;string&quot;</span>, <span class="string">&quot;type&quot;</span>, <span class="string">&quot;C&quot;</span>)</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p></p><h2 id="&#x591A;&#x6E20;&#x9053;&#x8D44;&#x6E90;&#x66FF;&#x6362;"><a href="#&#x591A;&#x6E20;&#x9053;&#x8D44;&#x6E90;&#x66FF;&#x6362;" class="headerlink" title="&#x591A;&#x6E20;&#x9053;&#x8D44;&#x6E90;&#x66FF;&#x6362;"></a>&#x591A;&#x6E20;&#x9053;&#x8D44;&#x6E90;&#x66FF;&#x6362;</h2><p>&#x521B;&#x5EFA;&#x591A;&#x4E2A;flavor&#x65F6;&#xFF0C;&#x6307;&#x5411;&#x5BF9;&#x5E94;&#x7684;&#x8D44;&#x6E90;&#x76EE;&#x5F55;&#xFF1A;&#x8BE5;&#x8D44;&#x6E90;&#x76EE;&#x5F55;&#x5728;&#x7F16;&#x8BD1;&#x65F6;&#xFF0C;&#x4F1A;&#x4E0E;main&#x91CC;&#x9762;&#x7684;&#x8D44;&#x6E90;&#x76EE;&#x5F55;&#x8FDB;&#x884C;&#x5408;&#x5E76;&#x6216;&#x8005;&#x66FF;&#x6362;&#x3002;</p><ul><li><p>&#x5408;&#x5E76;<br>&#x5982;strings.xml&#xFF0C;&#x5148;&#x5408;&#x5E76;main&#x548C;&#x5F53;&#x524D;flavor&#x6587;&#x4EF6;&#x91CC;&#x8D44;&#x6E90;&#xFF1B;&#x9047;&#x5230;id&#x540D;&#x76F8;&#x540C;&#x65F6;&#xFF0C;&#x5219;&#x4F1A;&#x7528;flavor&#x7684;&#x8D44;&#x6E90;&#x66FF;&#x6362;&#x5E26;main&#x91CC;&#x9762;&#x7684;&#x8D44;&#x6E90;&#x3002;</p></li><li><p>&#x66FF;&#x6362;<br>&#x5982;assets&#x3001;&#x56FE;&#x7247;&#x540D;&#x5B57;&#x76F8;&#x540C;&#x65F6;&#xFF0C;&#x4F1A;&#x88AB;flavor&#x7684;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x66FF;&#x6362;&#x3002;</p></li></ul><figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">productFlavors {</span><br><span class="line">    A {</span><br><span class="line">    }</span><br><span class="line">    B {</span><br><span class="line">    }</span><br><span class="line">}</span><br><span class="line"><span class="comment">// &#x4E24;&#x79CD;&#x5199;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x6307;&#x5B9A;main&#x91CC;&#x9762;&#x7684;&#x8D44;&#x6E90;&#x8DEF;&#x5F84;</span></span><br><span class="line">sourceSets{</span><br><span class="line">    A<span class="selector-class">.res</span><span class="selector-class">.srcDirs</span>=[<span class="string">&apos;src/main/res-a&apos;</span>]</span><br><span class="line">    B<span class="selector-class">.res</span><span class="selector-class">.srcDirs</span>=[<span class="string">&apos;src/main/res-b&apos;</span>]</span><br><span class="line">    C<span class="selector-class">.res</span><span class="selector-class">.srcDirs</span>=[<span class="string">&apos;src/main/res-c&apos;</span>]</span><br><span class="line">}</span><br><span class="line">sourceSets {</span><br><span class="line">    A {</span><br><span class="line">        res<span class="selector-class">.srcDirs</span> = [<span class="string">&apos;src/main/res-a&apos;</span>]</span><br><span class="line">    }</span><br><span class="line">    B {</span><br><span class="line">        res<span class="selector-class">.srcDirs</span> = [<span class="string">&apos;src/main/res-b&apos;</span>]</span><br><span class="line">    }</span><br><span class="line">    C {</span><br><span class="line">        manifest<span class="selector-class">.srcFile</span> <span class="string">&apos;src/main/AndroidManifest_c.xml&apos;</span></span><br><span class="line">        res<span class="selector-class">.srcDirs</span> = [<span class="string">&apos;src/main/res-c&apos;</span>]</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>&#x6216;&#x8005;&#x521B;&#x5EFA;&#x4E0E;main&#x540C;&#x7EA7;&#x7684;&#x76EE;&#x5F55;&#xFF0C;&#x8868;&#x793A;&#x4E00;&#x4E2A;flavor<br><img src="http://cdn.tiimor.cn/images/gradle%E5%A4%9A%E6%B8%A0%E9%81%93%E8%B5%84%E6%BA%90.png" alt="gradle&#x591A;&#x6E20;&#x9053;&#x8D44;&#x6E90;"></p><h1 id="AndroidManifest"><a href="#AndroidManifest" class="headerlink" title="AndroidManifest"></a>AndroidManifest</h1><p>&#x8BE5;&#x6587;&#x4EF6;&#x591A;&#x6E20;&#x9053;&#x4E0E;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x591A;&#x6E20;&#x9053;&#x6709;&#x4E9B;&#x7C7B;&#x4F3C;&#xFF0C;&#x4F46;&#x662F;&#x5B83;&#x662F;&#x5408;&#x5E76;&#x8282;&#x70B9;&#x7684;&#x5F62;&#x5F0F;&#x3002;</p><p>&#x9ED8;&#x8BA4;&#x7684;main&#x91CC;&#x9762;&#x6709;&#x4E00;&#x4E2A;AndroidManifest&#x6587;&#x4EF6;&#xFF0C;&#x7F16;&#x8BD1;&#x65F6;&#x7684;flavor&#x4E5F;&#x5B58;&#x5728;&#x53E6;&#x5916;&#x4E00;&#x4E2A;AndroidManifest&#xFF0C;&#x5219;&#x4F1A;&#x5408;&#x5E76;&#xFF0C;&#x6839;&#x636E;&#x8282;&#x70B9;<strong>tools:node</strong>&#x914D;&#x7F6E;&#xFF0C;&#x5224;&#x65AD;&#x662F;&#x5426;&#x8986;&#x76D6;(replace)&#x6216;&#x8005;&#x662F;&#x5408;&#x5E76;(merge)&#x7B49;&#x7B49;&#xFF0C;&#x9ED8;&#x8BA4;&#x662F;merge&#x3002;<br></p><figure class="highlight xml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">activity</span> <span class="attr">android:name</span>=<span class="string">&quot;.MainActivity&quot;</span></span></span><br><span class="line"><span class="tag">          <span class="attr">tools:node</span>=<span class="string">&quot;merge&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">&quot;android.intent.action.MAIN&quot;</span>/&gt;</span></span><br><span class="line"></span><br><span class="line">        <span class="tag">&lt;<span class="name">category</span> <span class="attr">android:name</span>=<span class="string">&quot;android.intent.category.LAUNCHER&quot;</span>/&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">activity</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure><p></p><p>&#x6709;&#x65F6;&#x591A;&#x4E2A;AndroidManifest&#x65F6;&#xFF0C;&#x4FEE;&#x6539;flavor&#xFF0C;&#x4F46;&#x662F;&#x6CA1;&#x6709;&#x8FBE;&#x5230;&#x6548;&#x679C;&#xFF0C;&#x5219;&#x8981;&#x67E5;&#x770B;&#x662F;&#x5426;&#x662F;<strong>tools:node</strong>&#x914D;&#x7F6E;&#x7684;&#x539F;&#x56E0;&#x3002;</p><h1 id="java&#x6587;&#x4EF6;"><a href="#java&#x6587;&#x4EF6;" class="headerlink" title="java&#x6587;&#x4EF6;"></a>java&#x6587;&#x4EF6;</h1><p>java&#x6587;&#x4EF6;&#x6BD4;&#x8F83;&#x7279;&#x6B8A;&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x5BF9;&#x6587;&#x4EF6;A.java&#x8FDB;&#x884C;&#x591A;&#x6E20;&#x9053;&#xFF0C;&#x9700;&#x8981;&#x53BB;&#x6389;main&#x91CC;&#x9762;&#x7684;&#x6587;&#x4EF6;&#x7684;A.java&#xFF0C;&#x7136;&#x540E;&#x5728;&#x5176;&#x4ED6;&#x6240;&#x6709;&#x7684;flavor&#x91CC;&#x52A0;&#x5165;A.java&#x3002;&#x8FD9;&#x6837;flavor&#x591A;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4FEE;&#x6539;A&#x4E2D;&#x516C;&#x5171;&#x7684;&#x4EE3;&#x7801;&#x90E8;&#x5206;&#x6BD4;&#x8F83;&#x9EBB;&#x70E6;&#xFF0C;&#x76EE;&#x524D;&#x8FD8;&#x6CA1;&#x597D;&#x7684;&#x529E;&#x6CD5;&#x3002;</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E9%AD%94%E5%B9%BB.jpg&quot; alt=&quot;Android&quot; title=&quot;魔幻&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一套代码衍生多套代码，打包不同的APK&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Gradle" scheme="https://tiimor.cn/tags/Gradle/"/>
    
      <category term="多渠道" scheme="https://tiimor.cn/tags/%E5%A4%9A%E6%B8%A0%E9%81%93/"/>
    
  </entry>
  
  <entry>
    <title>Retrofit封装</title>
    <link href="https://tiimor.cn/Retrofit%E5%B0%81%E8%A3%85/"/>
    <id>https://tiimor.cn/Retrofit封装/</id>
    <published>2018-12-22T05:25:13.000Z</published>
    <updated>2019-03-17T06:47:42.382Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E6%88%91%E8%82%9A%E5%AD%90%E9%87%8C%E6%9C%89%E4%B8%AA%E5%B0%8Fandroid.jpg" alt="Android" title="&#x6211;&#x809A;&#x5B50;&#x91CC;&#x6709;&#x4E2A;&#x5C0F;android"></p><p><strong>&#x5C01;&#x88C5;Retrofit&#xFF0C;&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;</strong></p><a id="more"></a><p><strong><a href="https://github.com/VeiZhang/RetrofitClient" title="RetrofitClient" target="_blank" rel="noopener">&#x4F20;&#x9001;&#x95E8;</a></strong></p><h2 id="&#x5B9E;&#x73B0;&#x529F;&#x80FD;"><a href="#&#x5B9E;&#x73B0;&#x529F;&#x80FD;" class="headerlink" title="&#x5B9E;&#x73B0;&#x529F;&#x80FD;"></a>&#x5B9E;&#x73B0;&#x529F;&#x80FD;</h2><ul><li>get&#x8BF7;&#x6C42;&#x5C01;&#x88C5;</li><li>&#x8BF7;&#x6C42;&#x5934;&#x548C;&#x53C2;&#x6570;&#x7EDF;&#x4E00;&#x914D;&#x7F6E;&#xFF0C;&#x5206;&#x5F00;&#x914D;&#x7F6E;</li><li>&#x5F02;&#x6B65;&#x7EDF;&#x4E00;&#x56DE;&#x8C03;&#x63A5;&#x53E3;</li><li>&#x5355;&#x4E2A;&#x8BF7;&#x6C42;&#x3001;&#x5355;&#x4E2A;&#x754C;&#x9762;&#x8BF7;&#x6C42;&#x3001;&#x6240;&#x6709;&#x8BF7;&#x6C42;&#x53D6;&#x6D88;</li><li>&#x7F13;&#x5B58;&#x7B56;&#x7565;&#xFF1A;&#x5728;&#x7EBF;&#x7F13;&#x5B58;&#x3001;&#x79BB;&#x7EBF;&#x7F13;&#x5B58;</li><li>&#x4E0B;&#x8F7D;</li><li>&#x4E0A;&#x4F20;</li></ul><h2 id="&#x4F7F;&#x7528;"><a href="#&#x4F7F;&#x7528;" class="headerlink" title="&#x4F7F;&#x7528;"></a>&#x4F7F;&#x7528;</h2><h3 id="&#x5F15;&#x7528;"><a href="#&#x5F15;&#x7528;" class="headerlink" title="&#x5F15;&#x7528;"></a>&#x5F15;&#x7528;</h3><figure class="highlight gradle"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">compile</span> <span class="string">&apos;com.excellence:retrofit:_latestVersion&apos;</span></span><br></pre></td></tr></tbody></table></figure><h3 id="&#x6743;&#x9650;"><a href="#&#x6743;&#x9650;" class="headerlink" title="&#x6743;&#x9650;"></a>&#x6743;&#x9650;</h3><figure class="highlight routeros"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;uses-permission android:<span class="attribute">name</span>=<span class="string">&quot;android.permission.INTERNET&quot;</span>/&gt;</span><br><span class="line">&lt;uses-permission android:<span class="attribute">name</span>=<span class="string">&quot;android.permission.ACCESS_NETWORK_STATE&quot;</span>/&gt;</span><br><span class="line">&lt;uses-permission android:<span class="attribute">name</span>=<span class="string">&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;</span>/&gt;</span><br></pre></td></tr></tbody></table></figure><h3 id="&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;"><a href="#&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;" class="headerlink" title="&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;"></a>&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;</h3><ul><li><p>&#x521D;&#x59CB;&#x5316;<br>&#x53EF;&#x4EE5;&#x5728;Application&#x4E2D;&#x521D;&#x59CB;&#x5316;</p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x9ED8;&#x8BA4;&#x652F;&#x6301;&#xFF1A;ScalarsConverterFactory&#x3001;RxJavaCallAdapterFactory</span></span><br><span class="line"><span class="comment">// addLog : &#x662F;&#x5426;&#x5F00;&#x542F;Log&#x6253;&#x5370;</span></span><br><span class="line"><span class="comment">// cacheEnable : &#x662F;&#x5426;&#x5F00;&#x542F;&#x7F13;&#x5B58;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E0D;&#x5F00;&#x542F;&#xFF1A;&#x5F00;&#x542F;&#x540E;&#xFF0C;&#x9ED8;&#x8BA4;&#x6BCF;&#x4E2A;&#x8BF7;&#x6C42;&#x90FD;&#x7F13;&#x5B58;</span></span><br><span class="line"><span class="comment">// &#x5355;&#x4E2A;&#x8BF7;&#x6C42;&#x7684;&#x7F13;&#x5B58;&#x63A7;&#x5236;&#xFF0C;&#x53EF;&#x8BBE;&#x7F6E;HttpRequest.Builder#cacheEnable</span></span><br><span class="line"><span class="comment">// cache : &#x81EA;&#x5B9A;&#x4E49;&#x7F13;&#x5B58;&#x76EE;&#x5F55;&#xFF0C;&#x8BBE;&#x7F6E;&#x7F13;&#x5B58;&#x76EE;&#x5F55;&#x540E;&#xFF0C;&#x7F13;&#x5B58;&#x81EA;&#x52A8;&#x5F00;&#x542F;&#xFF0C;&#x65E0;&#x9700;&#x8BBE;&#x7F6E;cacheEnable</span></span><br><span class="line">&#xB7;&#xB7;&#xB7;</span><br><span class="line"><span class="keyword">new</span> RetrofitUtils.Builder(<span class="keyword">this</span>).baseUrl(BASE_URL).addLog(<span class="keyword">true</span>).cacheEnable(<span class="keyword">true</span>).build();</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x521B;&#x5EFA;&#x8BF7;&#x6C42;</p><ul><li><p>GET</p><figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">new</span> <span class="selector-tag">HttpRequest</span><span class="selector-class">.Builder</span>()<span class="selector-class">.tag</span>(<span class="selector-tag">this</span>)<span class="selector-class">.url</span>(<span class="selector-tag">REQUEST_URL</span>)<span class="selector-class">.build</span>()<span class="selector-class">.get</span>();</span><br></pre></td></tr></tbody></table></figure></li><li><p>POST</p><figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">new</span> <span class="selector-tag">HttpRequest</span><span class="selector-class">.Builder</span>()<span class="selector-class">.tag</span>(<span class="selector-tag">this</span>)<span class="selector-class">.url</span>(<span class="selector-tag">REQUEST_URL</span>)<span class="selector-class">.build</span>()<span class="selector-class">.postForm</span>();</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4E0B;&#x8F7D;</p><figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">new</span> <span class="selector-tag">HttpRequest</span><span class="selector-class">.Builder</span>()<span class="selector-class">.tag</span>(<span class="selector-tag">this</span>)<span class="selector-class">.url</span>(<span class="selector-tag">REQUEST_URL</span>)<span class="selector-class">.build</span>()<span class="selector-class">.download</span>();</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4E0A;&#x4F20;</p><figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">new</span> <span class="selector-tag">HttpRequest</span><span class="selector-class">.Builder</span>()<span class="selector-class">.tag</span>(<span class="selector-tag">this</span>)<span class="selector-class">.url</span>(<span class="selector-tag">REQUEST_URL</span>)<span class="selector-class">.build</span>()<span class="selector-class">.uploadFile</span>();</span><br></pre></td></tr></tbody></table></figure></li></ul></li></ul><h3 id="&#x4F7F;&#x7528;&#x6CE8;&#x610F;"><a href="#&#x4F7F;&#x7528;&#x6CE8;&#x610F;" class="headerlink" title="&#x4F7F;&#x7528;&#x6CE8;&#x610F;"></a>&#x4F7F;&#x7528;&#x6CE8;&#x610F;</h3><ul><li><p>&#x7F13;&#x5B58;&#x9ED8;&#x8BA4;&#x4F4D;&#x7F6E;<code>/sdcard/Android/data/YourPackageName/cache/</code>&#xFF0C;&#x53EF;&#x4EE5;&#x521D;&#x59CB;&#x5316;&#x65F6;&#x81EA;&#x5B9A;&#x4E49;</p></li><li><p>&#x5982;&#x679C;&#x60F3;&#x9488;&#x5BF9;&#x5355;&#x4E2A;&#x8BF7;&#x6C42;&#xFF0C;&#x4E0D;&#x4F7F;&#x7528;&#x7F13;&#x5B58;&#xFF0C;&#x53EF;&#x4EE5;&#x8003;&#x8651;&#x6DFB;&#x52A0;&#x5934;&#x4FE1;&#x606F;<code>mHeaders.put(DOWNLOAD, DOWNLOAD)</code>&#xFF0C;&#x5F53;&#x505A;&#x4E0B;&#x8F7D;&#x8BF7;&#x6C42;&#xFF0C;&#x5219;&#x4E0D;&#x4F1A;&#x4F7F;&#x7528;&#x7F13;&#x5B58;&#x673A;&#x5236;</p></li></ul><h3 id="&#x6DF7;&#x6DC6;"><a href="#&#x6DF7;&#x6DC6;" class="headerlink" title="&#x6DF7;&#x6DC6;"></a>&#x6DF7;&#x6DC6;</h3><figure class="highlight haml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">###-----------&#x4FDD;&#x6301; retrofit client &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span><br><span class="line">-<span class="ruby">keep <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">excellence</span>.<span class="title">retrofit</span>.<span class="title">RetrofitHttpService</span> { *;</span> }</span></span><br><span class="line"><span class="ruby"></span></span><br><span class="line"><span class="ruby"><span class="comment">###-----------&#x4FDD;&#x6301; retrofit &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span></span><br><span class="line"><span class="ruby">-dontwarn retrofit2.**</span></span><br><span class="line"><span class="ruby">-keep <span class="class"><span class="keyword">class</span> <span class="title">retrofit2</span>.** { *;</span> }</span></span><br><span class="line"><span class="ruby">-dontwarn javax.annotation.**</span></span><br><span class="line"><span class="ruby"></span></span><br><span class="line"><span class="ruby"><span class="comment">###-----------&#x4FDD;&#x6301; okhttp &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span></span><br><span class="line"><span class="ruby">-dontwarn com.squareup.okhttp3.**</span></span><br><span class="line"><span class="ruby">-keep <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">squareup</span>.<span class="title">okhttp3</span>.** { *;</span>}</span></span><br><span class="line"><span class="ruby">-dontwarn okio.**</span></span><br></pre></td></tr></tbody></table></figure><h2 id="&#x7248;&#x672C;&#x66F4;&#x65B0;"><a href="#&#x7248;&#x672C;&#x66F4;&#x65B0;" class="headerlink" title="&#x7248;&#x672C;&#x66F4;&#x65B0;"></a>&#x7248;&#x672C;&#x66F4;&#x65B0;</h2><table><thead><tr><th>&#x7248;&#x672C;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td><a href="https://bintray.com/veizhang/maven/retrofit/1.0.5" target="_blank" rel="noopener">1.0.5</a></td><td>&#x5224;&#x65AD;&#x8BF7;&#x6C42;&#x961F;&#x5217;&#x662F;&#x5426;&#x5B58;&#x5728; <strong>2018-10-30</strong></td></tr><tr><td><a href="https://bintray.com/veizhang/maven/retrofit/1.0.4" target="_blank" rel="noopener">1.0.4</a></td><td>&#x53EF;&#x81EA;&#x5B9A;&#x4E49;OkHttp&#xFF0C;&#x5F00;&#x653E;&#x8BF7;&#x6C42;&#x961F;&#x5217;&#x7684;&#x589E;&#x52A0;&#x4E0E;&#x5220;&#x9664; <strong>2018-10-25</strong></td></tr><tr><td><a href="https://bintray.com/veizhang/maven/retrofit/1.0.3" target="_blank" rel="noopener">1.0.3</a></td><td>&#x5F00;&#x653E;retrofit&#x5BF9;&#x8C61;&#xFF0C;&#x53EF;&#x81EA;&#x5B9A;&#x4E49;&#x521B;&#x5EFA;&#x8BF7;&#x6C42;Service <strong>2018-8-1</strong></td></tr><tr><td><a href="https://bintray.com/veizhang/maven/retrofit/1.0.2" target="_blank" rel="noopener">1.0.2</a></td><td>&#x5206;&#x79BB;&#x4E0B;&#x8F7D;&#x5C01;&#x88C5;&#xFF0C;&#x4F18;&#x5316;&#x8BF7;&#x6C42;&#x63A5;&#x53E3; <strong>2018-7-5</strong></td></tr><tr><td><a href="https://bintray.com/veizhang/maven/retrofit/1.0.1" target="_blank" rel="noopener">1.0.1</a></td><td>&#x4F18;&#x5316;&#x8BF7;&#x6C42;&#x548C;&#x65B0;&#x589E;&#x5F02;&#x5E38;&#x5904;&#x7406; <strong>2018-3-13</strong></td></tr><tr><td><a href="https://bintray.com/veizhang/maven/retrofit/1.0.0" target="_blank" rel="noopener">1.0.0</a></td><td>&#x521B;&#x5EFA;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF1A;GET&#x3001;POST&#x3001;&#x4E0B;&#x8F7D;&#x3001;&#x4E0A;&#x4F20; <strong>2017-11-14</strong></td></tr></tbody></table><!-- 网站链接 --><!-- 图片链接 --><!-- 版本 --><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E6%88%91%E8%82%9A%E5%AD%90%E9%87%8C%E6%9C%89%E4%B8%AA%E5%B0%8Fandroid.jpg&quot; alt=&quot;Android&quot; title=&quot;我肚子里有个小android&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;封装Retrofit，统一管理网络请求&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Retrofit" scheme="https://tiimor.cn/tags/Retrofit/"/>
    
      <category term="网络请求" scheme="https://tiimor.cn/tags/%E7%BD%91%E7%BB%9C%E8%AF%B7%E6%B1%82/"/>
    
  </entry>
  
  <entry>
    <title>Android图片加载策略-ImageLoader</title>
    <link href="https://tiimor.cn/Android%E5%9B%BE%E7%89%87%E5%8A%A0%E8%BD%BD%E7%AD%96%E7%95%A5-ImageLoader/"/>
    <id>https://tiimor.cn/Android图片加载策略-ImageLoader/</id>
    <published>2018-12-22T05:24:38.000Z</published>
    <updated>2019-03-17T06:47:42.362Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E6%88%91%E5%B0%B1%E6%98%AF%E6%88%91%EF%BC%8C%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84%E6%88%91.jpg" alt="Android" title="&#x6211;&#x5C31;&#x662F;&#x6211;&#xFF0C;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#x6211;"></p><p><strong>&#x5C01;&#x88C5;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#xFF0C;&#x4EFB;&#x610F;&#x5207;&#x6362;&#x56FE;&#x7247;&#x5E93;</strong></p><a id="more"></a><p><strong><a href="https://github.com/VeiZhang/ImageLoader" title="ImageLoader" target="_blank" rel="noopener">&#x4F20;&#x9001;&#x95E8;</a></strong></p><h2 id="&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x5E93;&#xFF0C;&#x968F;&#x610F;&#x5207;&#x6362;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x6846;&#x67B6;"><a href="#&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x5E93;&#xFF0C;&#x968F;&#x610F;&#x5207;&#x6362;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x6846;&#x67B6;" class="headerlink" title="&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x5E93;&#xFF0C;&#x968F;&#x610F;&#x5207;&#x6362;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x6846;&#x67B6;"></a>&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x5E93;&#xFF0C;&#x968F;&#x610F;&#x5207;&#x6362;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x6846;&#x67B6;</h2><ul><li>Fresco</li><li>Picasso</li><li>Glide</li><li>Universal-ImageLoader</li><li>Volley</li></ul><h2 id="&#x5C01;&#x88C5;"><a href="#&#x5C01;&#x88C5;" class="headerlink" title="&#x5C01;&#x88C5;"></a>&#x5C01;&#x88C5;</h2><ul><li>&#x591A;&#x4E2A;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x5E93;&#x5207;&#x6362;</li><li>&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x8FDB;&#x5EA6;&#x56DE;&#x8C03;</li><li>&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;&#xFF08;&#x5982;&#x5360;&#x4F4D;&#x56FE;&#x7247;&#x3001;&#x9519;&#x8BEF;&#x5360;&#x4F4D;&#x56FE;&#x7247;&#x3001;&#x7F13;&#x5B58;&#x76EE;&#x5F55;&#x3001;&#x5927;&#x5C0F;&#x7B49;&#xFF09;</li><li>&#x6E05;&#x9664;&#x7F13;&#x5B58;</li></ul><h2 id="&#x4F7F;&#x7528;"><a href="#&#x4F7F;&#x7528;" class="headerlink" title="&#x4F7F;&#x7528;"></a>&#x4F7F;&#x7528;</h2><ul><li><p><strong>&#x72EC;&#x7ACB;&#x4F9D;&#x8D56;&#x5E93;</strong></p>  <figure class="highlight clean"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">implementation</span> <span class="string">&apos;com.excellence:imageloader:_latestVersion&apos;</span></span><br><span class="line"><span class="comment">// &#x4E0B;&#x9762;&#x56FE;&#x5E93;&#x4E09;&#x9009;&#x4E00;&#xFF0C;&#x51CF;&#x5C0F;&#x5B89;&#x88C5;&#x5305;&#x5927;&#x5C0F;</span></span><br><span class="line"><span class="keyword">implementation</span> <span class="string">&apos;com.excellence:imageloader-fresco:_latestVersion&apos;</span></span><br><span class="line"><span class="keyword">implementation</span> <span class="string">&apos;com.excellence:imageloader-picasso:_latestVersion&apos;</span></span><br><span class="line"><span class="keyword">implementation</span> <span class="string">&apos;com.excellence:imageloader-glide:_latestVersion&apos;</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x6743;&#x9650;</p>  <figure class="highlight routeros"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">&lt;uses-permission android:<span class="attribute">name</span>=<span class="string">&quot;android.permission.INTERNET&quot;</span>/&gt;</span><br><span class="line">&lt;uses-permission android:<span class="attribute">name</span>=<span class="string">&quot;android.permission.ACCESS_NETWORK_STATE&quot;</span>/&gt;</span><br><span class="line">&lt;uses-permission android:<span class="attribute">name</span>=<span class="string">&quot;android.permission.READ_EXTERNAL_STORAGE&quot;</span>/&gt;</span><br><span class="line">&lt;uses-permission android:<span class="attribute">name</span>=<span class="string">&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;</span>/&gt;</span><br></pre></td></tr></tbody></table></figure></li><li><p>API</p>  <figure class="highlight groovy"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x521D;&#x59CB;&#x5316;&#xFF0C;&#x4E0D;&#x540C;&#x7684;&#x52A0;&#x8F7D;&#x5668;&#xFF0C;&#x6709;&#x90E8;&#x5206;&#x72EC;&#x7ACB;&#x7684;&#x65B9;&#x6CD5;</span></span><br><span class="line"><span class="comment">// &#x53EF;&#x4EE5;&#x81EA;&#x5B9A;&#x4E49;&#x5B9E;&#x73B0;ImageLoader&#x63A5;&#x53E3;&#xFF0C;&#x521B;&#x5EFA;&#x65B0;&#x7684;&#x56FE;&#x5E93;&#x52A0;&#x8F7D;&#x5668;</span></span><br><span class="line">ImageLoaderOptions options = <span class="keyword">new</span> ImageLoaderOptions.Builder().isLogEnable(<span class="literal">true</span>).isCache(<span class="literal">false</span>).build();</span><br><span class="line">mImageLoader = <span class="keyword">new</span> FrescoImageLoader(<span class="keyword">this</span>, options);</span><br><span class="line">mImageLoader = <span class="keyword">new</span> PicassoImageLoader(<span class="keyword">this</span>, options);</span><br><span class="line">mImageLoader = <span class="keyword">new</span> GlideImageLoader(<span class="keyword">this</span>, options);</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x7EDF;&#x4E00;&#x7684;&#x63A5;&#x53E3;</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">interface</span> <span class="title">ImageLoader</span></span></span><br><span class="line"><span class="class">{</span></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * &#x52A0;&#x8F7D;&#x8D44;&#x6E90;&#x56FE;&#x7247;</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> view</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> resId</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> resId);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> resId, IListener listener);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * &#x52A0;&#x8F7D;&#x8D44;&#x6E90;&#x56FE;&#x7247;&#xFF0C;&#x5360;&#x4F4D;&#x56FE;&#x7247;&#xFF0C;&#x9519;&#x8BEF;&#x56FE;&#x7247;</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> view</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> resId</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> placeholderResId</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> errorResId</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> resId, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> placeholderResId, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> errorResId);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> resId, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> placeholderResId, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> errorResId, IListener listener);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * &#x52A0;&#x8F7D;&#x672C;&#x5730;&#x56FE;&#x7247;</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> view</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> file</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@NonNull</span> File file);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@NonNull</span> File file, IListener listener);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * &#x52A0;&#x8F7D;&#x672C;&#x5730;&#x56FE;&#x7247;&#xFF0C;&#x5360;&#x4F4D;&#x56FE;&#x7247;&#xFF0C;&#x9519;&#x8BEF;&#x56FE;&#x7247;</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> view</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> file</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> placeholderResId</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> errorResId</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@NonNull</span> File file, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> placeholderResId, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> errorResId);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@NonNull</span> File file, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> placeholderResId, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> errorResId, IListener listener);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * &#x52A0;&#x8F7D;&#x7F51;&#x7EDC;&#x56FE;&#x7247;</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> view</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> url</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@NonNull</span> String url);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@NonNull</span> String url, IListener listener);</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * &#x52A0;&#x8F7D;&#x7F51;&#x7EDC;&#x56FE;&#x7247;&#xFF0C;&#x5360;&#x4F4D;&#x56FE;&#x7247;&#xFF0C;&#x9519;&#x8BEF;&#x56FE;&#x7247;</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> view</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> url</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> placeholderResId</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> errorResId</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@NonNull</span> String url, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> placeholderResId, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> errorResId);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">void</span> loadImage(<span class="meta">@NonNull</span> ImageView view, <span class="meta">@NonNull</span> String url, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> placeholderResId, <span class="meta">@DrawableRes</span> <span class="keyword">int</span> errorResId, IListener listener);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">void</span> clearCache();</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ul><h2 id="Fresco"><a href="#Fresco" class="headerlink" title="Fresco"></a><a href="https://github.com/facebook/fresco/" target="_blank" rel="noopener">Fresco</a></h2><figure class="highlight gradle"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">implementation <span class="string">&apos;com.facebook.fresco:fresco:1.9.0&apos;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5728; API &lt; 14 &#x4E0A;&#x7684;&#x673A;&#x5668;&#x652F;&#x6301; WebP &#x65F6;&#xFF0C;&#x9700;&#x8981;&#x6DFB;&#x52A0;</span></span><br><span class="line"><span class="keyword">compile</span> <span class="string">&apos;com.facebook.fresco:animated-base-support:0.12.0&apos;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x652F;&#x6301; GIF &#x52A8;&#x56FE;&#xFF0C;&#x9700;&#x8981;&#x6DFB;&#x52A0;</span></span><br><span class="line"><span class="keyword">compile</span> <span class="string">&apos;com.facebook.fresco:animated-gif:0.12.0&apos;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x652F;&#x6301; WebP &#xFF08;&#x9759;&#x6001;&#x56FE;+&#x52A8;&#x56FE;&#xFF09;&#xFF0C;&#x9700;&#x8981;&#x6DFB;&#x52A0;</span></span><br><span class="line"><span class="keyword">compile</span> <span class="string">&apos;com.facebook.fresco:animated-webp:0.12.0&apos;</span></span><br><span class="line"><span class="keyword">compile</span> <span class="string">&apos;com.facebook.fresco:webpsupport:0.12.0&apos;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x4EC5;&#x652F;&#x6301; WebP &#x9759;&#x6001;&#x56FE;&#xFF0C;&#x9700;&#x8981;&#x6DFB;&#x52A0;</span></span><br><span class="line"><span class="keyword">compile</span> <span class="string">&apos;com.facebook.fresco:webpsupport:0.12.0&apos;</span></span><br></pre></td></tr></tbody></table></figure><figure class="highlight abnf"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">Uri uri = Uri.parse(<span class="string">&quot;https://raw.githubusercontent.com/facebook/fresco/gh-pages/static/logo.png&quot;</span>)<span class="comment">;</span></span><br><span class="line">SimpleDraweeView draweeView = (SimpleDraweeView) findViewById(R.id.my_image_view)<span class="comment">;</span></span><br><span class="line">draweeView.setImageURI(uri)<span class="comment">;</span></span><br></pre></td></tr></tbody></table></figure><h2 id="Picasso"><a href="#Picasso" class="headerlink" title="Picasso"></a><a href="https://github.com/square/picasso" target="_blank" rel="noopener">Picasso</a></h2><figure class="highlight 1c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">implementation &apos;com.squareup.picasso:picasso:2.<span class="number">7182</span>8&apos;</span><br></pre></td></tr></tbody></table></figure><figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">Picasso</span><span class="selector-class">.get</span>()</span><br><span class="line">  <span class="selector-class">.load</span>(<span class="selector-tag">url</span>)</span><br><span class="line">  <span class="selector-class">.resize</span>(50, 50)</span><br><span class="line">  <span class="selector-class">.centerCrop</span>()</span><br><span class="line">  <span class="selector-class">.into</span>(<span class="selector-tag">imageView</span>)</span><br></pre></td></tr></tbody></table></figure><p>&#x7F13;&#x5B58;&#x8DEF;&#x5F84;:<code>data/data/your package name/cache/picasso-cache/(&#x9ED8;&#x8BA4;&#x8DEF;&#x5F84;)</code></p><h2 id="Glide"><a href="#Glide" class="headerlink" title="Glide"></a><a href="https://github.com/bumptech/glide/" target="_blank" rel="noopener">Glide</a></h2><figure class="highlight clean"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">implementation</span> <span class="string">&apos;com.github.bumptech.glide:glide:4.8.0&apos;</span></span><br><span class="line">annotationProcessor <span class="string">&apos;com.github.bumptech.glide:compiler:4.8.0&apos;</span></span><br></pre></td></tr></tbody></table></figure><figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">Glide</span><span class="selector-class">.with</span>(<span class="selector-tag">getContext</span>())</span><br><span class="line">                <span class="selector-class">.load</span>(<span class="selector-tag">url</span>)</span><br><span class="line">                <span class="selector-class">.skipMemoryCache</span>(<span class="selector-tag">true</span>)</span><br><span class="line">                <span class="selector-class">.placeholder</span>(<span class="selector-tag">drawable</span>)</span><br><span class="line">                <span class="selector-class">.centerCrop</span>()</span><br><span class="line">                <span class="selector-class">.animate</span>(<span class="selector-tag">animator</span>)</span><br><span class="line">                <span class="selector-class">.into</span>(<span class="selector-tag">img</span>);</span><br></pre></td></tr></tbody></table></figure><h2 id="Universal-ImageLoader"><a href="#Universal-ImageLoader" class="headerlink" title="Universal-ImageLoader"></a><a href="https://github.com/nostra13/Android-Universal-Image-Loader" target="_blank" rel="noopener">Universal-ImageLoader</a></h2><h2 id="Volley"><a href="#Volley" class="headerlink" title="Volley"></a><a href="https://github.com/google/volley/" target="_blank" rel="noopener">Volley</a></h2><h2 id="&#x7248;&#x672C;&#x66F4;&#x65B0;"><a href="#&#x7248;&#x672C;&#x66F4;&#x65B0;" class="headerlink" title="&#x7248;&#x672C;&#x66F4;&#x65B0;"></a>&#x7248;&#x672C;&#x66F4;&#x65B0;</h2><table><thead><tr><th>&#x7248;&#x672C;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td><a href="https://bintray.com/veizhang/maven/imageloader/1.0.0" target="_blank" rel="noopener">1.0.0</a></td><td>&#x5C01;&#x88C5;Fresco&#x3001;Picasso&#x3001;Glide&#x56FE;&#x5E93;&#xFF0C;&#x7B80;&#x5355;&#x52A0;&#x8F7D;&#x56FE;&#x7247;  <strong>2018-10-11</strong></td></tr></tbody></table><h2 id="&#x611F;&#x8C22;"><a href="#&#x611F;&#x8C22;" class="headerlink" title="&#x611F;&#x8C22;"></a>&#x611F;&#x8C22;</h2><blockquote><ul><li><a href="https://github.com/ladingwu/ImageLoaderFramework" title="&#x56FE;&#x5E93;&#x5C01;&#x88C5;" target="_blank" rel="noopener">ladingwu</a></li><li><a href="https://github.com/hpdx/fresco-helper" title="Fresco&#x5C01;&#x88C5;" target="_blank" rel="noopener">hpdx</a></li><li><a href="https://github.com/peng8350/LoadingProgress" title="&#x56FE;&#x5E93;&#x52A0;&#x8F7D;&#x8FDB;&#x5EA6;" target="_blank" rel="noopener">peng8350</a></li></ul></blockquote><!-- 引用网站链接 --><!-- 图片链接 --><!-- 版本 --><!-- 大神引用 --><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E6%88%91%E5%B0%B1%E6%98%AF%E6%88%91%EF%BC%8C%E4%B8%8D%E4%B8%80%E6%A0%B7%E7%9A%84%E6%88%91.jpg&quot; alt=&quot;Android&quot; title=&quot;我就是我，不一样的我&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;封装图片加载，任意切换图片库&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="ImageLoader" scheme="https://tiimor.cn/tags/ImageLoader/"/>
    
  </entry>
  
  <entry>
    <title>RxJava+Retrofit常用的使用场景</title>
    <link href="https://tiimor.cn/RxJava-Retrofit%E5%B8%B8%E7%94%A8%E7%9A%84%E4%BD%BF%E7%94%A8%E5%9C%BA%E6%99%AF/"/>
    <id>https://tiimor.cn/RxJava-Retrofit常用的使用场景/</id>
    <published>2018-12-22T05:18:56.000Z</published>
    <updated>2019-03-17T06:47:42.383Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8Dgoodbye%20my%20love.jpg" alt="Android" title="goodbye my love"></p><p><strong>&#x8BB0;&#x5F55;RxJava + Retrofit&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x7684;&#x4F7F;&#x7528;&#x573A;&#x666F;</strong></p><a id="more"></a><h1 id="&#x7B80;&#x4ECB;"><a href="#&#x7B80;&#x4ECB;" class="headerlink" title="&#x7B80;&#x4ECB;"></a>&#x7B80;&#x4ECB;</h1><p><strong>RxJava&#x662F;&#x975E;&#x5E38;&#x5F3A;&#x5927;&#x7684;&#x51FD;&#x6570;&#x54CD;&#x5E94;&#x5F0F;&#x7F16;&#x7A0B;&#x5E93;&#xFF0C;Retrofit&#x662F;&#x975E;&#x5E38;&#x5F3A;&#x5927;&#x7684;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x6846;&#x67B6;&#x3002;&#x5F3A;&#x5F3A;&#x7ED3;&#x5408;&#xFF0C;&#x6700;&#x4F73;&#x7ED3;&#x5408;&#x4F53;&#x9A8C;&#xFF0C;&#x8BA9;&#x4EE3;&#x7801;&#x66F4;&#x4E1D;&#x6ED1;&#x3002;</strong></p><p>RxJava&#x7684;&#x5F3A;&#x5927;&#xFF0C;&#x4E0D;&#x4EC5;&#x4EC5;&#x662F;&#x7ED3;&#x5408;&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#xFF0C;&#x5728;&#x5176;&#x4ED6;&#x7684;&#x573A;&#x666F;&#xFF0C;&#x5982;&#x6309;&#x94AE;&#x9632;&#x6296;&#x52A8;&#x3001;&#x5B9A;&#x65F6;&#x5668;&#x3001;&#x6570;&#x636E;&#x5E93;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x7B49;&#x7B49;&#xFF0C;&#x5E94;&#x7528;&#x4E5F;&#x975E;&#x5E38;&#x5E7F;&#x6CDB;&#xFF0C;<strong>&#x5F3A;&#x70C8;&#x5EFA;&#x8BAE;&#x5B66;&#x4E60;&#x4F7F;&#x7528;</strong>&#x3002;</p><h1 id="&#x4F7F;&#x7528;&#x573A;&#x666F;"><a href="#&#x4F7F;&#x7528;&#x573A;&#x666F;" class="headerlink" title="&#x4F7F;&#x7528;&#x573A;&#x666F;"></a>&#x4F7F;&#x7528;&#x573A;&#x666F;</h1><h2 id="&#x8F6E;&#x8BE2;&#x8BF7;&#x6C42;"><a href="#&#x8F6E;&#x8BE2;&#x8BF7;&#x6C42;" class="headerlink" title="&#x8F6E;&#x8BE2;&#x8BF7;&#x6C42;"></a>&#x8F6E;&#x8BE2;&#x8BF7;&#x6C42;</h2><ul><li><p>&#x5B9A;&#x65F6;&#x8F6E;&#x8BE2;</p><figure class="highlight typescript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x6BCF;&#x9694;5&#x5206;&#x949F;&#x8BF7;&#x6C42;Token</span></span><br><span class="line">Observable.interval(<span class="number">5</span>, TimeUnit.MINUTES).flatMap(<span class="keyword">new</span> Func1&lt;<span class="built_in">Object</span>, Observable&lt;<span class="built_in">Object</span>&gt;&gt;() {</span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> Observable&lt;<span class="built_in">Object</span>&gt; call(<span class="built_in">Object</span> obj) {</span><br><span class="line"><span class="keyword">return</span> mService.getToken();</span><br><span class="line">}</span><br><span class="line">}).observeOn(AndroidSchedulers.mainThread())</span><br><span class="line">  .subscribeOn(Schedulers.io())</span><br><span class="line">  .subscribe();</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x6761;&#x4EF6;&#x8F6E;&#x8BE2;</p><figure class="highlight typescript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x7ED3;&#x679C;&#x4E0D;&#x4E3A;&#x7A7A;&#x65F6;&#xFF0C;&#x5219;&#x505C;&#x6B62;&#xFF0C;&#x5426;&#x5219;&#x7EE7;&#x7EED;&#x8BF7;&#x6C42;</span></span><br><span class="line">Observable.from(list).flatMap(<span class="keyword">new</span> Func1&lt;<span class="built_in">Object</span>, Observable&lt;<span class="built_in">Object</span>&gt;&gt;() {</span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> Observable&lt;<span class="built_in">Object</span>&gt; call(<span class="built_in">Object</span> obj) {</span><br><span class="line"><span class="keyword">return</span> mService.getToken();</span><br><span class="line">}</span><br><span class="line">}).takeUntil(<span class="keyword">new</span> Func1&lt;Response&lt;<span class="built_in">String</span>&gt;, <span class="built_in">Boolean</span>&gt;() {</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">Boolean</span> call(Response&lt;<span class="built_in">String</span>&gt; result) {</span><br><span class="line">        <span class="keyword">return</span> result.code() == HTTP_OK &amp;&amp; isNotEmpty(result);</span><br><span class="line">    }</span><br><span class="line">}).observeOn(AndroidSchedulers.mainThread())</span><br><span class="line">  .subscribeOn(Schedulers.io())</span><br><span class="line">  .subscribe();</span><br></pre></td></tr></tbody></table></figure></li></ul><h2 id="&#x94FE;&#x5F0F;&#x8BF7;&#x6C42;"><a href="#&#x94FE;&#x5F0F;&#x8BF7;&#x6C42;" class="headerlink" title="&#x94FE;&#x5F0F;&#x8BF7;&#x6C42;"></a>&#x94FE;&#x5F0F;&#x8BF7;&#x6C42;</h2><p>RxJava&#x914D;&#x5408;&#x94FE;&#x5F0F;&#x8BF7;&#x6C42;&#xFF0C;&#x5C31;&#x4E0D;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x5D4C;&#x5957;&#x7684;&#x5F62;&#x52BF;&#xFF0C;&#x4E00;&#x5C42;&#x5D4C;&#x4E00;&#x5C42;&#x5728;&#x56DE;&#x8C03;&#x91CC;&#x53BB;&#x8BF7;&#x6C42;&#x4E86;&#x3002;<br></p><figure class="highlight typescript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x767B;&#x9646; -&gt; &#x8BF7;&#x6C42;Token -&gt; &#x8BF7;&#x6C42;&#x5206;&#x7C7B; -&gt; &#x8BF7;&#x6C42;&#x5217;&#x8868;</span></span><br><span class="line">mService.login(mUrl).flatMap(<span class="keyword">new</span> Func1&lt;<span class="built_in">Object</span>, Observable&lt;<span class="built_in">Object</span>&gt;&gt;() {</span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> Observable&lt;<span class="built_in">Object</span>&gt; call(<span class="built_in">Object</span> obj) {</span><br><span class="line"><span class="keyword">return</span> mService.getToken();</span><br><span class="line">}</span><br><span class="line">}).flatMap(<span class="keyword">new</span> Func1&lt;<span class="built_in">Object</span>, Observable&lt;<span class="built_in">Object</span>&gt;&gt;() {</span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> Observable&lt;<span class="built_in">Object</span>&gt; call(<span class="built_in">Object</span> obj) {</span><br><span class="line"><span class="keyword">return</span> mService.getCategory();</span><br><span class="line">}</span><br><span class="line">}).flatMap(<span class="keyword">new</span> Func1&lt;<span class="built_in">Object</span>, Observable&lt;<span class="built_in">Object</span>&gt;&gt;() {</span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> Observable&lt;<span class="built_in">Object</span>&gt; call(<span class="built_in">Object</span> obj) {</span><br><span class="line"><span class="keyword">return</span> mService.getList();</span><br><span class="line">}</span><br><span class="line">}).observeOn(AndroidSchedulers.mainThread())</span><br><span class="line">  .subscribeOn(Schedulers.io())</span><br><span class="line">  .subscribe();</span><br></pre></td></tr></tbody></table></figure><p></p><h2 id="&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;&#x5408;&#x5E76;"><a href="#&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;&#x5408;&#x5E76;" class="headerlink" title="&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;&#x5408;&#x5E76;"></a>&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;&#x5408;&#x5E76;</h2><figure class="highlight golo"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Observable</span>&lt;Object&gt; observable1 = mServer.getCategory();</span><br><span class="line"><span class="keyword">Observable</span>&lt;Object&gt; observable2 = mServer.getChannel();</span><br><span class="line"></span><br><span class="line"><span class="keyword">Observable</span>.zip(observable1, observable2).subscribe();</span><br></pre></td></tr></tbody></table></figure><h2 id="&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;&#x4E0D;&#x5408;&#x5E76;"><a href="#&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;&#x4E0D;&#x5408;&#x5E76;" class="headerlink" title="&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;&#x4E0D;&#x5408;&#x5E76;"></a>&#x591A;&#x4E2A;&#x8BF7;&#x6C42;&#x7ED3;&#x679C;&#x4E0D;&#x5408;&#x5E76;</h2><p><strong>&#x8BE5;&#x573A;&#x666F;&#x4F1A;&#x5B58;&#x5728;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF0C;&#x5982;&#x679C;&#x4E2D;&#x9014;&#x67D0;&#x4E2A;&#x8BF7;&#x6C42;&#x51FA;&#x73B0;&#x5F02;&#x5E38;&#xFF0C;&#x5219;&#x4F1A;&#x4E2D;&#x65AD;&#xFF0C;&#x540E;&#x7EED;&#x4E0D;&#x518D;&#x8BF7;&#x6C42;&#x3002;&#x6682;&#x65F6;&#x6CA1;&#x6709;&#x60F3;&#x5230;&#x4EC0;&#x4E48;&#x529E;&#x6CD5;&#x907F;&#x514D;&#x6216;&#x8005;&#x662F;&#x51FA;&#x73B0;&#x5F02;&#x5E38;&#x7EE7;&#x7EED;&#x8BF7;&#x6C42;&#x3002;</strong></p><figure class="highlight lasso"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Observable.from(appInfoList).flatMap(<span class="literal">new</span> Func1&lt;AppLog, Observable&lt;LogInfo&gt;&gt;() {</span><br><span class="line">        @Override</span><br><span class="line">        <span class="keyword">public</span> Observable&lt;LogInfo&gt; call(AppLog appLog) {</span><br><span class="line">            <span class="built_in">Map</span>&lt;<span class="built_in">String</span>, <span class="built_in">String</span>&gt; <span class="keyword">params</span> = <span class="literal">new</span> HashMap&lt;&gt;();</span><br><span class="line">            <span class="keyword">return</span> mInstance.mHttpService.registerLog(REGISTER_APP_LOG, <span class="keyword">params</span>);</span><br><span class="line">        }</span><br><span class="line">    }).subscribe();</span><br></pre></td></tr></tbody></table></figure><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8Dgoodbye%20my%20love.jpg&quot; alt=&quot;Android&quot; title=&quot;goodbye my love&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;记录RxJava + Retrofit一些常用的使用场景&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="RxJava" scheme="https://tiimor.cn/tags/RxJava/"/>
    
      <category term="Retrofit" scheme="https://tiimor.cn/tags/Retrofit/"/>
    
  </entry>
  
  <entry>
    <title>Android功守道-so库混淆加密</title>
    <link href="https://tiimor.cn/Android%E5%8A%9F%E5%AE%88%E9%81%93-so%E5%BA%93%E6%B7%B7%E6%B7%86%E5%8A%A0%E5%AF%86/"/>
    <id>https://tiimor.cn/Android功守道-so库混淆加密/</id>
    <published>2018-12-22T05:17:04.000Z</published>
    <updated>2019-03-17T06:47:42.360Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8Dcolorful%20android.jpg" alt="Android" title="colorful android"></p><p><strong>Android NDK&#x5F00;&#x53D1;&#x4E2D;&#x52A0;&#x5BC6;so&#x5E93;&#xFF0C;&#x65E8;&#x4E3A;&#x4FDD;&#x62A4;&#x81EA;&#x5DF1;&#x7684;&#x5F00;&#x53D1;&#x6210;&#x679C;&#x3002;</strong></p><a id="more"></a><h1 id="so&#x53CD;&#x7F16;&#x8BD1;"><a href="#so&#x53CD;&#x7F16;&#x8BD1;" class="headerlink" title="so&#x53CD;&#x7F16;&#x8BD1;"></a>so&#x53CD;&#x7F16;&#x8BD1;</h1><p>&#x4F7F;&#x7528;<strong><a href="https://baike.baidu.com/item/IDA%20Pro/3175923?fr=aladdin" target="_blank" rel="noopener">IDA</a></strong>&#x5DE5;&#x5177;&#x53CD;&#x7F16;&#x8BD1;so&#x6587;&#x4EF6;&#xFF0C;&#x7834;&#x89E3;&#x5206;&#x6790;&#x65F6;&#xFF0C;&#x5F88;&#x5BB9;&#x6613;&#x67E5;&#x770B;&#x5230;so&#x6587;&#x4EF6;&#x91CC;&#xFF0C;&#x88AB;Java&#x5C42;&#x8C03;&#x7528;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x4EE5;&#x53CA;&#x4E00;&#x4E9B;&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;&#x7B49;&#x7B49;&#x4FE1;&#x606F;&#xFF0C;&#x8FDB;&#x4E00;&#x6B65;&#x7834;&#x89E3;&#x5E94;&#x7528;&#x4EE3;&#x7801;&#x3002;<br>&#x4F46;&#x662F;&#x8FD9;&#x79CD;&#x662F;&#x6211;&#x4EEC;&#x4E0D;&#x60F3;&#x89C1;&#x5230;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x5E0C;&#x671B;&#x628A;&#x4E00;&#x4E9B;&#x6838;&#x5FC3;&#x529F;&#x80FD;&#x6216;&#x8005;&#x6570;&#x636E;&#x52A0;&#x5BC6;&#xFF0C;&#x5982;key&#xFF0C;&#x8FD9;&#x5C31;&#x5F15;&#x5165;&#x4E86;so&#x6587;&#x4EF6;&#x52A0;&#x56FA;&#x3002;</p><h1 id="so&#x52A0;&#x56FA;"><a href="#so&#x52A0;&#x56FA;" class="headerlink" title="so&#x52A0;&#x56FA;"></a>so&#x52A0;&#x56FA;</h1><p>&#x539F;&#x7406;&#xFF1A;JNI_OnLoad&#x65B9;&#x6CD5;&#xFF0C;&#x5F53;&#x5728;&#x7CFB;&#x7EDF;&#x4E2D;&#x8C03;&#x7528;System.loadLibrary&#x51FD;&#x6570;&#x65F6;&#xFF0C;&#x8BE5;&#x51FD;&#x6570;&#x4F1A;&#x627E;&#x5230;&#x5BF9;&#x5E94;&#x7684;&#x52A8;&#x6001;&#x5E93;&#xFF0C;&#x7136;&#x540E;&#x9996;&#x5148;&#x8BD5;&#x56FE;&#x627E;&#x5230;&#x201D;JNI_OnLoad&#x201D;&#x51FD;&#x6570;&#xFF0C;&#x5982;&#x679C;&#x8BE5;&#x51FD;&#x6570;&#x5B58;&#x5728;&#xFF0C;&#x5219;&#x8C03;&#x7528;&#x5B83;&#x3002;JNI_OnLoad&#x53EF;&#x4EE5;&#x548C;JNIEnv&#x7684;registerNatives&#x51FD;&#x6570;&#x7ED3;&#x5408;&#x8D77;&#x6765;&#xFF0C;&#x5B9E;&#x73B0;&#x52A8;&#x6001;&#x7684;&#x51FD;&#x6570;&#x66FF;&#x6362;&#x3002;</p><ol><li><p>CMakeList&#x5F00;&#x542F;&#x914D;&#x7F6E;&#xFF0C;&#x9690;&#x85CF;&#x7B26;&#x53F7;&#x8868;<br> &#x7F16;&#x8F91;Android Studio&#x5DE5;&#x5177;&#x7684;CMakeList&#x6587;&#x4EF6;&#xFF0C;&#x6DFB;&#x52A0;&#x4E0B;&#x9762;&#x4E24;&#x4E2A;&#x8BED;&#x53E5;&#xFF1A;</p> <figure class="highlight applescript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">set</span>(CMAKE_C_VISIBILITY_PRESET hidden)<span class="comment"># C&#x8BED;&#x8A00;&#x5199;&#x6CD5;</span></span><br><span class="line"><span class="keyword">set</span>(CMAKE_CXX_VISIBILITY_PRESET hidden)<span class="comment"># C++&#x5199;&#x6CD5;</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x6CE8;&#x518C;JNI_OnLoad&#x65B9;&#x6CD5;&#xFF0C;&#x51FD;&#x6570;&#x5BF9;&#x7167;&#x8868;</p><ul><li><p>&#x8BB0;&#x5F55;&#x8C03;&#x7528;C&#x4EE3;&#x7801;&#x7684;Java&#x6587;&#x4EF6;&#x8DEF;&#x5F84;</p><figure class="highlight cpp"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">static</span> <span class="keyword">const</span> <span class="keyword">char</span> *JNI_REG_CLASS = <span class="string">&quot;com/excellence/test/tool/KeyUtils&quot;</span>;</span><br></pre></td></tr></tbody></table></figure></li><li><p>gMethods&#x65B9;&#x6CD5;&#x66FF;&#x6362;<br>&#x5C06;native&#x65B9;&#x6CD5;getKey&#xFF0C;&#x6307;&#x5411;gK&#xFF0C;&#x8FD9;&#x6837;&#x53CD;&#x7F16;&#x8BD1;&#x5C31;&#x67E5;&#x4E0D;&#x5230;getKey&#x65B9;&#x6CD5;&#x3002;</p><figure class="highlight actionscript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">static</span> JNINativeMethod gMethods[] = {</span><br><span class="line">       {<span class="string">&quot;getKey&quot;</span>, <span class="string">&quot;(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;&quot;</span>, (<span class="keyword">void</span> *) gK},</span><br><span class="line">};</span><br></pre></td></tr></tbody></table></figure><p>JNINativemethod&#x4E2D;&#x7ED3;&#x6784;&#x4F53;&#x7684;&#x5B9A;&#x4E49;&#xFF1A;</p><figure class="highlight cpp"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> {</span></span><br><span class="line"><span class="comment">// Java&#x4E2D;&#x51FD;&#x6570;&#x7684;&#x540D;&#x5B57;</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* name;</span><br><span class="line"><span class="comment">// &#x63CF;&#x8FF0;&#x4E86;Java&#x4E2D;&#x51FD;&#x6570;&#x7684;&#x53C2;&#x6570;&#x548C;&#x8FD4;&#x56DE;&#x503C;</span></span><br><span class="line"><span class="keyword">const</span> <span class="keyword">char</span>* signature;  </span><br><span class="line"><span class="comment">// fnPtr&#x662F;&#x51FD;&#x6570;&#x6307;&#x9488;&#xFF0C;&#x6307;&#x5411;native&#x51FD;&#x6570;&#x3002;&#x524D;&#x9762;&#x90FD;&#x8981;&#x63A5; (void *)</span></span><br><span class="line"><span class="keyword">void</span>* fnPtr;  </span><br><span class="line">} JNINativeMethod;</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x5728;JNI&#x8C03;&#x7528;&#x7684;C&#x6587;&#x4EF6;&#x91CC;&#x6CE8;&#x518C;</p><figure class="highlight cpp"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">int</span> <span class="title">registerNativeMethods</span><span class="params">(JNIEnv *env, <span class="keyword">const</span> <span class="keyword">char</span> *className, </span></span></span><br><span class="line"><span class="function"><span class="params">JNINativeMethod *gMethods, <span class="keyword">int</span> numMethods)</span> </span>{</span><br><span class="line">    jclass clazz;</span><br><span class="line">    clazz = env-&gt;FindClass(className);</span><br><span class="line">    <span class="keyword">if</span> (clazz == <span class="literal">NULL</span>) {</span><br><span class="line">        <span class="keyword">return</span> JNI_FALSE;</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">if</span> (env-&gt;RegisterNatives(clazz, gMethods, numMethods) &lt; <span class="number">0</span>) {</span><br><span class="line">        <span class="keyword">return</span> JNI_FALSE;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> JNI_TRUE;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">static</span> <span class="keyword">int</span> <span class="title">registerNatives</span><span class="params">(JNIEnv *env)</span> </span>{</span><br><span class="line">    <span class="keyword">if</span> (!registerNativeMethods(env, JNI_REG_CLASS, gMethods,</span><br><span class="line">                               <span class="keyword">sizeof</span>(gMethods) / <span class="keyword">sizeof</span>(gMethods[<span class="number">0</span>])))</span><br><span class="line">        <span class="keyword">return</span> JNI_FALSE;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> JNI_TRUE;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function">jint <span class="title">JNI_OnLoad</span><span class="params">(JavaVM *vm, <span class="keyword">void</span> *reserved)</span> </span>{</span><br><span class="line">    JNIEnv *env;</span><br><span class="line">    <span class="keyword">if</span> (vm-&gt;GetEnv((<span class="keyword">void</span> **) (&amp;env), JNI_VERSION_1_6) != JNI_OK) {</span><br><span class="line">        <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">    }</span><br><span class="line">    assert(env != <span class="literal">NULL</span>);</span><br><span class="line"></span><br><span class="line">    <span class="comment">//&#x6CE8;&#x518C;</span></span><br><span class="line">    <span class="keyword">if</span> (!registerNatives(env)) {</span><br><span class="line">        <span class="keyword">return</span> <span class="number">-1</span>;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> JNI_VERSION_1_6;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ul></li></ol><p><strong>&#x8FD9;&#x6837;&#x52A0;&#x56FA;&#x4E86;so&#x6587;&#x4EF6;&#xFF0C;&#x5C31;&#x53EF;&#x4EE5;&#x505A;&#x5230;&#x4E00;&#x5B9A;&#x7684;&#x4FDD;&#x62A4;&#x4F5C;&#x7528;&#xFF0C;&#x4F7F;&#x7528;IDA&#x5DE5;&#x5177;&#x67E5;&#x770B;&#xFF0C;&#x4F1A;&#x8D77;&#x5230;&#x6DF7;&#x6DC6;&#x7684;&#x4F5C;&#x7528;&#x3002;</strong></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8Dcolorful%20android.jpg&quot; alt=&quot;Android&quot; title=&quot;colorful android&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Android NDK开发中加密so库，旨为保护自己的开发成果。&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Android" scheme="https://tiimor.cn/tags/Android/"/>
    
      <category term="混淆" scheme="https://tiimor.cn/tags/%E6%B7%B7%E6%B7%86/"/>
    
  </entry>
  
  <entry>
    <title>AndroidFFmpeg命令使用</title>
    <link href="https://tiimor.cn/AndroidFFmpeg%E5%91%BD%E4%BB%A4%E4%BD%BF%E7%94%A8/"/>
    <id>https://tiimor.cn/AndroidFFmpeg命令使用/</id>
    <published>2018-09-01T08:18:05.000Z</published>
    <updated>2019-03-17T06:47:42.355Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E6%B0%B4%E7%9A%84%E4%B8%96%E7%95%8C%EF%BC%8C%E6%88%91%E7%9F%A5%E9%81%93.jpg" alt="Android" title="&#x6C34;&#x7684;&#x4E16;&#x754C;&#xFF0C;&#x6211;&#x77E5;&#x9053;"></p><p><strong>FFmpeg&#x547D;&#x4EE4;&#x5728;Android&#x4E2D;&#x7684;&#x4F7F;&#x7528;</strong> </p><a id="more"></a><p>&#x9879;&#x76EE;&#x4F20;&#x9001;&#x95E8;&#xFF1A;<a href="https://github.com/VeiZhang/AndroidFFmpeg" target="_blank" rel="noopener">FFmpeg for Android</a></p><figure class="highlight clean"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">implementation</span> <span class="string">&apos;com.excellence:ffmpeg:_latestVersion&apos;</span></span><br></pre></td></tr></tbody></table></figure><h2 id="AndroidFFmpeg&#x4F7F;&#x7528;"><a href="#AndroidFFmpeg&#x4F7F;&#x7528;" class="headerlink" title="AndroidFFmpeg&#x4F7F;&#x7528;"></a>AndroidFFmpeg&#x4F7F;&#x7528;</h2><figure class="highlight lasso"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x521D;&#x59CB;&#x5316;&#xFF0C;&#x9ED8;&#x8BA4;&#xFF1A;&#x4E0D;&#x9650;&#x5236;&#x5E76;&#x53D1;&#x7EBF;&#x7A0B;&#x6570;&#xFF1B;&#x6307;&#x4EE4;&#x8D85;&#x65F6;10s&#x7EC8;&#x6B62;</span></span><br><span class="line">FFmpeg.init(context);</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x81EA;&#x5B9A;&#x4E49;&#x521D;&#x59CB;&#x5316;&#x53C2;&#x6570;&#xFF1A;&#x8D85;&#x65F6;1s&#x7EC8;&#x6B62;</span></span><br><span class="line">FFmpeg.init(context, <span class="literal">new</span> CommanderOptions.Builder().setTimeOut(<span class="number">1000</span>).build())</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x83B7;&#x53D6;FFmpeg&#x5DE5;&#x5177;&#x8DEF;&#x5F84;</span></span><br><span class="line">FFmpeg.checkFFmpeg()</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x521B;&#x5EFA;&#x6267;&#x884C;&#x547D;&#x4EE4;</span></span><br><span class="line">FFmpeg.addTask(cmd, <span class="literal">new</span> IListener() {</span><br><span class="line">    @Override</span><br><span class="line">    <span class="keyword">public</span> <span class="literal">void</span> onPre(<span class="built_in">String</span> command) {</span><br><span class="line">        <span class="keyword">Log</span>.i(<span class="built_in">TAG</span>, <span class="string">&quot;onPre: &quot;</span> + command);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    @Override</span><br><span class="line">    <span class="keyword">public</span> <span class="literal">void</span> onProgress(<span class="built_in">String</span> message) {</span><br><span class="line">        <span class="keyword">Log</span>.i(<span class="built_in">TAG</span>, <span class="string">&quot;onProgress: &quot;</span> + message);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    @Override</span><br><span class="line">    <span class="keyword">public</span> <span class="literal">void</span> onError(Throwable t) {</span><br><span class="line">        t.printStackTrace();</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    @Override</span><br><span class="line">    <span class="keyword">public</span> <span class="literal">void</span> onSuccess(<span class="built_in">String</span> message) {</span><br><span class="line">        <span class="keyword">Log</span>.i(<span class="built_in">TAG</span>, <span class="string">&quot;onSuccess: &quot;</span> + message);</span><br><span class="line">    }</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x7EC8;&#x6B62;&#x547D;&#x4EE4;</span></span><br><span class="line">CommandTask.discard()</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x7EC8;&#x6B62;&#x6240;&#x6709;&#x547D;&#x4EE4;</span></span><br><span class="line">FFmpeg.destroy()</span><br></pre></td></tr></tbody></table></figure><h2 id="FFmpeg&#x547D;&#x4EE4;"><a href="#FFmpeg&#x547D;&#x4EE4;" class="headerlink" title="FFmpeg&#x547D;&#x4EE4;"></a>FFmpeg&#x547D;&#x4EE4;</h2><p><a href="http://ffmpeg.org/" target="_blank" rel="noopener">FFMpeg&#x5B98;&#x7F51;</a></p><p><a href="https://ffmpeg.zeranoe.com/builds/" target="_blank" rel="noopener">Windows&#x5DE5;&#x5177;&#x4E0B;&#x8F7D;</a>&#xFF0C;&#x89E3;&#x538B;&#x540E;&#xFF0C;&#x628A;FFmpeg&#x52A0;&#x5165;&#x5230;&#x73AF;&#x5883;&#x53D8;&#x91CF;&#x4E2D;&#xFF0C;&#x53EF;&#x5728;Windows&#x4E0A;&#x4F7F;&#x7528;FFmpeg</p><h3 id="&#x547D;&#x4EE4;&#x9009;&#x9879;"><a href="#&#x547D;&#x4EE4;&#x9009;&#x9879;" class="headerlink" title="&#x547D;&#x4EE4;&#x9009;&#x9879;"></a>&#x547D;&#x4EE4;&#x9009;&#x9879;</h3><ul><li><p>&#x9009;&#x9879;&#x53C2;&#x6570;</p><p>  &#x57FA;&#x672C;&#x8BED;&#x6CD5;&#x683C;&#x5F0F;&#xFF1A;</p>  <figure class="highlight prolog"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}...</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x5E38;&#x7528;&#x9009;&#x9879;</p>  <figure class="highlight diff"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="deletion">-version:   &#x663E;&#x793A;&#x7248;&#x672C;&#x4FE1;&#x606F;&#x3002;</span></span><br><span class="line"></span><br><span class="line"><span class="deletion">-formats:   &#x663E;&#x793A;&#x6240;&#x6709;&#x6709;&#x6548;&#x7684;&#x683C;&#x5F0F;&#x3002;</span></span><br><span class="line"></span><br><span class="line"><span class="deletion">-decoders:  &#x663E;&#x793A;&#x6240;&#x6709;&#x6709;&#x6548;&#x89E3;&#x7801;&#x5668;&#x3002;</span></span><br><span class="line"></span><br><span class="line"><span class="deletion">-encoders:  &#x663E;&#x793A;&#x6240;&#x6709;&#x6709;&#x6548;&#x7684;&#x7F16;&#x7801;&#x5668;&#x3002;</span></span><br><span class="line"></span><br><span class="line"><span class="deletion">-bsfs:      &#x663E;&#x793A;&#x6709;&#x6548;&#x7684;&#x6570;&#x636E;&#x6D41;&#x6EE4;&#x955C;&#x3002;</span></span><br><span class="line"></span><br><span class="line"><span class="deletion">-pix_fmts:  &#x663E;&#x793A;&#x6709;&#x6548;&#x7684;&#x50CF;&#x7D20;&#x683C;&#x5F0F;&#x3002;</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4E3B;&#x8981;&#x9009;&#x9879;</p>  <figure class="highlight less"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">-f</span> <span class="selector-tag">fmt</span>(input|output):      &#x6307;&#x5B9A;&#x8F93;&#x5165;&#x6216;&#x8005;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x683C;&#x5F0F;&#xFF0C;&#x53EF;&#x4F9D;&#x636E;&#x6269;&#x5C55;&#x540D;&#x81EA;&#x52A8;&#x6307;&#x5B9A;&#x3002;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">-i</span> <span class="selector-tag">filename</span>(input):        &#x6307;&#x5B9A;&#x8F93;&#x5165;&#x6587;&#x4EF6;&#x3002;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">-y</span> (global):               &#x9ED8;&#x8BA4;&#x81EA;&#x52A8;&#x8986;&#x76D6;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x3002;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">-n</span> (global):               &#x4E0D;&#x8986;&#x76D6;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#xFF0C;&#x5982;&#x679C;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x5DF2;&#x5B58;&#x5728;&#x5219;&#x7ACB;&#x5373;&#x9000;&#x51FA;&#x3002;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">-t</span> <span class="selector-tag">duration</span>(input|output): &#x9650;&#x5236;&#x8F93;&#x5165;&#xFF0F;&#x8F93;&#x51FA;&#x7684;&#x65F6;&#x95F4;&#x3002;</span><br><span class="line">                           &#x5982;&#x679C;&#x7528;&#x4E8E;&#x8F93;&#x5165;&#x9009;&#x9879;&#xFF0C;&#x5C31;&#x662F;&#x9650;&#x5B9A;&#x4ECE;&#x8F93;&#x5165;&#x4E2D;&#x8BFB;&#x53D6;&#x591A;&#x5C11;&#x65F6;&#x95F4;&#x7684;&#x6570;&#x636E;&#xFF1B;</span><br><span class="line">                           &#x5982;&#x679C;&#x7528;&#x4E8E;&#x8F93;&#x51FA;&#x9009;&#x9879;&#xFF0C;&#x5219;&#x8868;&#x793A;&#x5199;&#x5165;&#x591A;&#x5C11;&#x65F6;&#x95F4;&#x6570;&#x636E;&#x540E;&#x5C31;&#x505C;&#x6B62;&#x3002;</span><br><span class="line">                           <span class="selector-tag">duration</span> &#x53EF;&#x4EE5;&#x662F;&#x4EE5;&#x79D2;&#x4E3A;&#x5355;&#x4F4D;&#x7684;&#x6570;&#x503C;&#x6D3B;&#x7740; <span class="selector-tag">hh</span><span class="selector-pseudo">:mm</span><span class="selector-pseudo">:ss</span><span class="selector-attr">[.xxx]</span> &#x683C;&#x5F0F;&#x7684;&#x65F6;&#x95F4;&#x503C;&#x3002;</span><br><span class="line">                           <span class="selector-tag">-to</span> &#x548C; <span class="selector-tag">-t</span> &#x662F;&#x4E92;&#x65A5;&#x7684;&#xFF0C;<span class="selector-tag">-t</span> &#x6709;&#x66F4;&#x9AD8;&#x7684;&#x4F18;&#x5148;&#x7EA7;&#x3002;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">-to</span> <span class="selector-tag">time_stop</span>(output):     &#x5199;&#x5165; <span class="selector-tag">time_stop</span> &#x65F6;&#x95F4;&#x540E;&#x5C31;&#x505C;&#x6B62;&#x3002;</span><br><span class="line">                           <span class="selector-tag">time_stop</span> &#x53EF;&#x4EE5;&#x662F;&#x4EE5;&#x79D2;&#x4E3A;&#x5355;&#x4F4D;&#x7684;&#x6570;&#x503C;&#x6216;&#x8005; <span class="selector-tag">hh</span><span class="selector-pseudo">:mm</span><span class="selector-pseudo">:ss</span><span class="selector-attr">[.xxx]</span> &#x683C;&#x5F0F;&#x7684;&#x65F6;&#x95F4;&#x503C;&#x3002;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">-fs</span> <span class="selector-tag">limit_size</span>(output):    &#x8BBE;&#x7F6E;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x5927;&#x5C0F;&#x9650;&#x5236;&#xFF0C;&#x5355;&#x4F4D;&#x662F;&#x5B57;&#x8282;&#xFF08;<span class="selector-tag">bytes</span>&#xFF09;&#x3002;</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">-ss</span> <span class="selector-tag">time_off</span>(input|output): &#x6307;&#x5B9A;&#x8F93;&#x5165;&#x6587;&#x4EF6;&#x6216;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x7684;&#x5F00;&#x59CB;&#x4F4D;&#x7F6E;&#x3002;</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x89C6;&#x9891;&#x9009;&#x9879;</p>  <figure class="highlight lua"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">-vframes number(<span class="built_in">output</span>): &#x8BBE;&#x7F6E;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x7684;&#x5E27;&#x6570;&#x3002;</span><br><span class="line"></span><br><span class="line">-r rate(<span class="built_in">input</span>|<span class="built_in">output</span>):   &#x8BBE;&#x7F6E;&#x5E27;&#x7387;&#xFF08;Hz &#x503C;&#xFF09;&#x3002;</span><br><span class="line"></span><br><span class="line">-s size(<span class="built_in">input</span>|<span class="built_in">output</span>):   &#x8BBE;&#x7F6E;&#x5E27;&#x7684;&#x5C3A;&#x5BF8;&#x3002;&#x6570;&#x636E;&#x683C;&#x5F0F;&#x662F; WxH&#xFF0C;&#x5373;&#x5BBD;&#x5EA6;&#x503C;x&#x9AD8;&#x5EA6;&#x503C;&#x3002;</span><br><span class="line"></span><br><span class="line">-aspect aspect(<span class="built_in">output</span>):  &#x6307;&#x5B9A;&#x89C6;&#x9891;&#x7684;&#x957F;&#x5BBD;&#x663E;&#x793A;&#x6BD4;&#x4F8B;&#x3002;&#x683C;&#x5F0F;&#x4E3A;&#x6D6E;&#x70B9;&#x6570;&#x5B57;&#x7B26;&#x4E32;&#x6216;&#x8005; num:den &#x683C;&#x5F0F;&#x5B57;&#x7B26;&#x4E32;&#x3002;</span><br><span class="line">                         &#x5982;<span class="string">&quot;4:3&quot;</span>&#xFF0C;<span class="string">&quot;16:9&quot;</span>&#xFF0C;<span class="string">&quot;1.333&quot;</span>&#x7B49;&#x3002;</span><br><span class="line"></span><br><span class="line">-vcodec codec(<span class="built_in">output</span>):   &#x8BBE;&#x7F6E;&#x89C6;&#x9891;&#x7F16;&#x7801;&#x5668;&#x3002;</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x97F3;&#x9891;&#x9009;&#x9879;</p>  <figure class="highlight lua"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">-aframes number(<span class="built_in">output</span>): &#x8BBE;&#x7F6E;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x7684;&#x5E27;&#x6570;&#x3002;</span><br><span class="line"></span><br><span class="line">-ar rate(<span class="built_in">input</span>|<span class="built_in">output</span>): &#x8BBE;&#x7F6E;&#x97F3;&#x9891;&#x7684;&#x91C7;&#x6837;&#x7387;&#xFF0C;&#x5355;&#x4F4D;&#x4E3A; Hz&#x3002;</span><br><span class="line"></span><br><span class="line">-aq quality(<span class="built_in">output</span>): &#x8BBE;&#x7F6E;&#x97F3;&#x9891;&#x54C1;&#x8D28;&#xFF08;&#x7F16;&#x7801;&#x6307;&#x5B9A;&#x4E3A; VBR&#xFF09;&#x3002;</span><br><span class="line"></span><br><span class="line">-ac channels(<span class="built_in">input</span>|<span class="built_in">output</span>): &#x8BBE;&#x7F6E;&#x97F3;&#x9891;&#x901A;&#x9053;&#x6570;&#x3002;</span><br><span class="line"></span><br><span class="line">-af filtergraph(<span class="built_in">output</span>): &#x5BF9;&#x97F3;&#x9891;&#x4F7F;&#x7528; filtergraph &#x6EE4;&#x955C;&#x6548;&#x679C;&#x3002;</span><br></pre></td></tr></tbody></table></figure></li></ul><h3 id="&#x5E38;&#x7528;&#x547D;&#x4EE4;"><a href="#&#x5E38;&#x7528;&#x547D;&#x4EE4;" class="headerlink" title="&#x5E38;&#x7528;&#x547D;&#x4EE4;"></a>&#x5E38;&#x7528;&#x547D;&#x4EE4;</h3><ul><li><p>&#x83B7;&#x53D6;&#x89C6;&#x9891;&#x4FE1;&#x606F;</p>  <figure class="highlight mipsasm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ffprobe -v quiet -print_format <span class="keyword">json </span>-<span class="keyword">show_format </span>-<span class="keyword">show_streams </span>inputfile</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x89C6;&#x9891;&#x622A;&#x56FE;</p>  <figure class="highlight avrasm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">ffmpeg -i input_file -<span class="built_in">y</span> -f mjpeg -ss <span class="number">1</span> -t <span class="number">0.001</span> -s widthxheight output_file</span><br><span class="line"></span><br><span class="line"><span class="symbol">i:</span> &#x6E90;&#x6587;&#x4EF6;</span><br><span class="line"><span class="symbol">y:</span> &#x8986;&#x76D6;&#x8F93;&#x51FA;&#x6587;&#x4EF6;</span><br><span class="line"><span class="symbol">f:</span> &#x622A;&#x56FE;&#x683C;&#x5F0F;</span><br><span class="line"><span class="symbol">ss:</span> &#x8D77;&#x59CB;&#x4F4D;&#x7F6E;&#xFF0C;&#x5355;&#x4F4D;&#x79D2;</span><br><span class="line"><span class="symbol">t:</span> &#x622A;&#x56FE;&#x65F6;&#x95F4;&#xFF0C;&#x5355;&#x4F4D;&#x79D2;</span><br><span class="line"><span class="symbol">s:</span> &#x56FE;&#x7247;&#x5BBD;<span class="built_in">x</span>&#x9AD8;</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x6BCF;&#x9694; 1 &#x79D2;&#x622A;&#x4E00;&#x5F20;&#x56FE;</p>  <figure class="highlight matlab"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ffmpeg -<span class="built_in">i</span> input.mp4 -f image2 -vf fps=fps=<span class="number">1</span> out<span class="comment">%d.jpg</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x6BCF;&#x9694; 20 &#x79D2;&#x622A;&#x4E00;&#x5F20;&#x56FE;</p>  <figure class="highlight lsl"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ffmpeg -i input.mp4 -f image2 -vf fps=fps=<span class="number">1</span>/<span class="number">20</span> out%d.jpg</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x5C06;&#x89C6;&#x9891;&#x7684;&#x524D; 30 &#x5E27;&#x8F6C;&#x6362;&#x6210;&#x4E00;&#x4E2A; Gif</p>  <figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ffmpeg -<span class="selector-tag">i</span> <span class="selector-tag">input</span><span class="selector-class">.mp4</span> -vframes <span class="number">30</span> -y -f gif output.gif</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4ECE;&#x89C6;&#x9891;&#x4E2D;&#x751F;&#x6210; Gif</p>  <figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ffmpeg -<span class="selector-tag">i</span> <span class="selector-tag">input</span><span class="selector-class">.mp4</span> -t <span class="number">10</span> -pix_fmt rgb24 output.gif</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x8F6C;&#x6362;&#x89C6;&#x9891;&#x4E3A;&#x56FE;&#x7247;&#xFF08;&#x6BCF;&#x5E27;&#x4E00;&#x5F20;&#x56FE;)</p>  <figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">ffmpeg</span> <span class="selector-tag">-i</span> <span class="selector-tag">input</span><span class="selector-class">.mp4</span> <span class="selector-tag">out</span>%<span class="selector-tag">d</span><span class="selector-class">.jpg</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x56FE;&#x7247;&#x8F6C;&#x6362;&#x4E3A;&#x89C6;&#x9891;</p>  <figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">ffmpeg</span> <span class="selector-tag">-f</span> <span class="selector-tag">image2</span> <span class="selector-tag">-i</span> <span class="selector-tag">out</span>%<span class="selector-tag">d</span><span class="selector-class">.jpg</span> <span class="selector-tag">-r</span> 25 <span class="selector-tag">video</span><span class="selector-class">.mp4</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x63D0;&#x53D6;&#x89C6;&#x9891;&#x7684;&#x5173;&#x952E;&#x5E27;</p>  <figure class="highlight llvm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ffmpeg -i input.mp<span class="number">4</span> -vf <span class="keyword">select</span>=&apos;<span class="keyword">eq</span>(pict_type\,I)&apos; -vsync <span class="number">2</span> -s <span class="number">160</span><span class="keyword">x</span><span class="number">90</span> -f image<span class="number">2</span> out-<span class="symbol">%02</span>d.jpeg</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x5206;&#x89E3;&#x89C6;&#x9891;&#x97F3;&#x9891;&#x6D41;</p>  <figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x5206;&#x79BB;&#x89C6;&#x9891;&#x6D41;</span></span><br><span class="line">ffmpeg -<span class="selector-tag">i</span> input_file -vcodec copy -an output_file_video</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5206;&#x79BB;&#x97F3;&#x9891;&#x6D41;</span></span><br><span class="line">ffmpeg -<span class="selector-tag">i</span> input_file -vcodec copy -vn output_file_audio</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x89C6;&#x9891;&#x8F6C;&#x7801;</p>  <figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x8F6C;&#x7801;&#x4E3A;&#x7801;&#x6D41;&#x539F;&#x59CB;&#x6587;&#x4EF6;</span></span><br><span class="line">ffmpeg -<span class="selector-tag">i</span> <span class="selector-tag">input</span><span class="selector-class">.mp4</span> -vcodec h264 -an -f m4v test.<span class="number">264</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x89C6;&#x9891;&#x5C01;&#x88C5;</p>  <figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ffmpeg -<span class="selector-tag">i</span> video_file -<span class="selector-tag">i</span> audio_file -vcodec copy -acodec copy output_file</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x89C6;&#x9891;&#x5F55;&#x5236;</p>  <figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x5F55;&#x5236;&#x89C6;&#x9891;&#x6D41;</span></span><br><span class="line">ffmpeg -<span class="selector-tag">i</span> rtsp:<span class="comment">//hostname/stream -vcodec copy output.avi</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x901A;&#x8FC7;&#x7535;&#x8111;&#x6444;&#x50CF;&#x5934;&#x5F55;&#x5236;</span></span><br><span class="line">ffmpeg -f avfoundation -framerate <span class="number">30</span> -<span class="selector-tag">i</span> <span class="string">&quot;0&quot;</span> -f mpeg1video -<span class="selector-tag">b</span> <span class="number">500</span>k -r <span class="number">20</span> -vf scale=<span class="number">640</span>:<span class="number">360</span> output.avi</span><br></pre></td></tr></tbody></table></figure></li></ul><h2 id="&#x7248;&#x672C;&#x66F4;&#x65B0;"><a href="#&#x7248;&#x672C;&#x66F4;&#x65B0;" class="headerlink" title="&#x7248;&#x672C;&#x66F4;&#x65B0;"></a>&#x7248;&#x672C;&#x66F4;&#x65B0;</h2><table><thead><tr><th>&#x7248;&#x672C;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td><a href="https://bintray.com/veizhang/maven/ffmpeg/1.0.0" target="_blank" rel="noopener">1.0.0</a></td><td>&#x96C6;&#x6210;FFmpeg&#x547D;&#x4EE4;&#x884C;&#x6267;&#x884C; <strong>2017-8-17</strong></td></tr></tbody></table><h2 id="&#x611F;&#x8C22;"><a href="#&#x611F;&#x8C22;" class="headerlink" title="&#x611F;&#x8C22;"></a>&#x611F;&#x8C22;</h2><blockquote><ul><li><a href="https://github.com/WritingMinds/ffmpeg-android-java" title="FFmpeg&#x5728;Android&#x4E2D;&#x793A;&#x4F8B;" target="_blank" rel="noopener">WritingMinds</a>, <a href="https://github.com/WritingMinds/ffmpeg-android" title="&#x7F16;&#x8BD1;FFmpeg&#x53EF;&#x6267;&#x884C;&#x6587;&#x4EF6;" target="_blank" rel="noopener">WritingMinds</a></li><li><a href="https://github.com/hiliving/VideoEdit" title="FFmpeg&#x547D;&#x4EE4;&#x793A;&#x4F8B;" target="_blank" rel="noopener">hiliving</a></li><li><a href="https://github.com/c060604/ffmpeg-usage" title="FFmpeg&#x547D;&#x4EE4;&#x8BB2;&#x89E3;" target="_blank" rel="noopener">c060604</a></li></ul></blockquote><!-- 网站链接 --><!-- 图片链接 --><!-- 版本 --><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E6%B0%B4%E7%9A%84%E4%B8%96%E7%95%8C%EF%BC%8C%E6%88%91%E7%9F%A5%E9%81%93.jpg&quot; alt=&quot;Android&quot; title=&quot;水的世界，我知道&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;FFmpeg命令在Android中的使用&lt;/strong&gt; &lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Android" scheme="https://tiimor.cn/tags/Android/"/>
    
      <category term="FFmpeg" scheme="https://tiimor.cn/tags/FFmpeg/"/>
    
  </entry>
  
  <entry>
    <title>基于Android的HTTP下载速度提升</title>
    <link href="https://tiimor.cn/%E5%9F%BA%E4%BA%8EAndroid%E7%9A%84HTTP%E4%B8%8B%E8%BD%BD%E9%80%9F%E5%BA%A6%E6%8F%90%E5%8D%87/"/>
    <id>https://tiimor.cn/基于Android的HTTP下载速度提升/</id>
    <published>2018-07-01T06:43:44.000Z</published>
    <updated>2019-03-17T06:47:42.386Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E5%8F%AA%E6%9C%89%E5%BF%83%E4%B8%AD%E6%9C%89%E7%88%B1%EF%BC%8C%E4%BD%A0%E6%89%8D%E4%BC%9A%E6%84%9F%E5%8F%97%E5%88%B0%E6%9B%B4%E5%A4%9A%E7%9A%84%E7%88%B1.jpg" alt="Android" title="&#x53EA;&#x6709;&#x5FC3;&#x4E2D;&#x6709;&#x7231;&#xFF0C;&#x4F60;&#x624D;&#x4F1A;&#x611F;&#x53D7;&#x5230;&#x66F4;&#x591A;&#x7684;&#x7231;"></p><p><strong>&#x53EA;&#x4E3A;&#x6781;&#x901F;&#x4E0B;&#x8F7D;</strong></p><a id="more"></a><h2 id="&#x56E0;&#x7D20;"><a href="#&#x56E0;&#x7D20;" class="headerlink" title="&#x56E0;&#x7D20;"></a>&#x56E0;&#x7D20;</h2><p>HTTP&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;&#x53D7;&#x9650;&#x4E8E;&#x4E24;&#x4E2A;&#x56E0;&#x7D20;&#xFF0C;<strong>&#x8FD9;&#x91CC;&#x4E0D;&#x8BA8;&#x8BBA;&#x670D;&#x52A1;&#x5668;&#x9650;&#x5236;&#x4EE5;&#x53CA;&#x591A;&#x7EBF;&#x7A0B;</strong></p><ul><li>&#x5E26;&#x5BBD;&#x7F51;&#x901F;</li><li>&#x6587;&#x4EF6;&#x5199;&#x5165;&#x901F;&#x5EA6;</li></ul><h2 id="&#x901F;&#x5EA6;&#x63D0;&#x5347;"><a href="#&#x901F;&#x5EA6;&#x63D0;&#x5347;" class="headerlink" title="&#x901F;&#x5EA6;&#x63D0;&#x5347;"></a>&#x901F;&#x5EA6;&#x63D0;&#x5347;</h2><p>&#x7531;&#x4E8E;&#x5E26;&#x5BBD;&#x662F;&#x56FA;&#x5B9A;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#xFF0C;&#x6587;&#x4EF6;&#x8BFB;&#x5199;&#x901F;&#x5EA6;&#x662F;&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;&#x7684;&#x5173;&#x952E;&#x3002;</p><h3 id="BufferedRandomAccessFile"><a href="#BufferedRandomAccessFile" class="headerlink" title="BufferedRandomAccessFile"></a><a href="https://github.com/VeiZhang/Downloader/blob/master/DownloaderLibrary/src/main/java/com/excellence/downloader/utils/BufferedRandomAccessFile.java" target="_blank" rel="noopener">BufferedRandomAccessFile</a></h3><p>&#x666E;&#x904D;&#x7684;&#xFF0C;&#x6211;&#x4EEC;&#x4F7F;&#x7528;RandomAccessFile&#x8FDB;&#x884C;&#x65AD;&#x70B9;&#x4E0B;&#x8F7D;&#xFF0C;&#x5BF9;&#x6587;&#x4EF6;&#x8BFB;&#x5199;&#x64CD;&#x4F5C;&#xFF0C;&#x7EBF;&#x7A0B;&#x5BF9;&#x78C1;&#x76D8;&#x7684;&#x8BFB;&#x5199;&#x975E;&#x5E38;&#x9891;&#x7E41;&#xFF0C;&#x5BFC;&#x81F4;&#x5199;&#x5165;&#x6587;&#x4EF6;&#x975E;&#x5E38;&#x6162;&#xFF0C;&#x4ECE;&#x800C;&#x5BFC;&#x81F4;&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;&#x6162;&#x3002;&#x56E0;&#x6B64;&#xFF0C;&#x91C7;&#x7528;&#x5177;&#x6709;&#x7F13;&#x51B2;&#x7684;RandomAccessFile&#xFF0C;&#x80FD;&#x5FEB;&#x901F;&#x964D;&#x4F4E;&#x78C1;&#x76D8;&#x7684;IO&#x3002;</p><p>&#x4EE5;&#x4E0B;&#x662F;&#x6D4B;&#x8BD5;&#x901F;&#x5EA6;&#x5BF9;&#x6BD4;&#xFF0C;&#x8F6C;&#x8F7D;&#x81EA;<a href="https://blog.csdn.net/hpb21/article/details/51270873" target="_blank" rel="noopener">https://blog.csdn.net/hpb21/article/details/51270873</a></p><table><thead><tr><th>&#x8BFB;</th><th>&#x5199;</th><th>&#x8017;&#x65F6;&#xFF08;s&#xFF09;</th></tr></thead><tbody><tr><td>RandomAccessFile</td><td>RandomAccessFile</td><td>95.848</td></tr><tr><td>BufferedInputStream + DataInputStream</td><td>BufferedOutputStream + DataOutputStream</td><td>2.935</td></tr><tr><td>BufferedRandomAccessFile</td><td>BufferedRandomAccessFile</td><td>0.401</td></tr></tbody></table><h3 id="&#x5757;&#x4F20;&#x8F93;"><a href="#&#x5757;&#x4F20;&#x8F93;" class="headerlink" title="&#x5757;&#x4F20;&#x8F93;"></a>&#x5757;&#x4F20;&#x8F93;</h3><p>&#x901A;&#x8FC7;&#x5BF9;&#x6BD4;&#xFF0C;FileChannel&#x5199;&#x6587;&#x4EF6;&#x901F;&#x5EA6;&#x4F18;&#x4E8E;&#x666E;&#x901A;&#x7684;&#x590D;&#x5236;&#x6587;&#x4EF6;&#x65B9;&#x6CD5;</p><p>&#x5199;&#x6CD5;<br></p><figure class="highlight arduino"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * &#x4F7F;&#x7528;&#x5757;&#x4F20;&#x8F93;&#xFF0C;&#x76F4;&#x63A5;&#x901A;&#x8FC7;&#x8FFD;&#x52A0;&#x7684;&#x5F62;&#x5F0F;&#xFF0C;&#x5199;&#x5165;&#x5230;&#x6587;&#x4EF6;&#x91CC;</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * @param inputStream</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> dynamicTransmission(InputStream inputStream) throws Exception</span><br><span class="line">{</span><br><span class="line">FileOutputStream outputStream = <span class="keyword">new</span> FileOutputStream(mTempFile, true);</span><br><span class="line">FileChannel channel = outputStream.getChannel();</span><br><span class="line">ReadableByteChannel readableByteChannel = Channels.newChannel(inputStream);</span><br><span class="line">ByteBuffer <span class="built_in">buffer</span> = ByteBuffer.allocate(STREAM_LEN);</span><br><span class="line"><span class="keyword">int</span> <span class="built_in">read</span>;</span><br><span class="line"><span class="built_in">while</span> ((<span class="built_in">read</span> = readableByteChannel.<span class="built_in">read</span>(<span class="built_in">buffer</span>)) != <span class="number">-1</span>)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">buffer</span>.flip();</span><br><span class="line">channel.<span class="built_in">write</span>(<span class="built_in">buffer</span>);</span><br><span class="line"><span class="built_in">buffer</span>.compact();</span><br><span class="line"></span><br><span class="line">mTaskEntity.downloadLen += <span class="built_in">read</span>;</span><br><span class="line">onProgressChange(mTaskEntity.fileSize, mTaskEntity.downloadLen);</span><br><span class="line"></span><br><span class="line"><span class="built_in">if</span> (mTaskEntity.isCancel)</span><br><span class="line">{</span><br><span class="line">onCancel();</span><br><span class="line"><span class="built_in">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">outputStream.<span class="built_in">close</span>();</span><br><span class="line">channel.<span class="built_in">close</span>();</span><br><span class="line">readableByteChannel.<span class="built_in">close</span>();</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p></p><h2 id="&#x793A;&#x4F8B;"><a href="#&#x793A;&#x4F8B;" class="headerlink" title="&#x793A;&#x4F8B;"></a>&#x793A;&#x4F8B;</h2><p><strong><a href="https://github.com/VeiZhang/Downloader" target="_blank" rel="noopener">Downloader</a>&#xFF0C;&#x6B22;&#x8FCE;star&#xFF01;</strong></p><p>&#x4F7F;&#x7528;&#x4E0A;&#x8FF0;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#xFF0C;&#x4E0B;&#x8F7D;&#x901F;&#x5EA6;&#x660E;&#x663E;&#x63D0;&#x9AD8;&#x4E86;&#x3002;</p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E5%8F%AA%E6%9C%89%E5%BF%83%E4%B8%AD%E6%9C%89%E7%88%B1%EF%BC%8C%E4%BD%A0%E6%89%8D%E4%BC%9A%E6%84%9F%E5%8F%97%E5%88%B0%E6%9B%B4%E5%A4%9A%E7%9A%84%E7%88%B1.jpg&quot; alt=&quot;Android&quot; title=&quot;只有心中有爱，你才会感受到更多的爱&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;只为极速下载&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Android" scheme="https://tiimor.cn/tags/Android/"/>
    
      <category term="HTTP" scheme="https://tiimor.cn/tags/HTTP/"/>
    
      <category term="Downloader" scheme="https://tiimor.cn/tags/Downloader/"/>
    
  </entry>
  
  <entry>
    <title>AndroidSDK-原生Settings添加菜单项</title>
    <link href="https://tiimor.cn/AndroidSDK-%E5%8E%9F%E7%94%9FSettings%E6%B7%BB%E5%8A%A0%E8%8F%9C%E5%8D%95%E9%A1%B9/"/>
    <id>https://tiimor.cn/AndroidSDK-原生Settings添加菜单项/</id>
    <published>2018-06-03T11:01:41.000Z</published>
    <updated>2019-03-17T06:47:42.356Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E6%AD%A3%E4%B8%AD%E9%9D%B6%E5%BF%83.jpg" alt="Android" title="&#x6B63;&#x4E2D;&#x9776;&#x5FC3;"></p><p><strong>Android N&#x539F;&#x751F;Settings&#x5E94;&#x7528;&#x6DFB;&#x52A0;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x4E00;&#x7EA7;&#x83DC;&#x5355;&#x9879;</strong></p><a id="more"></a><h1 id="&#x88AB;&#x52A8;&#x65B9;&#x5F0F;"><a href="#&#x88AB;&#x52A8;&#x65B9;&#x5F0F;" class="headerlink" title="&#x88AB;&#x52A8;&#x65B9;&#x5F0F;"></a>&#x88AB;&#x52A8;&#x65B9;&#x5F0F;</h1><ul><li><p><strong>&#x88AB;&#x52A8;&#x65B9;&#x5F0F;</strong>&#xFF1A;&#x4FEE;&#x6539;&#x88AB;&#x8C03;&#x7528;&#x5E94;&#x7528;&#x7684;AndroidManifest.xml</p><p>  &#x6839;&#x636E;&#x83DC;&#x5355;&#x9879;<code>Google</code>&#x7684;&#x542F;&#x53D1;&#xFF0C;&#x56E0;&#x6B64;&#x731C;&#x60F3;&#x662F;&#x5426;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x6DFB;&#x52A0;&#x9009;&#x9879;&#x3002;</p><p>  <img src="http://cdn.tiimor.cn/images/%E5%8E%9F%E7%94%9FSettings%E8%8F%9C%E5%8D%95%E4%BF%AE%E6%94%B9.png" alt="&#x539F;&#x751F;Settings&#x83DC;&#x5355;&#x4FEE;&#x6539;"></p></li></ul><ul><li><p>&#x6E90;&#x7801;&#x8FFD;&#x8E2A;</p><p>  &#x8FFD;&#x8E2A;&#xFF1A;<code>Settings\src\com\android\settings\SettingsActivity.java</code><br>  &#x8FFD;&#x8E2A;&#x7236;&#x7C7B;&#xFF1A;<code>SettingsLib\src\com\android\settingslib\drawer\SettingsDrawerActivity.java</code></p><p>  <img src="http://cdn.tiimor.cn/images/%E5%8E%9F%E7%94%9FSettings%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E6%B7%BB%E5%8A%A0%E8%8F%9C%E5%8D%951.png" alt="&#x539F;&#x751F;Settings&#x6E90;&#x7801;&#x5206;&#x6790;-&#x6DFB;&#x52A0;&#x83DC;&#x5355;1"></p><p>  &#x6700;&#x7EC8;&#x5B9A;&#x4F4D;&#xFF1A;<code>SettingsLib\src\com\android\settingslib\drawer\TileUtils.java</code>&#xFF0C;&#x56E0;&#x6B64;&#x6839;&#x636E;&#x6E90;&#x7801;&#xFF0C;&#x53CD;&#x63A8;&#x51FA;&#x539F;&#x751F;Settings&#x901A;&#x8FC7;&#x904D;&#x5386;AndroidManifest.xml&#x6587;&#x4EF6;&#xFF0C;&#x6DFB;&#x52A0;&#x7B26;&#x5408;&#x8981;&#x6C42;&#x7684;&#x83DC;&#x5355;&#x9879;<br>  <img src="http://cdn.tiimor.cn/images/%E5%8E%9F%E7%94%9FSettings%E6%BA%90%E7%A0%81%E5%88%86%E6%9E%90-%E6%B7%BB%E5%8A%A0%E8%8F%9C%E5%8D%952.png" alt="&#x539F;&#x751F;Settings&#x6E90;&#x7801;&#x5206;&#x6790;-&#x6DFB;&#x52A0;&#x83DC;&#x5355;2"></p></li></ul><ul><li><p>&#x4FEE;&#x6539;AndroidManifest.xml</p><p>  <img src="http://cdn.tiimor.cn/images/%E5%8E%9F%E7%94%9FSettings-AndroidManifest%E4%BF%AE%E6%94%B9.png" alt="&#x539F;&#x751F;Settings-AndroidManifest&#x4FEE;&#x6539;">    </p>  <figure class="highlight xml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">activity</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:name</span>=<span class="string">&quot;.app.AppsActivity&quot;</span></span></span><br><span class="line"><span class="tag">    <span class="attr">android:launchMode</span>=<span class="string">&quot;singleTask&quot;</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- &#x6838;&#x5FC3;&#xFF0C;&#x7279;&#x522B;&#x91CD;&#x8981;&#xFF0C;&#x5FC5;&#x987B;&#x6DFB;&#x52A0;&#xFF1A;&#x7528;&#x4E8E;Settings&#x8FC7;&#x6EE4;&#x51FA;&#x83DC;&#x5355;&#x9879;Category --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">action</span> <span class="attr">android:name</span>=<span class="string">&quot;com.android.settings.MANUFACTURER_APPLICATION_SETTING&quot;</span> /&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- &#x8BBE;&#x7F6E;&#x663E;&#x793A;&#x7684;title --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta-data</span> <span class="attr">android:name</span>=<span class="string">&quot;com.android.settings.title&quot;</span> <span class="attr">android:resource</span>=<span class="string">&quot;@string/app_name&quot;</span> /&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- &#x8BBE;&#x7F6E;&#x663E;&#x793A;&#x7684;&#x5C0F;&#x6807;&#x9898; --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta-data</span> <span class="attr">android:name</span>=<span class="string">&quot;com.android.settings.summary&quot;</span> <span class="attr">android:resource</span>=<span class="string">&quot;@string/app_name&quot;</span> /&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- &#x8BBE;&#x7F6E;&#x663E;&#x793A;&#x7684;&#x56FE;&#x6807; --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta-data</span> <span class="attr">android:name</span>=<span class="string">&quot;com.android.settings.icon&quot;</span> <span class="attr">android:resource</span>=<span class="string">&quot;@drawable/load_err&quot;</span> /&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- &#x6838;&#x5FC3;&#xFF0C;&#x7279;&#x522B;&#x91CD;&#x8981;&#xFF0C;&#x5FC5;&#x987B;&#x6DFB;&#x52A0;&#xFF1A;&#x8868;&#x793A;&#x6DFB;&#x52A0;&#x4E00;&#x4E2A;&#x83DC;&#x5355;&#x9009;&#x9879;&#xFF0C;&#x7528;&#x4E8E;Settings&#x5206;&#x7C7B;,&#x5F52;&#x5C5E;&#x4E8E;&#x201C;&#x4E2A;&#x4EBA;&#x201D;&#x7684;&#x9009;&#x9879;&#x4E0B;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x662F;&#x5176;&#x4ED6;&#x7684;&#xFF1A;&#x7CFB;&#x7EDF;&#x7B49;&#x7B49; --&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta-data</span> <span class="attr">android:name</span>=<span class="string">&quot;com.android.settings.category&quot;</span> <span class="attr">android:value</span>=<span class="string">&quot;com.android.settings.category.personal&quot;</span>/&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">activity</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x9A8C;&#x8BC1;&#x731C;&#x60F3;</p><p>  &#x901A;&#x8FC7;&#x53CD;&#x7F16;&#x8BD1;Google&#x7684;apk&#x53D1;&#x73B0;&#xFF0C;&#x91CC;&#x9762;&#x7684;AndroidManifest&#x91CC;&#x9762;&#x884C;&#x6570;L2536-L2543&#x7684;&#x4EE3;&#x7801;&#x4E0E;&#x4E0A;&#x9762;&#x4FEE;&#x6539;&#x7684;&#x4EE3;&#x7801;&#x662F;&#x4E00;&#x6837;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#xFF0C;&#x731C;&#x60F3;&#x662F;&#x6B63;&#x786E;&#x7684;&#x3002;</p></li></ul><ul><li><p>&#x62D3;&#x5C55;</p><ul><li><p>&#x83DC;&#x5355;&#x9879;&#x7684;&#x6240;&#x5C5E;&#x5206;&#x7C7B;<br>&#x4FEE;&#x6539;value&#x503C;&#xFF0C;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x5206;&#x7C7B;&#xFF1A;personal&#x3001;system&#xFF0C;&#x5176;&#x4ED6;&#x7684;&#x5206;&#x7C7B;&#x672A;&#x9A8C;&#x8BC1;</p><figure class="highlight groovy"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;meta-data <span class="string">android:</span>name=<span class="string">&quot;com.android.settings.category&quot;</span></span><br><span class="line"><span class="comment">// android:value=&quot;com.android.settings.category.system</span></span><br><span class="line"><span class="string">android:</span>value=<span class="string">&quot;com.android.settings.category.personal&quot;</span>/&gt;</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x83DC;&#x5355;&#x9879;&#x7684;&#x987A;&#x5E8F;<br>&#x4FEE;&#x6539;&#x4F18;&#x5148;&#x7EA7;&#xFF0C;&#x53EF;&#x4EE5;&#x8C03;&#x6574;&#x987A;&#x5E8F;&#xFF0C;&#x7B49;&#x7EA7;&#x8D8A;&#x9AD8;&#x7684;&#xFF0C;&#x5728;&#x4E0A;&#x9762;</p><figure class="highlight xml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">intent-filter</span> <span class="attr">android:priority</span>=<span class="string">&quot;4&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">intent-filter</span>&gt;</span></span><br></pre></td></tr></tbody></table></figure></li></ul></li></ul><ul><li><p>&#x6CE8;&#x610F;</p><p>  <strong>&#x901A;&#x8FC7;&#x9A8C;&#x8BC1;&#xFF1A;&#x9700;&#x8981;&#x9884;&#x7F6E;apk&#x624D;&#x6709;&#x6548;&#xFF0C;&#x5B89;&#x88C5;&#x7684;&#x65B9;&#x5F0F;&#x662F;&#x6CA1;&#x6709;&#x4F5C;&#x7528;</strong></p></li></ul><h1 id="&#x4E3B;&#x52A8;&#x65B9;&#x5F0F;"><a href="#&#x4E3B;&#x52A8;&#x65B9;&#x5F0F;" class="headerlink" title="&#x4E3B;&#x52A8;&#x65B9;&#x5F0F;"></a>&#x4E3B;&#x52A8;&#x65B9;&#x5F0F;</h1><ul><li><strong>&#x4E3B;&#x52A8;&#x7684;&#x65B9;&#x5F0F;</strong>&#xFF1A;&#x901A;&#x8FC7;&#x4FEE;&#x6539;&#x539F;&#x751F;Settings&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x6DFB;&#x52A0;&#x4E00;&#x7EA7;&#x3001;&#x4E8C;&#x7EA7;&#x83DC;&#x5355;&#x9879;&#xFF0C;&#x4F46;&#x662F;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x6BD4;&#x8F83;&#x7E41;&#x7410;&#x590D;&#x6742;&#x3002;&#x5982;&#x679C;&#x53EA;&#x662F;&#x7B80;&#x5355;&#x5728;&#x539F;&#x751F;Settings&#x4E0A;&#x6DFB;&#x52A0;&#x4E00;&#x7EA7;&#x83DC;&#x5355;&#x9879;&#xFF0C;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;<strong>&#x88AB;&#x52A8;&#x65B9;&#x5F0F;</strong>&#x3002;</li></ul><h1 id="&#x611F;&#x8C22;"><a href="#&#x611F;&#x8C22;" class="headerlink" title="&#x611F;&#x8C22;"></a>&#x611F;&#x8C22;</h1><p>&#x975E;&#x5E38;&#x611F;&#x8C22; <strong>&#x8FF7;&#x9014;&#x7F94;&#x7F8A;</strong> &#x7684;&#x5E2E;&#x52A9;<span class="github-emoji" style="color: transparent;background:no-repeat url(https://assets-cdn.github.com/images/icons/emoji/unicode/1f601.png?v8) center/contain" data-src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f601.png?v8">&#x1F601;</span><span class="github-emoji" style="color: transparent;background:no-repeat url(https://assets-cdn.github.com/images/icons/emoji/unicode/1f601.png?v8) center/contain" data-src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f601.png?v8">&#x1F601;</span></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E6%AD%A3%E4%B8%AD%E9%9D%B6%E5%BF%83.jpg&quot; alt=&quot;Android&quot; title=&quot;正中靶心&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Android N原生Settings应用添加自定义的一级菜单项&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="AndroidSDK" scheme="https://tiimor.cn/tags/AndroidSDK/"/>
    
      <category term="Settings" scheme="https://tiimor.cn/tags/Settings/"/>
    
  </entry>
  
  <entry>
    <title>AndroidStudio统一管理gradle脚本</title>
    <link href="https://tiimor.cn/AndroidStudio%E7%BB%9F%E4%B8%80%E7%AE%A1%E7%90%86gradle%E8%84%9A%E6%9C%AC/"/>
    <id>https://tiimor.cn/AndroidStudio统一管理gradle脚本/</id>
    <published>2018-06-01T03:10:02.000Z</published>
    <updated>2019-04-13T02:03:10.809Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E5%9C%A8%E4%B9%8E%E5%B1%B1%E6%B0%B4%E4%B9%8B%E9%97%B4%E4%B9%9F.jpg" alt="Android" title="&#x5728;&#x4E4E;&#x5C71;&#x6C34;&#x4E4B;&#x95F4;&#x4E5F;"></p><p><a href="https://github.com/VeiZhang/build.gradle" target="_blank" rel="noopener">AndroidStudio&#x7EDF;&#x4E00;&#x7BA1;&#x7406;gradle&#x7F16;&#x8BD1;&#x811A;&#x672C;</a></p><a id="more"></a><h2 id="&#x76EE;&#x7684;"><a href="#&#x76EE;&#x7684;" class="headerlink" title="&#x76EE;&#x7684;"></a>&#x76EE;&#x7684;</h2><p><strong>&#x5F53;&#x5DE5;&#x7A0B;&#x96C6;&#x6210;&#x5F88;&#x591A;Modules&#x65F6;&#xFF0C;&#x6BCF;&#x4E2A;Module&#x90FD;&#x6709;&#x4E00;&#x4E2A;build.gradle&#xFF0C;&#x5E76;&#x4E14;&#x5E26;&#x6709;&#x5982;&#x4E0B;&#x91CD;&#x590D;&#x7684;&#x4EE3;&#x7801;&#xFF1B;&#x5BF9;&#x6BCF;&#x4E2A;build.gradle&#x4FEE;&#x6539;&#x5F88;&#x9EBB;&#x70E6;&#xFF0C;&#x56E0;&#x6B64;&#x7EDF;&#x4E00;&#x7BA1;&#x7406;build.gradle&#x6587;&#x4EF6;&#x662F;&#x5FC5;&#x8981;&#x7684;</strong></p><figure class="highlight gradle"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x91CD;&#x590D;&#x4EE3;&#x7801;</span></span><br><span class="line">android {</span><br><span class="line">    compileSdkVersion <span class="number">25</span></span><br><span class="line">    buildToolsVersion <span class="string">&quot;25.0.0&quot;</span></span><br><span class="line"></span><br><span class="line">    defaultConfig {</span><br><span class="line">        minSdkVersion <span class="number">15</span></span><br><span class="line">        targetSdkVersion <span class="number">23</span></span><br><span class="line">        versionCode <span class="number">1</span></span><br><span class="line">        versionName <span class="string">&quot;1.0&quot;</span></span><br><span class="line">    }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">dependencies</span> {</span><br><span class="line">    <span class="keyword">compile</span> <span class="keyword">fileTree</span>(dir: <span class="string">&apos;libs&apos;</span>, <span class="keyword">include</span>: [<span class="string">&apos;*.jar&apos;</span>])</span><br><span class="line">    testCompile <span class="string">&apos;junit:junit:4.12&apos;</span></span><br><span class="line">    <span class="keyword">compile</span> <span class="string">&apos;com.android.support:appcompat-v7:24.2.1&apos;</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><ul><li><strong>&#x4F18;&#x5316;&#x4EE3;&#x7801;</strong></li><li><strong>&#x4F7F;&#x7528;&#x76F8;&#x540C;&#x7684;&#x7F16;&#x8BD1;&#x914D;&#x7F6E;</strong></li><li><strong>&#x7EDF;&#x4E00;&#x7BA1;&#x7406;&#x8FDC;&#x7A0B;&#x4F9D;&#x8D56;</strong></li><li>&#x51CF;&#x5C11;<code>sync project</code>&#x6B21;&#x6570;</li></ul><h2 id="&#x672C;&#x5730;&#x914D;&#x7F6E;"><a href="#&#x672C;&#x5730;&#x914D;&#x7F6E;" class="headerlink" title="&#x672C;&#x5730;&#x914D;&#x7F6E;"></a>&#x672C;&#x5730;&#x914D;&#x7F6E;<a name="&#x672C;&#x5730;&#x914D;&#x7F6E;"></a></h2><ul><li><p>&#x5728;&#x9879;&#x76EE;&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#x521B;&#x5EFA;config.gradle&#x6587;&#x4EF6;&#xFF0C;&#x4F5C;&#x4E3A;&#x7BA1;&#x7406;&#x914D;&#x7F6E;&#x6587;&#x4EF6;</p>  <figure class="highlight dart"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.text.SimpleDateFormat</span><br><span class="line"><span class="keyword">import</span> java.util.regex.Matcher</span><br><span class="line"><span class="keyword">import</span> java.util.regex.<span class="built_in">Pattern</span></span><br><span class="line"></span><br><span class="line">   ext {</span><br><span class="line">       <span class="comment">// &#x63D2;&#x4EF6;</span></span><br><span class="line">       plugins = [</span><br><span class="line">               application       : <span class="string">&quot;com.android.application&quot;</span>,</span><br><span class="line">               <span class="keyword">library</span>           : <span class="string">&quot;com.android.library&quot;</span>,</span><br><span class="line">               maven             : <span class="string">&quot;com.github.dcendents.android-maven&quot;</span>,</span><br><span class="line">               bintray           : <span class="string">&quot;com.jfrog.bintray&quot;</span>,</span><br><span class="line">               novoda            : <span class="string">&quot;com.novoda.bintray-release&quot;</span>,</span><br><span class="line">               greendao          : <span class="string">&quot;org.greenrobot.greendao&quot;</span>,</span><br><span class="line">               <span class="string">&quot;greendao-gradle&quot;</span> : <span class="string">&quot;org.greenrobot:greendao-gradle-plugin:3.2.2&quot;</span></span><br><span class="line">       ]</span><br><span class="line"></span><br><span class="line">       <span class="comment">// &#x914D;&#x7F6E;</span></span><br><span class="line">       android = [</span><br><span class="line">               <span class="comment"><span class="markdown">/<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>&#x539F;&#x751F;&#x914D;&#x7F6E;<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>/</span></span></span><br><span class="line">               compileSdkVersion       : <span class="number">25</span>,</span><br><span class="line">               buildToolsVersion       : <span class="string">&quot;25.0.0&quot;</span>,</span><br><span class="line">               minSdkVersion           : <span class="number">17</span>,</span><br><span class="line">               targetSdkVersion        : <span class="number">23</span>,</span><br><span class="line">               versionCode             : getVersionCode(),</span><br><span class="line">               versionName             : getVersionName(),</span><br><span class="line"></span><br><span class="line">               <span class="comment"><span class="markdown">/<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>&#x81EA;&#x5B9A;&#x4E49;&#x914D;&#x7F6E;<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>/</span></span></span><br><span class="line">               androidSupportSdkVersion: <span class="string">&quot;23.0.0&quot;</span></span><br><span class="line">       ]</span><br><span class="line"></span><br><span class="line">       <span class="comment">// &#x4F9D;&#x8D56;</span></span><br><span class="line">       dependencies = [</span><br><span class="line">               <span class="comment"><span class="markdown">/<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>&#x539F;&#x751F;&#x4F9D;&#x8D56;<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>/</span></span></span><br><span class="line">               <span class="string">&quot;appcompat-v7&quot;</span>      : <span class="string">&quot;com.android.support:appcompat-v7:<span class="subst">${android[<span class="string">&quot;androidSupportSdkVersion&quot;</span>]}</span>&quot;</span>,</span><br><span class="line">               <span class="string">&quot;support-v4&quot;</span>        : <span class="string">&quot;com.android.support:support-v4:<span class="subst">${android[<span class="string">&quot;androidSupportSdkVersion&quot;</span>]}</span>&quot;</span>,</span><br><span class="line">               <span class="string">&quot;cardview-v7&quot;</span>       : <span class="string">&quot;com.android.support:cardview-v7:<span class="subst">${android[<span class="string">&quot;androidSupportSdkVersion&quot;</span>]}</span>&quot;</span>,</span><br><span class="line">               <span class="string">&quot;recyclerview-v7&quot;</span>   : <span class="string">&quot;com.android.support:recyclerview-v7:<span class="subst">${android[<span class="string">&quot;androidSupportSdkVersion&quot;</span>]}</span>&quot;</span>,</span><br><span class="line">               <span class="string">&quot;design&quot;</span>            : <span class="string">&quot;com.android.support:design:<span class="subst">${android[<span class="string">&quot;androidSupportSdkVersion&quot;</span>]}</span>&quot;</span>,</span><br><span class="line">               <span class="string">&quot;annotations&quot;</span>       : <span class="string">&quot;com.android.support:support-annotations:<span class="subst">${android[<span class="string">&quot;androidSupportSdkVersion&quot;</span>]}</span>&quot;</span>,</span><br><span class="line">               <span class="string">&quot;gridlayout-v7&quot;</span>     : <span class="string">&quot;com.android.support:gridlayout-v7:<span class="subst">${android[<span class="string">&quot;androidSupportSdkVersion&quot;</span>]}</span>&quot;</span>,</span><br><span class="line">               <span class="string">&quot;constraint-layout&quot;</span> : <span class="string">&quot;com.android.support.constraint:constraint-layout:1.0.2&quot;</span>,</span><br><span class="line"></span><br><span class="line">               <span class="comment"><span class="markdown">/<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>&#x7B2C;&#x4E09;&#x65B9;&#x4F9D;&#x8D56;<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>/</span></span></span><br><span class="line">               <span class="comment">// https://github.com/square/retrofit</span></span><br><span class="line">               <span class="string">&quot;retrofit2&quot;</span>           : <span class="string">&quot;com.squareup.retrofit2:retrofit:2.4.0&quot;</span>,</span><br><span class="line">               <span class="string">&quot;converter-scalars&quot;</span>   : <span class="string">&quot;com.squareup.retrofit2:converter-scalars:2.4.0&quot;</span>,</span><br><span class="line">               <span class="string">&quot;converter-gson&quot;</span>      : <span class="string">&quot;com.squareup.retrofit2:converter-gson:2.4.0&quot;</span>,</span><br><span class="line">               <span class="string">&quot;adapter-rxjava&quot;</span>      : <span class="string">&quot;com.squareup.retrofit2:adapter-rxjava:2.4.0&quot;</span>,</span><br><span class="line">               <span class="string">&quot;adapter-rxjava2&quot;</span>     : <span class="string">&quot;com.squareup.retrofit2:adapter-rxjava2:2.4.0&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/square/okhttp</span></span><br><span class="line">               <span class="string">&quot;okhttp&quot;</span>              : <span class="string">&quot;com.squareup.okhttp3:okhttp:3.11.0&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/greenrobot/greenDAO</span></span><br><span class="line">               <span class="string">&quot;greendao&quot;</span>            : <span class="string">&quot;org.greenrobot:greendao:3.2.2&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/yuweiguocn/GreenDaoUpgradeHelper</span></span><br><span class="line">               <span class="string">&quot;greendao-helper&quot;</span>     : <span class="string">&quot;com.github.yuweiguocn:GreenDaoUpgradeHelper:v2.1.0&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/bumptech/glide</span></span><br><span class="line">               <span class="string">&quot;glide&quot;</span>               : <span class="string">&quot;com.github.bumptech.glide:glide:4.8.0&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/square/picasso</span></span><br><span class="line">               <span class="string">&quot;picasso&quot;</span>             : <span class="string">&quot;com.squareup.picasso:picasso:2.71828&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/facebook/fresco</span></span><br><span class="line">               <span class="string">&quot;fresco&quot;</span>              : <span class="string">&quot;com.facebook.fresco:fresco:1.10.0&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/greenrobot/EventBus</span></span><br><span class="line">               <span class="string">&quot;eventbus&quot;</span>            : <span class="string">&quot;org.greenrobot:eventbus:3.1.1&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/BuglyDevTeam/Bugly-Android</span></span><br><span class="line">               <span class="string">&quot;bugly&quot;</span>               : <span class="string">&quot;com.tencent.bugly:crashreport:2.6.6.1&quot;</span>,</span><br><span class="line">               <span class="string">&quot;bugly-native&quot;</span>        : <span class="string">&quot;com.tencent.bugly:nativecrashreport:3.3.1&quot;</span>,</span><br><span class="line">               <span class="comment">// https://bintray.com/android/android-utils/com.android.volley.volley</span></span><br><span class="line">               <span class="string">&quot;volley&quot;</span>              : <span class="string">&quot;com.android.volley:volley:1.1.1&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/ReactiveX/RxJava</span></span><br><span class="line">               <span class="string">&quot;rxjava&quot;</span>              : <span class="string">&quot;io.reactivex:rxjava:1.3.8&quot;</span>,</span><br><span class="line">               <span class="string">&quot;rxjava2&quot;</span>             : <span class="string">&quot;io.reactivex.rxjava2:rxjava:2.2.2&quot;</span>,</span><br><span class="line">               <span class="string">&quot;rxandroid&quot;</span>           : <span class="string">&quot;io.reactivex:rxandroid:2.1.0&quot;</span>,</span><br><span class="line">               <span class="string">&quot;rxandroid2&quot;</span>          : <span class="string">&apos;io.reactivex.rxjava2:rxandroid:2.0.2&apos;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/JakeWharton/RxBinding</span></span><br><span class="line">               <span class="string">&quot;rxbinding&quot;</span>           : <span class="string">&apos;com.jakewharton.rxbinding2:rxbinding:2.2.0&apos;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/google/gson</span></span><br><span class="line">               <span class="string">&quot;gson&quot;</span>                : <span class="string">&quot;com.google.code.gson:gson:2.8.5&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/apache/commons-lang</span></span><br><span class="line">               <span class="string">&quot;commons-lang3&quot;</span>       : <span class="string">&quot;org.apache.commons:commons-lang3:3.8&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/square/leakcanary</span></span><br><span class="line">               <span class="string">&quot;leakcanary&quot;</span>          : <span class="string">&quot;com.squareup.leakcanary:leakcanary-android:1.6.2&quot;</span>,</span><br><span class="line">               <span class="string">&quot;leakcanary-release&quot;</span>  : <span class="string">&quot;com.squareup.leakcanary:leakcanary-android-no-op:1.6.2&quot;</span>,</span><br><span class="line">               <span class="string">&quot;leakcanary-fragment&quot;</span> : <span class="string">&quot;com.squareup.leakcanary:leakcanary-support-fragment:1.6.2&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/YoKeyword/Fragmentation</span></span><br><span class="line">               <span class="string">&quot;fragmentation&quot;</span>       : <span class="string">&quot;me.yokeyword:fragmentation:1.3.6&quot;</span>,</span><br><span class="line">           </span><br><span class="line">               <span class="comment"><span class="markdown">/<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>&#x4E2A;&#x4EBA;&#x4F9D;&#x8D56;<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>/</span></span></span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/BaseToolsLibrary</span></span><br><span class="line">               <span class="string">&quot;basetools&quot;</span>           : <span class="string">&quot;com.excellence:basetools:1.2.6&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/Permission</span></span><br><span class="line">               <span class="string">&quot;permission&quot;</span>          : <span class="string">&quot;com.excellence:permission:1.0.1&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/RetrofitClient</span></span><br><span class="line">               <span class="string">&quot;retrofit-client&quot;</span>     : <span class="string">&quot;com.excellence:retrofit:1.0.5&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/QSkinLoader</span></span><br><span class="line">               <span class="string">&quot;skinloader&quot;</span>          : <span class="string">&quot;com.excellence:skinloader:1.2.2&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/ToastKit</span></span><br><span class="line">               <span class="string">&quot;toast&quot;</span>               : <span class="string">&quot;com.excellence:toast:1.1.0&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/MailSender</span></span><br><span class="line">               <span class="string">&quot;mailsender&quot;</span>          : <span class="string">&quot;com.excellence:mailsender:1.0.0&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/Downloader</span></span><br><span class="line">               <span class="string">&quot;downloader&quot;</span>          : <span class="string">&quot;com.excellence:downloader:1.2.0&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/AppStatistics</span></span><br><span class="line">               <span class="string">&quot;app-statistics&quot;</span>      : <span class="string">&quot;com.excellence:app-statistics:1.0.1&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/AndroidExec</span></span><br><span class="line">               <span class="string">&quot;exec&quot;</span>                : <span class="string">&quot;com.excellence:exec:1.1.0&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/AndroidFFmpeg</span></span><br><span class="line">               <span class="string">&quot;ffmpeg&quot;</span>              : <span class="string">&quot;com.excellence:ffmpeg:1.1.0&quot;</span>,</span><br><span class="line">               <span class="comment">// https://github.com/VeiZhang/ImageLoader</span></span><br><span class="line">               <span class="string">&quot;imageloader&quot;</span>         : <span class="string">&quot;com.excellence:imageloader:1.0.0&quot;</span>,</span><br><span class="line">               <span class="string">&quot;imageloader-fresco&quot;</span>  : <span class="string">&quot;com.excellence:imageloader-fresco:1.0.0&quot;</span>,</span><br><span class="line">               <span class="string">&quot;imageloader-picasso&quot;</span> : <span class="string">&quot;com.excellence:imageloader-picasso:1.0.0&quot;</span>,</span><br><span class="line">               <span class="string">&quot;imageloader-glide&quot;</span>   : <span class="string">&quot;com.excellence:imageloader-glide:1.0.0&quot;</span></span><br><span class="line">       ]</span><br><span class="line">   }</span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="markdown">/<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">***APP&#x7248;&#x672C;&#x63A7;&#x5236;&#x7684;&#x901A;&#x7528;&#x65B9;&#x6CD5;**</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>*/</span></span></span><br><span class="line"><span class="comment"><span class="markdown">/**</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * svn</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * &#x76F4;&#x63A5;&#x8BFB;&#x53D6;svn&#x7248;&#x672C;&#x53F7;&#x4F5C;&#x4E3A;&#x7248;&#x672C;&#x63A7;&#x5236;</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> */</span></span></span><br><span class="line"><span class="comment"><span class="markdown">/**</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * git</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> *</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * git tag&#x4F5C;&#x4E3A;&#x7248;&#x672C;&#x540D;&#x79F0;</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * git &#x7248;&#x672C;&#x53F7;&#x6709;&#x4E24;&#x79CD;&#x65B9;&#x6CD5;</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> *  &#x2460;&#x7248;&#x672C;&#x53F7;&#x4F5C;&#x4E3A;&#x6211;&#x4EEC;&#x5185;&#x90E8;&#x5F00;&#x53D1;&#x7684;&#x6807;&#x8BC6;&#xFF0C;&#x4E00;&#x822C;&#x5B83;&#x662F;+1&#x9012;&#x589E;&#x7684;&#xFF0C;&#x6BCF;&#x4E00;&#x6B21;&#x53D1;&#x7248;&#x6211;&#x4EEC;&#x5C31;&#x4F1A;&#x6253;&#x4E00;&#x4E2A;tag&#xFF0C;tag&#x7684;&#x6570;&#x91CF;&#x4E5F;&#x4F1A;&#x589E;&#x52A0;1&#x4E2A;&#xFF0C;&#x548C;&#x6211;&#x4EEC;&#x7248;&#x672C;&#x53F7;&#x7684;&#x9012;&#x589E;&#x903B;&#x8F91;&#x662F;&#x7B26;&#x5408;&#x7684;&#xFF0C;tag&#x6570;&#x91CF;+1&#xFF0C;&#x7248;&#x672C;&#x53F7;&#x4E5F;&#x4F1A;&#x8DDF;&#x7740;+1</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> *  &#x2461;&#x8FD8;&#x6709;&#x4E00;&#x79CD;&#x662F;&#x628A;&#x63D0;&#x4EA4;&#x6B21;&#x6570;&#x4F5C;&#x4E3A;versionCode&#xFF0C;&#x4E0D;&#x63A8;&#x8350;&#x3002;&#x76F8;&#x6BD4;&#x8F83;&#x2460;&#xFF0C;&#x2461;&#x6BD4;&#x8F83;&#x96BE;&#x627E;&#xFF0C;&#x56E0;&#x4E3A;tag&#x7684;&#x6570;&#x91CF;&#x4E0D;&#x4F1A;&#x5F88;&#x591A;</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> */</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="markdown">/**</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * &#x83B7;&#x53D6;&#x7248;&#x672C;</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * @return</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> */</span></span></span><br><span class="line">def getVersionName() {</span><br><span class="line">    def date = getDate()</span><br><span class="line">    def version = getSvnVersionCode()</span><br><span class="line">    <span class="keyword">if</span> (version != <span class="number">0</span>) {</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;1.0.<span class="subst">${version}</span> [<span class="subst">${date}</span>]&quot;</span></span><br><span class="line">    }</span><br><span class="line">    version = getGitTag()</span><br><span class="line">    <span class="keyword">if</span> (version != <span class="number">0</span>) {</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;<span class="subst">${version}</span> [<span class="subst">${date}</span>]&quot;</span></span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">if</span> (version == <span class="number">0</span>) {</span><br><span class="line">        version = <span class="number">1</span></span><br><span class="line">    }</span><br><span class="line">    <span class="comment"><span class="markdown">/**</span></span></span><br><span class="line"><span class="comment"><span class="markdown"><span class="code">     * &#x9519;&#x8BEF;&#x7684;&#x7248;&#x672C;&#x4FE1;&#x606F;&#xFF0C;&#x8BF7;&#x68C0;&#x67E5;</span></span></span></span><br><span class="line"><span class="comment"><span class="markdown"><span class="code">     */</span></span></span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;0.<span class="subst">${version}</span> [<span class="subst">${date}</span>]&quot;</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="markdown">/**</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * &#x83B7;&#x53D6;&#x7248;&#x672C;&#x53F7;</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * @return</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> */</span></span></span><br><span class="line">def getVersionCode() {</span><br><span class="line">    def versionCode = getSvnVersionCode()</span><br><span class="line">    <span class="keyword">if</span> (versionCode == <span class="number">0</span>) {</span><br><span class="line">        versionCode = getGitVersionCode()</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">if</span> (versionCode == <span class="number">0</span>) {</span><br><span class="line">        versionCode = <span class="number">1</span></span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> versionCode</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="markdown">/<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">***&#x8BFB;&#x53D6;Git&#x4FE1;&#x606F;**</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>*/</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="markdown">/**</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * &#x8BFB;&#x53D6;git tag</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * @return tag</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> */</span></span></span><br><span class="line">def getGitTag() {</span><br><span class="line">    <span class="keyword">try</span> {</span><br><span class="line">        def stdout = <span class="keyword">new</span> ByteArrayOutputStream()</span><br><span class="line">        exec {</span><br><span class="line">            commandLine <span class="string">&apos;git&apos;</span>, <span class="string">&apos;describe&apos;</span>, <span class="string">&apos;--abbrev=0&apos;</span>, <span class="string">&apos;--tags&apos;</span></span><br><span class="line">            standardOutput = stdout</span><br><span class="line">        }</span><br><span class="line">        <span class="keyword">return</span> stdout.toString().split(<span class="string">&quot;\n&quot;</span>)</span><br><span class="line">    } <span class="keyword">catch</span> (e) {</span><br><span class="line">        println e.getMessage()</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="markdown">/**</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * &#x4EE5;git tag&#x7684;&#x6570;&#x91CF;&#x4F5C;&#x4E3A;&#x5176;&#x7248;&#x672C;&#x53F7;</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * @return tag&#x7684;&#x6570;&#x91CF;</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> */</span></span></span><br><span class="line">def getGitVersionCode() {</span><br><span class="line">    <span class="keyword">try</span> {</span><br><span class="line">        def stdout = <span class="keyword">new</span> ByteArrayOutputStream()</span><br><span class="line">        exec {</span><br><span class="line">            commandLine <span class="string">&apos;git&apos;</span>, <span class="string">&apos;tag&apos;</span>, <span class="string">&apos;--list&apos;</span></span><br><span class="line">            standardOutput = stdout</span><br><span class="line">        }</span><br><span class="line">        <span class="keyword">return</span> stdout.toString().split(<span class="string">&quot;\n&quot;</span>).size()</span><br><span class="line">    } <span class="keyword">catch</span> (e) {</span><br><span class="line">        println e.getMessage()</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="markdown">/<span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">***&#x8BFB;&#x53D6;SVN&#x4FE1;&#x606F;**</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span><span class="strong">*****</span>*/</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="markdown">/**</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * &#x6839;&#x636E;svn&#x63D0;&#x4EA4;&#x7248;&#x672C;&#x751F;&#x6210;&#x7248;&#x672C;&#x53F7;</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * @return</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> */</span></span></span><br><span class="line">def getSvnVersionCode() {</span><br><span class="line">    <span class="keyword">try</span> {</span><br><span class="line">        def process = (<span class="string">&quot;svnversion -c &quot;</span> + getBuildDir().parent).execute()</span><br><span class="line">        process.waitFor()</span><br><span class="line">        def version = process.<span class="keyword">in</span>.text</span><br><span class="line">        <span class="built_in">Pattern</span> pattern = <span class="built_in">Pattern</span>.compile(<span class="string">&quot;(\\d+:)?(\\d+)\\D&quot;</span>)</span><br><span class="line">        Matcher matcher = pattern.matcher(version)</span><br><span class="line">        <span class="keyword">if</span> (matcher.find()) {</span><br><span class="line">            version = matcher.group(matcher.groupCount())</span><br><span class="line">        }</span><br><span class="line">        <span class="keyword">return</span> Integer.parseInt(version)</span><br><span class="line">    } <span class="keyword">catch</span> (e) {</span><br><span class="line">        println e.getMessage()</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"><span class="markdown">/**</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * &#x83B7;&#x53D6;&#x65E5;&#x671F;</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> * @return</span></span></span><br><span class="line"><span class="comment"><span class="markdown"> */</span></span></span><br><span class="line">def getDate() {</span><br><span class="line">    <span class="built_in">String</span> date = <span class="keyword">new</span> SimpleDateFormat(<span class="string">&quot;MMddyyyy&quot;</span>).format(<span class="keyword">new</span> Date())</span><br><span class="line">    <span class="keyword">return</span> date</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>  <img src="https://github.com/VeiZhang/build.gradle/blob/master/images/config.gradle.png?raw=true" alt="config.gradle" title="config.gradle"></p></li><li><p>&#x5728;&#x9879;&#x76EE;&#x6839;&#x76EE;&#x5F55;&#x7684;build.gradle&#x4E2D;&#x5F15;&#x7528;&#xFF0C;&#x4F9B;&#x5176;&#x4ED6;&#x7684;Module&#x4F7F;&#x7528;</p><p>  <strong>&#x6CE8;&#x610F;&#xFF1A;</strong> </p><ol><li><strong>&#x5982;&#x679C;&#x60F3;&#x4F7F;&#x7528;ext&#x7684;&#x503C;&#xFF0C;&#x5219;&#x53EA;&#x80FD;&#x5728;&#x9879;&#x76EE;&#x6839;&#x76EE;&#x5F55;&#x7684;build.gradle&#x4E2D;&#x5F15;&#x7528;</strong></li><li><p>&#x60F3;&#x8BA9;&#x5355;&#x72EC;&#x7684;Module&#x4F7F;&#x7528;&#xFF0C;&#x5219;&#x5728;&#x8BE5;Module&#x7684;build.gradle&#x91CC;&#x5F15;&#x5165;&#xFF0C;&#x4F46;&#x662F;&#x6B64;&#x65F6;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;ext&#x7684;&#x503C;&#xFF0C;&#x5426;&#x5219;&#x4F1A;&#x63D0;&#x793A;&#x65E0;&#x6CD5;&#x627E;&#x5230;&#x201D;Error:Cannot get property &#x2018;xxx&#x2019; on extra properties extension as it does not exist&#x201D;</p><figure class="highlight sqf"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">apply</span> <span class="keyword">from</span>: <span class="string">&quot;config.gradle&quot;</span></span><br></pre></td></tr></tbody></table></figure><p><img src="https://github.com/VeiZhang/build.gradle/blob/master/images/config&#x5F15;&#x7528;.png?raw=true" alt="config&#x5F15;&#x7528;" title="config&#x5F15;&#x7528;"></p></li></ol></li></ul><ul><li><p>&#x5728;Module&#x76EE;&#x5F55;&#x7684;build.gradle&#x4E2D;&#x4F7F;&#x7528;&#x53D8;&#x91CF;</p><p>  <img src="https://github.com/VeiZhang/build.gradle/blob/master/images/config&#x4F7F;&#x7528;.png?raw=true" alt="config&#x4F7F;&#x7528;" title="config&#x4F7F;&#x7528;"></p></li></ul><h2 id="&#x8FDC;&#x7A0B;&#x914D;&#x7F6E;"><a href="#&#x8FDC;&#x7A0B;&#x914D;&#x7F6E;" class="headerlink" title="&#x8FDC;&#x7A0B;&#x914D;&#x7F6E;"></a>&#x8FDC;&#x7A0B;&#x914D;&#x7F6E;</h2><p>&#x8FDC;&#x7A0B;&#x914D;&#x7F6E;&#x914D;&#x7F6E;&#x5176;&#x4ED6;&#x6B65;&#x9AA4;&#x4E0E;<a href="#&#x672C;&#x5730;&#x914D;&#x7F6E;">&#x672C;&#x5730;&#x914D;&#x7F6E;</a>&#x662F;&#x4E00;&#x6837;&#xFF0C;&#x4E0D;&#x540C;&#x7684;&#x662F;&#x5F15;&#x7528;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x5BFC;&#x5165;&#x7684;&#x4E0D;&#x662F;&#x8DEF;&#x5F84;&#x91CC;&#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x800C;&#x662F;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#x94FE;&#x63A5;</p><figure class="highlight n1ql"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apply from: &quot;https://github.com/VeiZhang/<span class="keyword">build</span>.gradle/blob/master/config.gradle?<span class="keyword">raw</span>=<span class="literal">true</span><span class="string">&quot;</span></span><br></pre></td></tr></tbody></table></figure><p><img src="https://github.com/VeiZhang/build.gradle/blob/master/images/%E8%BF%9C%E7%A8%8B%E9%85%8D%E7%BD%AE%E5%BC%95%E7%94%A8.png?raw=true" alt="&#x8FDC;&#x7A0B;&#x914D;&#x7F6E;&#x5F15;&#x7528;" title="&#x8FDC;&#x7A0B;&#x914D;&#x7F6E;&#x5F15;&#x7528;"></p><h2 id="&#x7EE7;&#x627F;&#x65B9;&#x5F0F;"><a href="#&#x7EE7;&#x627F;&#x65B9;&#x5F0F;" class="headerlink" title="&#x7EE7;&#x627F;&#x65B9;&#x5F0F;"></a>&#x7EE7;&#x627F;&#x65B9;&#x5F0F;</h2><p>&#x672C;&#x5730;&#x3001;&#x8FDC;&#x7A0B;&#x7684;&#x914D;&#x7F6E;&#x90FD;&#x53EA;&#x662F;&#x4FDD;&#x5B58;&#x4E86;&#x53D8;&#x91CF;&#xFF0C;&#x4F46;&#x662F;&#x5982;&#x679C;&#x60F3;&#x5F15;&#x7528;gradle&#x6587;&#x4EF6;&#x91CC;&#x9762;&#x7684;&#x51FD;&#x6570;&#xFF0C;&#x5176;&#x5B9E;&#x5F88;&#x7B80;&#x5355;&#xFF0C;&#x4E0E;&#x4E0A;&#x9762;&#x662F;&#x76F8;&#x540C;&#x7684;&#x505A;&#x6CD5;&#xFF0C;&#x5FC5;&#x987B;&#x6CE8;&#x610F;&#x7684;&#x662F;&#xFF0C;<strong>apply from:</strong> &#x653E;&#x7F6E;&#x7684;&#x987A;&#x5E8F;&#x5F88;&#x91CD;&#x8981;&#xFF01;</p><p><strong>&#x6CE8;&#x610F;</strong>&#xFF1A;&#x5F15;&#x5165;&#x4F4D;&#x7F6E;&#x5728;&#x6587;&#x4EF6;&#x7684;&#x5F00;&#x5934;&#x3001;&#x4E2D;&#x95F4;&#x3001;&#x7ED3;&#x5C3E;&#x7B49;&#x5904;&#x4F7F;&#x7528;&#x3002;&#x56E0;&#x4E3A;gradle&#x811A;&#x672C;&#x7F16;&#x8BD1;&#x662F;&#x987A;&#x5E8F;&#x6267;&#x884C;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x7236;&#x811A;&#x672C;&#x4E0E;&#x5B50;&#x811A;&#x672C;&#x6709;&#x76F8;&#x540C;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x6B64;&#x65F6;&#x7236;&#x811A;&#x672C;&#x5F15;&#x5165;&#x7684;&#x987A;&#x5E8F;&#x5C31;&#x975E;&#x5E38;&#x91CD;&#x8981;&#xFF0C;&#x4E0D;&#x540C;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x6267;&#x884C;&#x5148;&#x540E;&#x4E0D;&#x4E00;&#x6837;&#x3002;</p><p><img src="https://github.com/VeiZhang/build.gradle/blob/master/images/%E7%BB%A7%E6%89%BF%E6%96%B9%E5%BC%8F.png?raw=true" alt="&#x7EE7;&#x627F;&#x65B9;&#x5F0F;" title="&#x7EE7;&#x627F;&#x65B9;&#x5F0F;"></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E5%9C%A8%E4%B9%8E%E5%B1%B1%E6%B0%B4%E4%B9%8B%E9%97%B4%E4%B9%9F.jpg&quot; alt=&quot;Android&quot; title=&quot;在乎山水之间也&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/VeiZhang/build.gradle&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;AndroidStudio统一管理gradle编译脚本&lt;/a&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="AndroidStudio" scheme="https://tiimor.cn/tags/AndroidStudio/"/>
    
      <category term="gradle" scheme="https://tiimor.cn/tags/gradle/"/>
    
  </entry>
  
  <entry>
    <title>Android二维码生成与扫描</title>
    <link href="https://tiimor.cn/Android%E4%BA%8C%E7%BB%B4%E7%A0%81%E7%94%9F%E6%88%90%E4%B8%8E%E6%89%AB%E6%8F%8F/"/>
    <id>https://tiimor.cn/Android二维码生成与扫描/</id>
    <published>2018-03-04T05:57:16.000Z</published>
    <updated>2019-03-17T06:47:42.359Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E5%B0%8F%E5%8F%AF%E7%88%B1.jpg" alt="Android" title="&#x5C0F;&#x53EF;&#x7231;"></p><p><strong>&#x8001;&#x677F;&#xFF0C;&#x8BF7;&#x5C3D;&#x60C5;&#x7528;&#x7EA2;&#x5305;&#x6765;&#x8E42;&#x8E8F;&#x6211;&#x5427;&#xFF01;&#xFF01;&#xFF01;<span class="github-emoji" style="color: transparent;background:no-repeat url(https://assets-cdn.github.com/images/icons/emoji/unicode/1f618.png?v8) center/contain" data-src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f618.png?v8">&#x1F618;</span><span class="github-emoji" style="color: transparent;background:no-repeat url(https://assets-cdn.github.com/images/icons/emoji/unicode/1f618.png?v8) center/contain" data-src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f618.png?v8">&#x1F618;</span><span class="github-emoji" style="color: transparent;background:no-repeat url(https://assets-cdn.github.com/images/icons/emoji/unicode/1f618.png?v8) center/contain" data-src="https://assets-cdn.github.com/images/icons/emoji/unicode/1f618.png?v8">&#x1F618;</span></strong></p><a id="more"></a><p>&#x626B;&#x7801;&#x573A;&#x666F;&#x73B0;&#x5728;&#x5F88;&#x666E;&#x904D;&#xFF0C;&#x652F;&#x4ED8;&#x5B9D;&#x4ED8;&#x6B3E;&#x3001;&#x5FAE;&#x4FE1;&#x4ED8;&#x6B3E;&#x3001;&#x626B;&#x7801;&#x7B49;&#xFF0C;&#x4E24;&#x79CD;&#x626B;&#x7801;&#x65B9;&#x5F0F;&#xFF1A;<strong><a href="https://github.com/zxing/zxing" target="_blank" rel="noopener">zxing</a></strong>&#x3001;<strong><a href="https://github.com/ZBar/ZBar" target="_blank" rel="noopener">zbar</a></strong>&#x3002;&#x4E86;&#x89E3;&#x4E0E;&#x4F7F;&#x7528;&#xFF0C;&#x65B9;&#x4FBF;&#x96C6;&#x6210;&#x5230;&#x9879;&#x76EE;&#x4E2D;&#x3002;</p><h1 id="&#x4ECB;&#x7ECD;"><a href="#&#x4ECB;&#x7ECD;" class="headerlink" title="&#x4ECB;&#x7ECD;"></a>&#x4ECB;&#x7ECD;</h1><ul><li><p>zxing</p><ul><li>google&#x63A8;&#x51FA;&#x7528;&#x4E8E;&#x8BC6;&#x522B;&#x591A;&#x79CD;&#x683C;&#x5F0F;&#x6761;&#x5F62;&#x7801;&#x7684;&#x5F00;&#x6E90;&#x9879;&#x76EE;&#xFF0C;&#x7EF4;&#x62A4;&#x4E2D;</li><li>&#x652F;&#x6301;&#x66F4;&#x591A;&#x7684;&#x7801;&#x5236;&#xFF1A;datamatix&#x3001;PDF417</li></ul></li><li><p>zbar</p><ul><li>&#x4E3B;&#x8981;&#x7528;C&#x6765;&#x5199;&#xFF0C;&#x901F;&#x5EA6;&#x6781;&#x5FEB;&#xFF0C;&#x63A8;&#x51FA;iPhone&#x7684;SDK&#x548C;Android&#x7684;&#x8C03;&#x7528;&#x65B9;&#x6CD5;JNI&#xFF0C;&#x4E0D;&#x5728;&#x7EF4;&#x62A4;</li><li>&#x4E0D;&#x80FD;&#x5F88;&#x597D;&#x652F;&#x6301;PDF417&#xFF0C;&#x4F46;&#x662F;&#x5728;&#x6E90;&#x7801;&#x4E2D;&#x6709;&#x5BF9;PDF417&#x7801;&#x7684;&#x5904;&#x7406;</li></ul></li></ul><p>&#x6BD4;&#x8F83;&#x4E24;&#x8005;&#x7684;&#x626B;&#x7801;&#x901F;&#x5EA6;&#xFF0C;&#x5B9E;&#x8DF5;&#x8BC1;&#x660E;&#xFF0C;<strong>zbar&#x7684;&#x626B;&#x7801;&#x901F;&#x5EA6;&#x4F18;&#x4E8E;zxing</strong>&#x3002;</p><h1 id="&#x611F;&#x8C22;&#x3001;&#x96C6;&#x6210;"><a href="#&#x611F;&#x8C22;&#x3001;&#x96C6;&#x6210;" class="headerlink" title="&#x611F;&#x8C22;&#x3001;&#x96C6;&#x6210;"></a>&#x611F;&#x8C22;&#x3001;&#x96C6;&#x6210;</h1><p>&#x7531;&#x4E8E;&#x6E90;&#x4EE3;&#x7801;&#x5E76;&#x4E0D;&#x662F;&#x6240;&#x6709;&#x7684;&#x6A21;&#x5757;&#x90FD;&#x662F;&#x9700;&#x8981;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x88C1;&#x526A;&#xFF0C;&#x4F18;&#x5316;&#x662F;&#x975E;&#x5E38;&#x5FC5;&#x8981;&#x7684;&#x3002;<br>&#x611F;&#x8C22;<strong><a href="https://github.com/bingoogolapple/BGAQRCode-Android" target="_blank" rel="noopener">bingoogolapple</a></strong>&#xFF0C;&#x88C1;&#x526A;&#x4E86;&#x6E90;&#x4EE3;&#x7801;&#xFF0C;&#x5E76;&#x4E14;&#x6253;&#x5305;&#x6210;&#x4F9D;&#x8D56;&#x5E93;&#xFF1A;<strong>&#x751F;&#x6210;&#x4E8C;&#x7EF4;&#x7801;&#x3001;&#x626B;&#x63CF;&#x4E8C;&#x7EF4;&#x7801;</strong>&#x3002;&#x4E24;&#x79CD;&#x626B;&#x7801;&#x65B9;&#x5F0F;&#x4E4B;&#x95F4;&#x5207;&#x6362;&#x975E;&#x5E38;&#x65B9;&#x4FBF;&#x3002;</p><blockquote><ul><li>zxing<figure class="highlight nginx"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">dependencies</span> {</span><br><span class="line">    <span class="attribute">implementation</span> <span class="string">&apos;cn.bingoogolapple:bga-qrcode-zxing:latestVersion&apos;</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ul></blockquote><blockquote><ul><li>zbar<figure class="highlight nginx"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">dependencies</span> {</span><br><span class="line">    <span class="attribute">implementation</span> <span class="string">&apos;cn.bingoogolapple:bga-qrcode-zbar:latestVersion&apos;</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ul></blockquote><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E5%B0%8F%E5%8F%AF%E7%88%B1.jpg&quot; alt=&quot;Android&quot; title=&quot;小可爱&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;老板，请尽情用红包来蹂躏我吧！！！:kissing_heart::kissing_heart::kissing_heart:&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Android" scheme="https://tiimor.cn/tags/Android/"/>
    
      <category term="二维码" scheme="https://tiimor.cn/tags/%E4%BA%8C%E7%BB%B4%E7%A0%81/"/>
    
      <category term="zxing" scheme="https://tiimor.cn/tags/zxing/"/>
    
      <category term="zbar" scheme="https://tiimor.cn/tags/zbar/"/>
    
  </entry>
  
  <entry>
    <title>Merry Christmas-2017</title>
    <link href="https://tiimor.cn/Merry-Christmas/"/>
    <id>https://tiimor.cn/Merry-Christmas/</id>
    <published>2017-12-25T11:58:55.000Z</published>
    <updated>2019-03-17T06:47:42.381Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/Merry%20Christmas-2017.png" alt="Merry Christmas" title="Merry Christmas"></p><a id="more"></a><figure class="highlight coq"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"> __________________________________________________</span><br><span class="line">|                    <span class="type">_</span>                             |<span class="type"></span></span><br><span class="line"><span class="type">| /|,/ _</span>   <span class="keyword">_</span> <span class="keyword">_</span>      / ` /<span class="keyword">_</span>  <span class="keyword">_</span> .  <span class="keyword">_</span> <span class="keyword">_</span>/<span class="keyword">_</span> <span class="keyword">_</span> <span class="keyword">_</span>   <span class="keyword">_</span>    <span class="keyword">_</span>|<span class="type"></span></span><br><span class="line"><span class="type">|/  / /_</span>&apos; / / /<span class="keyword">_</span>/  /<span class="keyword">_</span>, / / / / <span class="keyword">_</span>\  /  / / / /<span class="keyword">_</span>| <span class="type">_</span>\ |<span class="type"></span></span><br><span class="line"><span class="type">|             _</span>/                                   |<span class="type"></span></span><br><span class="line"><span class="type">|                ~~**  Tiimor</span>  **~~                |<span class="type"></span></span><br><span class="line"><span class="type">|__________________________________________________</span>|<span class="type"></span></span><br><span class="line"><span class="type"></span></span><br><span class="line"><span class="type"></span></span><br><span class="line"><span class="type">                       ___</span></span><br><span class="line">                    /`   `&apos;.</span><br><span class="line">                   /   <span class="keyword">_</span>..---;</span><br><span class="line">                   |  <span class="type">/__</span>...<span class="keyword">_</span>/  .--.-.</span><br><span class="line">                   |<span class="type">.&apos;  e</span> e | <span class="type">___</span>\<span class="keyword">_</span>|<span class="type">/____</span></span><br><span class="line">                  (<span class="keyword">_</span>)&apos;--.o.--|    <span class="type">| |    |</span></span><br><span class="line"><span class="type">                 .-( `-&apos; = `-|____</span>| <span class="type">|____</span>|<span class="type"></span></span><br><span class="line"><span class="type">                /  (         |____</span>   ____|<span class="type"></span></span><br><span class="line"><span class="type">                |   (        |_</span>   | <span class="type">|  __</span>|<span class="type"></span></span><br><span class="line"><span class="type">                |    &apos;-.--&apos;;/&apos;/__</span> | <span class="type">| (  `|</span></span><br><span class="line"><span class="type">                |      &apos;.   \    )&quot;&quot;;--`\ /</span></span><br><span class="line"><span class="type">                \        ;   |--&apos;    `;.-&apos;</span></span><br><span class="line"><span class="type">                |`-.__</span> ..-&apos;--&apos;`;..--&apos;`</span><br><span class="line"></span><br><span class="line"> :*~*:.<span class="keyword">_</span>.:*~*:.<span class="keyword">_</span>.:*~*:.<span class="keyword">_</span>.:*~*:.<span class="keyword">_</span>.:*~*:.<span class="keyword">_</span>.:*~*:.<span class="keyword">_</span>.:*~*</span><br></pre></td></tr></tbody></table></figure><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/Merry%20Christmas-2017.png&quot; alt=&quot;Merry Christmas&quot; title=&quot;Merry Christmas&quot;&gt;&lt;/p&gt;
    
    </summary>
    
    
  </entry>
  
  <entry>
    <title>Android功守道-反编译VS混淆与加壳</title>
    <link href="https://tiimor.cn/Android%E5%8A%9F%E5%AE%88%E9%81%93-%E5%8F%8D%E7%BC%96%E8%AF%91VS%E6%B7%B7%E6%B7%86%E4%B8%8E%E5%8A%A0%E5%A3%B3/"/>
    <id>https://tiimor.cn/Android功守道-反编译VS混淆与加壳/</id>
    <published>2017-12-19T12:18:41.000Z</published>
    <updated>2019-03-17T06:47:42.361Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E8%97%8F%E5%9C%A8%E5%A2%99%E4%B8%AD%E7%9A%84android.jpg" alt="Android" title="&#x85CF;&#x5728;&#x5899;&#x4E2D;&#x7684;android"></p><p><strong>&#x53CD;&#x7F16;&#x8BD1;&#x5E76;&#x4E0D;&#x662F;&#x4E3A;&#x4E86;&#x53BB;&#x7834;&#x89E3;&#x4EBA;&#x5BB6;&#x8F9B;&#x8F9B;&#x82E6;&#x82E6;&#x5F00;&#x53D1;&#x7684;app&#xFF1B;&#x6DF7;&#x6DC6;&#x4E0E;&#x52A0;&#x58F3;&#x4E5F;&#x662F;&#x4E3A;&#x4E86;&#x5728;&#x4E00;&#x5B9A;&#x7A0B;&#x5EA6;&#x4E0A;&#x4FDD;&#x62A4;&#x81EA;&#x5DF1;&#x7684;&#x5F00;&#x53D1;&#x6210;&#x679C;&#x3002;&#x53CD;&#x7F16;&#x8BD1;&#x3001;&#x6DF7;&#x6DC6;&#x3001;&#x52A0;&#x58F3;&#x662F;&#x975E;&#x5E38;&#x6709;&#x7528;&#x7684;&#x6280;&#x80FD;&#x3002;</strong></p><a id="more"></a><p>&#x8BB0;&#x5F55;&#x4E00;&#x4E0B;&#x4E2A;&#x4EBA;&#x65E5;&#x5E38;&#x4F7F;&#x7528;</p><h1 id="&#x53CD;&#x7F16;&#x8BD1;"><a href="#&#x53CD;&#x7F16;&#x8BD1;" class="headerlink" title="&#x53CD;&#x7F16;&#x8BD1;"></a>&#x53CD;&#x7F16;&#x8BD1;</h1><h2 id="&#x53CD;&#x7F16;&#x8BD1;&#x5DE5;&#x5177;"><a href="#&#x53CD;&#x7F16;&#x8BD1;&#x5DE5;&#x5177;" class="headerlink" title="&#x53CD;&#x7F16;&#x8BD1;&#x5DE5;&#x5177;"></a>&#x53CD;&#x7F16;&#x8BD1;&#x5DE5;&#x5177;</h2><ul><li><p><strong><a href="http://note.youdao.com/noteshare?id=4407e5ea540038d4dd16e05b22ca89bb&amp;sub=4C55C31576284FEA8373E50938A16608" target="_blank" rel="noopener">apktool</a></strong><br>&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x83B7;&#x53D6;&#xFF0C;&#x53EF;&#x4EE5;&#x63D0;&#x53D6;&#x51FA;&#x56FE;&#x7247;&#x6587;&#x4EF6;&#x548C;&#x5E03;&#x5C40;&#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x4F7F;&#x7528;&#x67E5;&#x770B;&#xFF1A;<code>apktool.bat d -f [apk&#x6587;&#x4EF6;] [&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#x5939;]</code></p></li><li><p><strong><a href="http://note.youdao.com/noteshare?id=5bc5444d04b4c162b78c80ca6b503acf&amp;sub=6E2DCBD46DD44889980AA4FF7C3700F7" target="_blank" rel="noopener">dex2jar</a></strong><br>&#x5C06;apk&#x53CD;&#x7F16;&#x8BD1;&#x6210;Java&#x6E90;&#x7801;&#xFF08;classes.dex&#x8F6C;&#x5316;&#x6210;jar&#x6587;&#x4EF6;&#xFF09;&#xFF1A;<code>dex2jar.bat [apk&#x6587;&#x4EF6;]</code></p></li><li><p><strong><a href="http://note.youdao.com/noteshare?id=2564f7947bbba25c2541d2eccf4a2d10&amp;sub=1055626537D747098912D757314E9FB9" target="_blank" rel="noopener">jd-gui</a></strong><br>&#x67E5;&#x770B;APK&#x4E2D;classes.dex&#x8F6C;&#x5316;&#x6210;&#x51FA;&#x7684;jar&#x6587;&#x4EF6;&#xFF0C;&#x5373;&#x6E90;&#x7801;&#x6587;&#x4EF6;&#xFF1A;&#x7528;jd-gui.exe&#x6253;&#x5F00;&#x4E0A;&#x9762;&#x751F;&#x6210;&#x7684;classes.dex&#x5373;&#x53EF;</p></li></ul><p>&#x6CE8;&#xFF1A;<strong>AndroidKiller</strong>&#x662F;&#x4E00;&#x4E2A;&#x53CD;&#x7F16;&#x8BD1;&#x5DE5;&#x5177;&#xFF0C;&#x4E00;&#x6B65;&#x5230;&#x4F4D;&#xFF0C;&#x770B;Java&#x6E90;&#x7801;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x9700;&#x8981;&#x501F;&#x52A9;smail&#x8F6C;java&#x7684;&#x5DE5;&#x5177;&#x3002;&#x53E6;&#x5916;&#x5C06;test.apk&#x7684;apk&#x6587;&#x4EF6;&#x66F4;&#x6362;&#x540E;&#x7F00;&#x540D;&#x4E3A;test.zip&#xFF0C;&#x53EF;&#x4EE5;&#x63D0;&#x53D6;&#x51FA;&#x8D44;&#x6E90;&#x56FE;&#x7247;&#x6587;&#x4EF6;&#x7B49;&#x7B49;&#x3002;</p><h2 id="&#x672A;&#x6DF7;&#x6DC6;"><a href="#&#x672A;&#x6DF7;&#x6DC6;" class="headerlink" title="&#x672A;&#x6DF7;&#x6DC6;"></a>&#x672A;&#x6DF7;&#x6DC6;</h2><p>&#x672A;&#x6DF7;&#x6DC6;&#x7684;app&#xFF0C;&#x53CD;&#x7F16;&#x8BD1;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x6E90;&#x7801;&#xFF1A;<br><img src="http://cdn.tiimor.cn/images/%E6%9C%AA%E6%B7%B7%E6%B7%86.png" alt="&#x672A;&#x6DF7;&#x6DC6;"></p><h2 id="&#x6DF7;&#x6DC6;"><a href="#&#x6DF7;&#x6DC6;" class="headerlink" title="&#x6DF7;&#x6DC6;"></a>&#x6DF7;&#x6DC6;</h2><p>&#x6DF7;&#x6DC6;app&#x4E4B;&#x540E;&#xFF0C;&#x53CD;&#x7F16;&#x8BD1;&#x5F97;&#x5230;&#x7684;&#x6E90;&#x7801;&#xFF1A;<br><img src="http://cdn.tiimor.cn/images/%E6%B7%B7%E6%B7%86.png" alt="&#x6DF7;&#x6DC6;"></p><h1 id="&#x6DF7;&#x6DC6;-1"><a href="#&#x6DF7;&#x6DC6;-1" class="headerlink" title="&#x6DF7;&#x6DC6;"></a>&#x6DF7;&#x6DC6;</h1><p>&#x5F00;&#x542F;App&#x7684;&#x6DF7;&#x6DC6;&#xFF0C;&#x5728;&#x4E00;&#x5B9A;&#x7A0B;&#x5EA6;&#x4E0A;&#x4FDD;&#x62A4;&#x81EA;&#x5DF1;&#x8F9B;&#x82E6;&#x5F00;&#x53D1;&#x7684;&#x6210;&#x679C;&#xFF0C;&#x5373;&#x53CD;&#x7F16;&#x8BD1;&#x51FA;&#x6765;&#x7684;&#x6E90;&#x7801;&#x662F;<code>a b c...</code>&#x8FD9;&#x6837;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x4ECD;&#x7136;&#x53EF;&#x4EE5;&#x88AB;&#x53CD;&#x7F16;&#x8BD1;&#x770B;&#x5230;AndroidManifest&#x548C;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#x3002;</p><h2 id="&#x5F00;&#x542F;&#x6DF7;&#x6DC6;"><a href="#&#x5F00;&#x542F;&#x6DF7;&#x6DC6;" class="headerlink" title="&#x5F00;&#x542F;&#x6DF7;&#x6DC6;"></a>&#x5F00;&#x542F;&#x6DF7;&#x6DC6;</h2><p>&#x5728;Android Studio&#x7684;app&#x5DE5;&#x7A0B;&#x76EE;&#x5F55;&#x91CC;&#xFF0C;release&#x7248;&#x672C;&#x5F00;&#x542F;&#x4EE3;&#x7801;&#x6DF7;&#x6DC6;&#xFF0C;&#x7136;&#x540E;&#x6DF7;&#x6DC6;&#x7684;&#x914D;&#x7F6E;&#x5199;&#x5728;&#x8BE5;&#x76EE;&#x5F55;&#x91CC;&#x7684;<code>proguard-rules.pro</code>&#x6587;&#x4EF6;&#x91CC;</p><figure class="highlight actionscript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">release {</span><br><span class="line">    <span class="comment">// proguard files</span></span><br><span class="line">    minifyEnabled <span class="literal">true</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// add proguard cfg</span></span><br><span class="line">    proguardFiles getDefaultProguardFile(<span class="string">&apos;proguard-android-optimize.txt&apos;</span>), <span class="string">&apos;proguard-rules.pro&apos;</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="&#x914D;&#x7F6E;proguard-rules"><a href="#&#x914D;&#x7F6E;proguard-rules" class="headerlink" title="&#x914D;&#x7F6E;proguard-rules"></a>&#x914D;&#x7F6E;proguard-rules</h2><p>&#x914D;&#x7F6E;&#x8BE5;&#x6587;&#x4EF6;&#x662F;&#x4E3A;&#x4E86;&#x9632;&#x6B62;&#x67D0;&#x4E9B;&#x529F;&#x80FD;&#x7684;&#x6B63;&#x5E38;&#x4F7F;&#x7528;&#xFF0C;&#x4EE3;&#x7801;&#x8FC7;&#x4E8E;&#x6DF7;&#x6DC6;&#xFF0C;&#x4F1A;&#x5BFC;&#x81F4;&#x529F;&#x80FD;&#x65E0;&#x6CD5;&#x4F7F;&#x7528;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x5C31;&#x8981;&#x4FDD;&#x6301;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;&#x3002;&#x6BD4;&#x8F83;&#x5168;&#x9762;&#x7684;&#x901A;&#x7528;&#x914D;&#x7F6E;&#xFF08;&#x5E38;&#x7528;&#x7684;&#x7B2C;&#x4E09;&#x65B9;&#x6846;&#x67B6;&#xFF09;&#x5982;&#x4E0B;&#xFF1A;</p><figure class="highlight crystal"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Add project specific ProGuard rules here.</span></span><br><span class="line"><span class="comment"># By default, the flags in this file are appended to flags specified</span></span><br><span class="line"><span class="comment"># in E:\AndroidTools\AndroidStudio\sdk/tools/proguard/proguard-android.txt</span></span><br><span class="line"><span class="comment"># You can edit the include path and order by changing the proguardFiles</span></span><br><span class="line"><span class="comment"># directive in build.gradle.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># For more details, see</span></span><br><span class="line"><span class="comment">#   http://developer.android.com/guide/developing/tools/proguard.html</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Add any project specific keep options here:</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x6307;&#x5B9A;&#x4EE3;&#x7801;&#x7684;&#x538B;&#x7F29;&#x7EA7;&#x522B;------------</span></span><br><span class="line">-optimizationpasses <span class="number">5</span></span><br><span class="line"><span class="comment">###-----------&#x662F;&#x5426;&#x4F7F;&#x7528;&#x5927;&#x5C0F;&#x5199;&#x6DF7;&#x5408;------------</span></span><br><span class="line">-dontusemixedcaseclassnames</span><br><span class="line"><span class="comment">###-----------&#x6DF7;&#x6DC6;&#x65F6;&#x662F;&#x5426;&#x505A;&#x9884;&#x6821;&#x9A8C;------------</span></span><br><span class="line">-dontpreverify</span><br><span class="line"><span class="comment">###-----------&#x6DF7;&#x6DC6;&#x65F6;&#x662F;&#x5426;&#x8BB0;&#x5F55;&#x65E5;&#x5FD7;------------</span></span><br><span class="line">-verbose</span><br><span class="line"><span class="comment">###-----------&#x5FFD;&#x7565;&#x8B66;&#x544A;------------</span></span><br><span class="line">-ignorewarnings</span><br><span class="line">-keepattributes EnclosingMethod</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x8BC1;&#x5F02;&#x5E38;&#x65F6;&#x663E;&#x793A;&#x884C;&#x53F7;------------</span></span><br><span class="line">-renamesourcefileattribute SourceFile</span><br><span class="line">-keepattributes SourceFile,LineNumberTable</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x6CE8;&#x89E3;------------</span></span><br><span class="line">-keepattributes *Annotation*</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x6CDB;&#x578B;------------</span></span><br><span class="line">-keepattributes Signature</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x5F02;&#x5E38;------------</span></span><br><span class="line">-keepattributes Exceptions</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x53BB;&#x6389;&#x4EE3;&#x7801;&#x91CC;&#x7684;Log------------</span></span><br><span class="line">-assumenosideeffects <span class="class"><span class="keyword">class</span> <span class="title">android</span>.<span class="title">util</span>.<span class="title">Log</span> {</span></span><br><span class="line">    public static boolean isLoggable(java.lang.String,int);</span><br><span class="line">    public static *** d(...);</span><br><span class="line">public static *** v(...);</span><br><span class="line">public static *** i(...);</span><br><span class="line">public static *** w(...);</span><br><span class="line">public static *** e(...);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x6DF7;&#x6DC6;&#x65F6;&#x6240;&#x91C7;&#x7528;&#x7684;&#x7B97;&#x6CD5;------------</span></span><br><span class="line">-optimizations !code/simplification/arithmetic,!field/*,!<span class="class"><span class="keyword">class</span>/<span class="title">merging</span>/*</span></span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;Activity&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">android</span>.<span class="title">app</span>.<span class="title">Activity</span></span></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;AppCompatActivity&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">android</span>.<span class="title">support</span>.<span class="title">v7</span>.<span class="title">app</span>.<span class="title">AppCompatActivity</span></span></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;DialogFragment&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">android</span>.<span class="title">app</span>.<span class="title">DialogFragment</span></span></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;Application&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">android</span>.<span class="title">app</span>.<span class="title">Application</span></span></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;Service&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">android</span>.<span class="title">app</span>.<span class="title">Service</span></span></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;BroadcastReceiver&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">android</span>.<span class="title">content</span>.<span class="title">BroadcastReceiver</span></span></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;ContentProvider&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">android</span>.<span class="title">content</span>.<span class="title">ContentProvider</span></span></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;BackupAgentHelper&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">android</span>.<span class="title">app</span>.<span class="title">backup</span>.<span class="title">BackupAgentHelper</span></span></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;Preference&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">android</span>.<span class="title">preference</span>.<span class="title">Preference</span></span></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;ILicensingService&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">android</span>.<span class="title">vending</span>.<span class="title">licensing</span>.<span class="title">ILicensingService</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; native &#x65B9;&#x6CD5;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keepclasseswithmembernames <span class="class"><span class="keyword">class</span> * {</span></span><br><span class="line">    native &lt;methods&gt;;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;&#x81EA;&#x5B9A;&#x4E49;&#x63A7;&#x4EF6;&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keepclasseswithmembers <span class="class"><span class="keyword">class</span> * {</span></span><br><span class="line">    public &lt;init&gt;(android.content.Context, android.util.AttributeSet);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;&#x81EA;&#x5B9A;&#x4E49;&#x63A7;&#x4EF6;&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keepclasseswithmembers <span class="class"><span class="keyword">class</span> * {</span></span><br><span class="line">    public &lt;init&gt;(android.content.Context, android.util.AttributeSet, int);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;&#x81EA;&#x5B9A;&#x4E49;&#x63A7;&#x4EF6;&#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keepclassmembers <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">android</span>.<span class="title">app</span>.<span class="title">Activity</span> {</span></span><br><span class="line">    public void *(android.view.View);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301;&#x679A;&#x4E3E; enum &#x7C7B;&#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keepclassmembers <span class="class"><span class="keyword">enum</span> * {</span></span><br><span class="line">    public static **[] values();</span><br><span class="line">    public static ** valueOf(java.lang.String);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------# &#x4FDD;&#x6301; Parcelable &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> * <span class="title">implements</span> <span class="title">android</span>.<span class="title">os</span>.<span class="title">Parcelable</span> {</span></span><br><span class="line">    public static final android.os.Parcelable$Creator *;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; retrofit &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-dontwarn retrofit2.**</span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> <span class="title">retrofit2</span>.** { *;</span> }</span><br><span class="line">-dontwarn javax.<span class="keyword">annotation</span>.**</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; okhttp &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-dontwarn com.squareup.okhttp3.**</span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">squareup</span>.<span class="title">okhttp3</span>.** { *;</span>}</span><br><span class="line">-dontwarn okio.**</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; GreenDao &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keepclassmembers <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">org</span>.<span class="title">greenrobot</span>.<span class="title">greendao</span>.<span class="title">AbstractDao</span> {</span></span><br><span class="line">public static java.lang.String TABLENAME;</span><br><span class="line">}</span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> **$<span class="title">Properties</span></span></span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; Zbar &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> <span class="title">net</span>.<span class="title">sourceforge</span>.<span class="title">zbar</span>.** { *;</span> }</span><br><span class="line">-keep interface net.sourceforge.zbar.** { *; }</span><br><span class="line">-dontwarn net.sourceforge.zbar.**</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; Glide &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">implements</span> <span class="title">com</span>.<span class="title">bumptech</span>.<span class="title">glide</span>.<span class="title">module</span>.<span class="title">GlideModule</span></span></span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">com</span>.<span class="title">bumptech</span>.<span class="title">glide</span>.<span class="title">module</span>.<span class="title">AppGlideModule</span></span></span><br><span class="line">-keep public <span class="class"><span class="keyword">enum</span> <span class="title">com</span>.<span class="title">bumptech</span>.<span class="title">glide</span>.<span class="title">load</span>.<span class="title">resource</span>.<span class="title">bitmap</span>.<span class="title">ImageHeaderParser</span>$** {</span></span><br><span class="line">  **[] $VALUES;</span><br><span class="line">  public *;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; eventbus &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keepattributes *Annotation*</span><br><span class="line">-keepclassmembers <span class="class"><span class="keyword">class</span> ** {</span></span><br><span class="line">    @org.greenrobot.eventbus.Subscribe &lt;methods&gt;;</span><br><span class="line">}</span><br><span class="line">-keep <span class="class"><span class="keyword">enum</span> <span class="title">org</span>.<span class="title">greenrobot</span>.<span class="title">eventbus</span>.<span class="title">ThreadMode</span> { *;</span> }</span><br><span class="line"><span class="comment"># Only required if you use AsyncExecutor</span></span><br><span class="line">-keepclassmembers <span class="class"><span class="keyword">class</span> * <span class="title">extends</span> <span class="title">org</span>.<span class="title">greenrobot</span>.<span class="title">eventbus</span>.<span class="title">util</span>.<span class="title">ThrowableFailureEvent</span> {</span></span><br><span class="line">    &lt;init&gt;(java.lang.Throwable);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; MPAndroidChart &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">github</span>.<span class="title">mikephil</span>.<span class="title">charting</span>.** { *;</span> }</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; bugly &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-dontwarn com.tencent.bugly.**</span><br><span class="line">-keep public <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">tencent</span>.<span class="title">bugly</span>.**{*;</span>}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; gson &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> <span class="title">sun</span>.<span class="title">misc</span>.<span class="title">Unsafe</span> { *;</span> }</span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">google</span>.<span class="title">gson</span>.<span class="title">stream</span>.** { *;</span> }</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; Rxjava RxAndroid &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-dontwarn sun.misc.**</span><br><span class="line">-keepclassmembers <span class="class"><span class="keyword">class</span> <span class="title">rx</span>.<span class="title">internal</span>.<span class="title">util</span>.<span class="title">unsafe</span>.*<span class="title">ArrayQueue</span>*<span class="title">Field</span>* {</span></span><br><span class="line">   long producerIndex;</span><br><span class="line">   long consumerIndex;</span><br><span class="line">}</span><br><span class="line">-keepclassmembers <span class="class"><span class="keyword">class</span> <span class="title">rx</span>.<span class="title">internal</span>.<span class="title">util</span>.<span class="title">unsafe</span>.<span class="title">BaseLinkedQueueProducerNodeRef</span> {</span></span><br><span class="line">    rx.internal.util.atomic.LinkedQueueNode producerNode;</span><br><span class="line">}</span><br><span class="line">-keepclassmembers <span class="class"><span class="keyword">class</span> <span class="title">rx</span>.<span class="title">internal</span>.<span class="title">util</span>.<span class="title">unsafe</span>.<span class="title">BaseLinkedQueueConsumerNodeRef</span> {</span></span><br><span class="line">    rx.internal.util.atomic.LinkedQueueNode consumerNode;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; volley &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">android</span>.<span class="title">volley</span>.** { *;</span> }</span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">android</span>.<span class="title">volley</span>.<span class="title">toolbox</span>.** { *;</span> }</span><br><span class="line"></span><br><span class="line"><span class="comment">###-----------&#x4FDD;&#x6301; &#x672C;&#x9879;&#x76EE;&#x7684;gson&#x5B9E;&#x4F53;&#x7C7B; &#x4E0D;&#x88AB;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line"><span class="comment">###-----------&#x7F51;&#x7EDC;&#x8BF7;&#x6C42;&#x89E3;&#x6790;&#x7684;&#x5B9E;&#x4F53;&#x7C7B;&#x4E00;&#x5B9A;&#x4E0D;&#x8981;&#x6DF7;&#x6DC6;------------</span></span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> <span class="title">your</span>-<span class="title">package</span>.<span class="title">entity</span>.** { *;</span> }</span><br><span class="line"></span><br><span class="line"><span class="comment"># If your project uses WebView with JS, uncomment the following</span></span><br><span class="line"><span class="comment"># and specify the fully qualified class name to the JavaScript interface</span></span><br><span class="line"><span class="comment"># class:</span></span><br><span class="line"><span class="comment">#-keepclassmembers class fqcn.of.javascript.interface.for.webview {</span></span><br><span class="line"><span class="comment">#   public *;</span></span><br><span class="line"><span class="comment">#}</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Uncomment this to preserve the line number information for</span></span><br><span class="line"><span class="comment"># debugging stack traces.</span></span><br><span class="line"><span class="comment">#-keepattributes SourceFile,LineNumberTable</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># If you keep the line number information, uncomment this to</span></span><br><span class="line"><span class="comment"># hide the original source file name.</span></span><br><span class="line"><span class="comment">#-renamesourcefileattribute SourceFile</span></span><br></pre></td></tr></tbody></table></figure><h2 id="Proguard&#x5E38;&#x7528;&#x8BED;&#x6CD5;"><a href="#Proguard&#x5E38;&#x7528;&#x8BED;&#x6CD5;" class="headerlink" title="Proguard&#x5E38;&#x7528;&#x8BED;&#x6CD5;"></a><a href="http://www.trinea.cn/android/proguard-grammar/" target="_blank" rel="noopener">Proguard&#x5E38;&#x7528;&#x8BED;&#x6CD5;</a></h2><ul><li>&#x5173;&#x952E;&#x5B57;</li></ul><table><thead><tr><th>&#x5173;&#x952E;&#x5B57;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td>keep</td><td>&#x4FDD;&#x7559;&#x7C7B;&#x548C;&#x7C7B;&#x4E2D;&#x7684;&#x6210;&#x5458;&#xFF0C;&#x9632;&#x6B62;&#x5B83;&#x4EEC;&#x88AB;&#x79FB;&#x9664;&#x6216;&#x88AB;&#x91CD;&#x547D;&#x540D;</td></tr><tr><td>keepnames</td><td>&#x4FDD;&#x7559;&#x7C7B;&#x548C;&#x7C7B;&#x4E2D;&#x7684;&#x6210;&#x5458;&#xFF0C;&#x9632;&#x6B62;&#x5B83;&#x4EEC;&#x88AB;&#x91CD;&#x547D;&#x540D;&#xFF0C;&#x4F46;&#x5F53;&#x6210;&#x5458;&#x6CA1;&#x6709;&#x88AB;&#x5F15;&#x7528;&#x65F6;&#x4F1A;&#x88AB;&#x79FB;&#x9664;</td></tr><tr><td>keepclassmembers</td><td>&#x53EA;&#x4FDD;&#x7559;&#x7C7B;&#x4E2D;&#x7684;&#x6210;&#x5458;&#xFF0C;&#x9632;&#x6B62;&#x5B83;&#x4EEC;&#x88AB;&#x79FB;&#x9664;&#x6216;&#x8005;&#x88AB;&#x91CD;&#x547D;&#x540D;</td></tr><tr><td>keepclassmembernames</td><td>&#x53EA;&#x4FDD;&#x7559;&#x7C7B;&#x4E2D;&#x7684;&#x6210;&#x5458;&#xFF0C;&#x9632;&#x6B62;&#x5B83;&#x4EEC;&#x88AB;&#x91CD;&#x547D;&#x540D;&#xFF0C;&#x4F46;&#x5F53;&#x6210;&#x5458;&#x6CA1;&#x6709;&#x88AB;&#x5F15;&#x7528;&#x65F6;&#x4F1A;&#x88AB;&#x79FB;&#x9664;</td></tr><tr><td>keepclasseswithmembers</td><td>&#x9632;&#x6B62;<strong>&#x62E5;&#x6709;&#x8BE5;&#x6210;&#x5458;&#x7684;</strong>&#x7C7B;&#x548C;&#x6210;&#x5458;&#x88AB;&#x79FB;&#x9664;&#x6216;&#x88AB;&#x91CD;&#x547D;&#x540D;&#xFF0C;&#x524D;&#x63D0;&#x662F;&#x6307;&#x660E;&#x7684;&#x7C7B;&#x4E2D;&#x7684;&#x6210;&#x5458;&#x5FC5;&#x987B;&#x5B58;&#x5728;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x5219;&#x8FD8;&#x662F;&#x4F1A;&#x6DF7;&#x6DC6;</td></tr><tr><td>keepclasseswithmembernames</td><td>&#x9632;&#x6B62;<strong>&#x62E5;&#x6709;&#x8BE5;&#x6210;&#x5458;&#x7684;</strong>&#x7C7B;&#x548C;&#x6210;&#x5458;&#x88AB;&#x91CD;&#x547D;&#x540D;&#xFF0C;&#x4F46;&#x5F53;&#x6210;&#x5458;&#x6CA1;&#x6709;&#x88AB;&#x5F15;&#x7528;&#x65F6;&#x4F1A;&#x88AB;&#x79FB;&#x9664;&#xFF0C;&#x524D;&#x63D0;&#x662F;&#x6307;&#x660E;&#x7684;&#x7C7B;&#x4E2D;&#x7684;&#x6210;&#x5458;&#x5FC5;&#x987B;&#x5B58;&#x5728;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x5219;&#x8FD8;&#x662F;&#x4F1A;&#x6DF7;&#x6DC6;</td></tr></tbody></table><ul><li>&#x901A;&#x914D;&#x7B26;</li></ul><table><thead><tr><th>&#x901A;&#x914D;&#x7B26;</th><th>&#x63CF;&#x8FF0;</th></tr></thead><tbody><tr><td><code>&lt;field&gt;</code></td><td>&#x5339;&#x914D;&#x7C7B;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x5B57;&#x6BB5;</td></tr><tr><td><code>&lt;method&gt;</code></td><td>&#x5339;&#x914D;&#x7C7B;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x65B9;&#x6CD5;</td></tr><tr><td><code>&lt;init&gt;</code></td><td>&#x5339;&#x914D;&#x7C7B;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x6784;&#x9020;&#x51FD;&#x6570;</td></tr><tr><td><code>*</code></td><td><code>&#x5339;&#x914D;&#x4EFB;&#x610F;&#x957F;&#x5EA6;&#x5B57;&#x7B26;&#xFF0C;&#x4F46;&#x4E0D;&#x542B;&#x5305;&#x540D;&#x5206;&#x9694;&#x7B26;&#xFF08;.&#xFF09;&#xFF1B;&#x5982;&#x5B8C;&#x6574;&#x5305;&#x540D;&#xFF1A;com.example.test.util&#xFF0C;&#x4F7F;&#x7528;com.*&#x3001;com.example.*&#x90FD;&#x662F;&#x65E0;&#x6CD5;&#x5339;&#x914D;&#x7684;&#xFF0C;&#x56E0;&#x4E3A;*&#x65E0;&#x6CD5;&#x5339;&#x914D;&#x5305;&#x540D;&#x4E2D;&#x7684;&#x5206;&#x9694;&#x7B26;&#xFF0C;&#x6B63;&#x786E;&#x7684;&#x5339;&#x914D;&#x65B9;&#x5F0F;&#x662F;com.example.*.*&#x3001;com.example.test.*&#xFF1B;&#x5982;&#x679C;&#x4F60;&#x4E0D;&#x5199;&#x4EFB;&#x4F55;&#x5176;&#x4ED6;&#x5185;&#x5BB9;&#xFF0C;&#x53EA;&#x6709;&#x4E00;&#x4E2A;*&#xFF0C;&#x5219;&#x8868;&#x793A;&#x5339;&#x914D;&#x6240;&#x6709;&#x7684;&#x5B57;&#x7B26;</code></td></tr><tr><td><code>**</code></td><td>&#x5339;&#x914D;&#x4EFB;&#x610F;&#x957F;&#x5EA6;&#x5B57;&#x7B26;&#xFF0C;&#x5E76;&#x4E14;&#x5305;&#x542B;&#x5305;&#x540D;&#x5206;&#x9694;&#x7B26;&#xFF08;.&#xFF09;&#xFF1B;&#x5982;&#x6DF7;&#x6DC6;&#x6587;&#x4EF6;&#x91CC;&#x7684;&#xFF1A;dontwarn android.support.**&#x5C31;&#x53EF;&#x4EE5;&#x5339;&#x914D;android.support&#x5305;&#x4E0B;&#x7684;&#x6240;&#x6709;&#x5185;&#x5BB9;&#xFF0C;&#x5305;&#x62EC;&#x4EFB;&#x610F;&#x957F;&#x5EA6;&#x7684;&#x5B50;&#x5305;</td></tr><tr><td><code>***</code></td><td>&#x5339;&#x914D;&#x4EFB;&#x610F;&#x53C2;&#x6570;&#x7C7B;&#x578B;&#xFF1B;&#x5982;<code>void set(***)</code>&#x5339;&#x914D;&#x4EFB;&#x610F;&#x4F20;&#x5165;&#x7684;&#x53C2;&#x6570;&#x7C7B;&#x578B;&#xFF0C;<code>*** get()</code>&#x5C31;&#x80FD;&#x5339;&#x914D;&#x4EFB;&#x610F;&#x8FD4;&#x56DE;&#x503C;&#x7684;&#x7C7B;&#x578B;</td></tr><tr><td><code>...</code></td><td>&#x5339;&#x914D;&#x4EFB;&#x610F;&#x957F;&#x5EA6;&#x7684;&#x4EFB;&#x610F;&#x7C7B;&#x578B;&#x53C2;&#x6570;&#xFF1B;&#x5982;void test(&#x2026;)&#x5339;&#x914D;<code>void test(String a)</code>&#x6216;<code>void test(int a, String b)</code>&#x7B49;&#x7B49;</td></tr></tbody></table><ul><li>&#x5E38;&#x89C1;&#x89C4;&#x5219;</li></ul><p>&#x5F62;&#x5982;&#xFF1A;<br></p><figure class="highlight markdown"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">[<span class="string">&#x5173;&#x952E;&#x5B57;</span>][<span class="symbol">&#x7C7B;</span>]{</span><br><span class="line"><span class="code">[&#x6210;&#x5458;]</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p></p><p>&#x5305;&#xFF1A;<code>com.example.test</code><br>&#x7C7B;&#xFF1A;A</p><ul><li><p>&#x4E0D;&#x6DF7;&#x6DC6;&#x67D0;&#x4E2A;&#x7C7B;</p><figure class="highlight actionscript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-keep <span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">example</span>.<span class="title">test</span>.<span class="title">A</span> </span>{ *; }</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4E0D;&#x6DF7;&#x6DC6;&#x67D0;&#x4E2A;&#x5305;&#x4E0B;&#x6240;&#x6709;&#x7684;&#x7C7B;</p><figure class="highlight haml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-<span class="ruby">keep <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">example</span>.<span class="title">test</span>.**{ *;</span> }</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4E0D;&#x6DF7;&#x6DC6;&#x67D0;&#x4E2A;&#x7C7B;&#x7684;&#x5B50;&#x7C7B;</p><figure class="highlight scala"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-keep public <span class="class"><span class="keyword">class</span> <span class="title">*</span> <span class="keyword">extends</span> <span class="title">com</span>.<span class="title">example</span>.<span class="title">test</span>.<span class="title">A</span> </span>{ *; }</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4E0D;&#x6DF7;&#x6DC6;&#x6240;&#x6709;&#x7C7B;&#x540D;&#x4E2D;&#x5305;&#x542B;&#x4E86;&#x201D;&#x5173;&#x952E;&#x5B57;&#x201D;&#x7684;&#x7C7B;&#x53CA;&#x6210;&#x5458;</p><figure class="highlight actionscript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-keep <span class="keyword">public</span> <span class="class"><span class="keyword">class</span> **.*<span class="title">model</span>*.** </span>{ *; }</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4E0D;&#x6DF7;&#x6DC6;&#x67D0;&#x4E2A;&#x63A5;&#x53E3;</p><figure class="highlight actionscript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">-keep <span class="class"><span class="keyword">class</span> * <span class="keyword">implements</span> <span class="title">com</span>.<span class="title">example</span>.<span class="title">test</span>.<span class="title">Interface</span> </span>{ *; }</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4E0D;&#x6DF7;&#x6DC6;&#x67D0;&#x4E2A;&#x7C7B;&#x7684;&#x6784;&#x9020;&#x65B9;&#x6CD5;</p><figure class="highlight kotlin"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">-keepclassmembers <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">example</span>.<span class="title">test</span>.<span class="title">A</span> </span>{</span><br><span class="line"><span class="keyword">public</span> &lt;<span class="keyword">init</span>&gt;();</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4E0D;&#x6DF7;&#x6DC6;&#x67D0;&#x4E2A;&#x7C7B;&#x7684;&#x7279;&#x5B9A;&#x7684;&#x65B9;&#x6CD5;</p><figure class="highlight cpp"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">-keepclassmembers <span class="class"><span class="keyword">class</span> <span class="title">com</span>.<span class="title">example</span>.<span class="title">test</span>.<span class="title">A</span> {</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">test</span><span class="params">(java.lang.String)</span></span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4E0D;&#x6DF7;&#x6DC6;&#x67D0;&#x4E2A;&#x7C7B;&#x7684;&#x5185;&#x90E8;&#x7C7B;</p><figure class="highlight stata"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">-<span class="keyword">keep</span> <span class="keyword">class</span> com.example.<span class="keyword">test</span>.A$* {</span><br><span class="line"><span class="comment">*;</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ul><h2 id="&#x6DF7;&#x6DC6;&#x6CE8;&#x610F;"><a href="#&#x6DF7;&#x6DC6;&#x6CE8;&#x610F;" class="headerlink" title="&#x6DF7;&#x6DC6;&#x6CE8;&#x610F;"></a>&#x6DF7;&#x6DC6;&#x6CE8;&#x610F;</h2><p>&#x4EE3;&#x7801;&#x5F00;&#x542F;&#x6DF7;&#x6DC6;&#x4E4B;&#x540E;&#xFF0C;&#x8C03;&#x8BD5;app&#x6216;&#x8005;&#x9047;&#x5230;app&#x5F02;&#x5E38;&#x65F6;&#xFF0C;&#x6253;&#x5370;&#x91CC;&#x9762;&#x663E;&#x793A;&#x7684;&#x5219;&#x662F;<code>a b c...</code>&#x8FD9;&#x79CD;&#x7684;&#x5F02;&#x5E38;&#xFF0C;&#x5B9A;&#x4F4D;&#x4E0D;&#x5230;&#x5F02;&#x5E38;&#x7684;&#x4F4D;&#x7F6E;&#xFF0C;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x5728;&#x76EE;&#x5F55;<code>build\outputs\mapping\release</code>&#x91CC;&#xFF0C;&#x4F7F;&#x7528;mapping.txt&#xFF0C;&#x7ED3;&#x5408;SDK&#x91CC;&#x7684;&#x5DE5;&#x5177;<br><code>sdk\tools\proguard\bin\proguardgui.bat</code>-&gt;ReTrace&#xFF0C;&#x8FDB;&#x884C;&#x5B9A;&#x4F4D;&#x5F02;&#x5E38;&#xFF0C;&#x57FA;&#x672C;&#x4E0A;&#x53EF;&#x4EE5;&#x5B9A;&#x4F4D;&#xFF0C;&#x7136;&#x540E;&#x89E3;&#x51B3;&#x5F02;&#x5E38;&#x9519;&#x8BEF;&#x3002;</p><h1 id="&#x52A0;&#x58F3;"><a href="#&#x52A0;&#x58F3;" class="headerlink" title="&#x52A0;&#x58F3;"></a>&#x52A0;&#x58F3;</h1><p>&#x52A0;&#x58F3;&#x662F;&#x5728;&#x4E8C;&#x8FDB;&#x5236;&#x7684;&#x7A0B;&#x5E8F;&#x4E2D;&#x690D;&#x5165;&#x4E00;&#x6BB5;&#x4EE3;&#x7801;&#xFF0C;&#x5728;&#x8FD0;&#x884C;&#x7684;&#x65F6;&#x5019;&#x4F18;&#x5148;&#x53D6;&#x5F97;&#x7A0B;&#x5E8F;&#x7684;&#x63A7;&#x5236;&#x6743;&#xFF0C;&#x505A;&#x4E00;&#x4E9B;&#x989D;&#x5916;&#x7684;&#x5DE5;&#x4F5C;&#x3002;&#x662F;&#x5E94;&#x7528;&#x52A0;&#x56FA;&#x7684;&#x4E00;&#x79CD;&#x624B;&#x6CD5;&#x5BF9;&#x539F;&#x59CB;&#x4E8C;&#x8FDB;&#x5236;&#x539F;&#x6587;&#x8FDB;&#x884C;&#x52A0;&#x5BC6;/&#x9690;&#x85CF;/&#x6DF7;&#x6DC6;&#x3002;&#x52A0;&#x58F3;&#x7684;&#x7A0B;&#x5E8F;&#x53EF;&#x4EE5;&#x6709;&#x6548;&#x963B;&#x6B62;&#x5BF9;&#x7A0B;&#x5E8F;&#x7684;&#x53CD;&#x6C47;&#x7F16;&#x5206;&#x6790;&#xFF0C;&#x5E38;&#x7528;&#x6765;&#x4FDD;&#x62A4;&#x8F6F;&#x4EF6;&#x7248;&#x6743;&#xFF0C;&#x9632;&#x6B62;&#x88AB;&#x8F6F;&#x4EF6;&#x7834;&#x89E3;&#x3002;</p><h2 id="Android-Dex&#x6587;&#x4EF6;&#x52A0;&#x58F3;&#x539F;&#x7406;"><a href="#Android-Dex&#x6587;&#x4EF6;&#x52A0;&#x58F3;&#x539F;&#x7406;" class="headerlink" title="Android Dex&#x6587;&#x4EF6;&#x52A0;&#x58F3;&#x539F;&#x7406;"></a>Android Dex&#x6587;&#x4EF6;&#x52A0;&#x58F3;&#x539F;&#x7406;</h2><p>Android Dex&#x6587;&#x4EF6;&#x5927;&#x91CF;&#x4F7F;&#x7528;&#x5F15;&#x7528;&#x7ED9;&#x52A0;&#x58F3;&#x5E26;&#x6765;&#x4E86;&#x4E00;&#x5B9A;&#x7684;&#x96BE;&#x5EA6;&#xFF0C;&#x4F46;&#x662F;&#x4ECE;&#x7406;&#x8BBA;&#x4E0A;&#x8BB2;&#xFF0C;Android APK&#x52A0;&#x58F3;&#x4E5F;&#x662F;&#x53EF;&#x884C;&#x7684;&#x3002;</p><ul><li><p>&#x52A0;&#x58F3;&#x7A0B;&#x5E8F;&#xFF1A;&#x52A0;&#x5BC6;&#x6E90;&#x7A0B;&#x5E8F;&#x4E3A;&#x89E3;&#x58F3;&#x6570;&#x636E;&#x3001;&#x7EC4;&#x88C5;&#x89E3;&#x58F3;&#x7A0B;&#x5E8F;&#x548C;&#x89E3;&#x58F3;&#x6570;&#x636E;</p></li><li><p>&#x89E3;&#x58F3;&#x7A0B;&#x5E8F;&#xFF1A;&#x89E3;&#x5BC6;&#x89E3;&#x58F3;&#x6570;&#x636E;&#xFF0C;&#x5E76;&#x8FD0;&#x884C;&#x65F6;&#x901A;&#x8FC7;DexClassLoader&#x52A8;&#x6001;&#x52A0;&#x8F7D;</p></li><li><p>&#x6E90;&#x7A0B;&#x5E8F;&#xFF1A;&#x9700;&#x8981;&#x52A0;&#x58F3;&#x5904;&#x7406;&#x7684;&#x88AB;&#x4FDD;&#x62A4;&#x4EE3;&#x7801;</p></li></ul><h2 id="&#x52A0;&#x58F3;&#x7684;&#x5229;&#x4E0E;&#x5F0A;"><a href="#&#x52A0;&#x58F3;&#x7684;&#x5229;&#x4E0E;&#x5F0A;" class="headerlink" title="&#x52A0;&#x58F3;&#x7684;&#x5229;&#x4E0E;&#x5F0A;"></a>&#x52A0;&#x58F3;&#x7684;&#x5229;&#x4E0E;&#x5F0A;</h2><h3 id="&#x4F18;&#x52BF;"><a href="#&#x4F18;&#x52BF;" class="headerlink" title="&#x4F18;&#x52BF;"></a>&#x4F18;&#x52BF;</h3><ul><li><p>&#x4FDD;&#x62A4;&#x81EA;&#x5DF1;&#x6838;&#x5FC3;&#x4EE3;&#x7801;&#x7B97;&#x6CD5;,&#x63D0;&#x9AD8;&#x7834;&#x89E3;/&#x76D7;&#x7248;/&#x4E8C;&#x6B21;&#x6253;&#x5305;&#x7684;&#x96BE;&#x5EA6;</p></li><li><p>&#x8FD8;&#x53EF;&#x4EE5;&#x7F13;&#x89E3;&#x4EE3;&#x7801;&#x6CE8;&#x5165;/&#x52A8;&#x6001;&#x8C03;&#x8BD5;/&#x5185;&#x5B58;&#x6CE8;&#x5165;&#x653B;&#x51FB;</p></li></ul><h3 id="&#x52A3;&#x52BF;"><a href="#&#x52A3;&#x52BF;" class="headerlink" title="&#x52A3;&#x52BF;"></a>&#x52A3;&#x52BF;</h3><ul><li><p>&#x5F71;&#x54CD;&#x517C;&#x5BB9;&#x6027;</p></li><li><p>&#x5F71;&#x54CD;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x6548;&#x7387;</p></li></ul><h2 id="&#x5E38;&#x7528;&#x7684;&#x52A0;&#x58F3;&#x65B9;&#x5F0F;"><a href="#&#x5E38;&#x7528;&#x7684;&#x52A0;&#x58F3;&#x65B9;&#x5F0F;" class="headerlink" title="&#x5E38;&#x7528;&#x7684;&#x52A0;&#x58F3;&#x65B9;&#x5F0F;"></a>&#x5E38;&#x7528;&#x7684;&#x52A0;&#x58F3;&#x65B9;&#x5F0F;</h2><ul><li><a href="https://cloud.tencent.com/product/ms?idx=2" target="_blank" rel="noopener">&#x817E;&#x8BAF;&#x4E50;&#x56FA;</a></li></ul><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E8%97%8F%E5%9C%A8%E5%A2%99%E4%B8%AD%E7%9A%84android.jpg&quot; alt=&quot;Android&quot; title=&quot;藏在墙中的android&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;反编译并不是为了去破解人家辛辛苦苦开发的app；混淆与加壳也是为了在一定程度上保护自己的开发成果。反编译、混淆、加壳是非常有用的技能。&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Android" scheme="https://tiimor.cn/tags/Android/"/>
    
      <category term="混淆" scheme="https://tiimor.cn/tags/%E6%B7%B7%E6%B7%86/"/>
    
      <category term="反编译" scheme="https://tiimor.cn/tags/%E5%8F%8D%E7%BC%96%E8%AF%91/"/>
    
      <category term="加壳" scheme="https://tiimor.cn/tags/%E5%8A%A0%E5%A3%B3/"/>
    
  </entry>
  
  <entry>
    <title>Android图表库-MPAndroidChart</title>
    <link href="https://tiimor.cn/Android%E5%9B%BE%E8%A1%A8%E5%BA%93-MPAndroidChart/"/>
    <id>https://tiimor.cn/Android图表库-MPAndroidChart/</id>
    <published>2017-12-10T06:29:46.000Z</published>
    <updated>2019-03-17T06:47:42.363Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/MPAndroidChart.png" alt="Android" title="MPAndroidChart"></p><p><strong><a href="https://github.com/PhilJay/MPAndroidChart" target="_blank" rel="noopener">MPAndroidChart</a>&#x56FE;&#x8868;&#x5E93;&#x7684;&#x4F7F;&#x7528;</strong></p><a id="more"></a><p>MPAndroidChart&#x662F;&#x4E00;&#x6B3E;&#x57FA;&#x4E8E;Android&#x7684;&#x5F00;&#x6E90;&#x56FE;&#x8868;&#x5E93;&#xFF0C;MPAndroidChart&#x4E0D;&#x4EC5;&#x53EF;&#x4EE5;&#x5728;Android&#x8BBE;&#x5907;&#x4E0A;&#x7ED8;&#x5236;&#x5404;&#x79CD;&#x7EDF;&#x8BA1;&#x56FE;&#x8868;&#xFF0C;&#x800C;&#x4E14;&#x53EF;&#x4EE5;&#x5BF9;&#x56FE;&#x8868;&#x8FDB;&#x884C;&#x62D6;&#x52A8;&#x548C;&#x7F29;&#x653E;&#x64CD;&#x4F5C;&#xFF0C;&#x5E94;&#x7528;&#x8D77;&#x6765;&#x975E;&#x5E38;&#x7075;&#x6D3B;&#x3002;MPAndroidChart&#x663E;&#x5F97;&#x66F4;&#x4E3A;&#x8F7B;&#x5DE7;&#x548C;&#x7B80;&#x5355;&#xFF0C;&#x62E5;&#x6709;&#x5E38;&#x7528;&#x7684;&#x56FE;&#x8868;&#x7C7B;&#x578B;&#xFF1A;&#x7EBF;&#x578B;&#x56FE;&#x3001;&#x997C;&#x56FE;&#x3001;&#x67F1;&#x72B6;&#x56FE;&#x548C;&#x6563;&#x70B9;&#x56FE;&#x3002;</p><h1 id="&#x6838;&#x5FC3;&#x529F;&#x80FD;"><a href="#&#x6838;&#x5FC3;&#x529F;&#x80FD;" class="headerlink" title="&#x6838;&#x5FC3;&#x529F;&#x80FD;"></a>&#x6838;&#x5FC3;&#x529F;&#x80FD;</h1><ul><li>&#x652F;&#x6301;x&#xFF0C;y&#x8F74;&#x7F29;&#x653E;</li><li>&#x652F;&#x6301;&#x62D6;&#x62FD;</li><li>&#x652F;&#x6301;&#x624B;&#x6307;&#x6ED1;&#x52A8;</li><li>&#x652F;&#x6301;&#x9AD8;&#x4EAE;&#x663E;&#x793A;</li><li>&#x652F;&#x6301;&#x4FDD;&#x5B58;&#x56FE;&#x8868;&#x5230;&#x6587;&#x4EF6;&#x4E2D;</li><li>&#x652F;&#x6301;&#x4ECE;&#x6587;&#x4EF6;&#xFF08;txt&#xFF09;&#x4E2D;&#x8BFB;&#x53D6;&#x6570;&#x636E;</li><li>&#x9884;&#x5148;&#x5B9A;&#x4E49;&#x989C;&#x8272;&#x6A21;&#x677F;</li><li>&#x81EA;&#x52A8;&#x751F;&#x6210;&#x6807;&#x6CE8;</li><li>&#x652F;&#x6301;&#x81EA;&#x5B9A;&#x4E49;x&#xFF0C;y&#x8F74;&#x7684;&#x663E;&#x793A;&#x6807;&#x7B7E;</li><li>&#x652F;&#x6301;x&#xFF0C;y&#x8F74;&#x52A8;&#x753B;</li><li>&#x652F;&#x6301;x&#xFF0C;y&#x8F74;&#x8BBE;&#x7F6E;&#x6700;&#x5927;&#x503C;&#x548C;&#x9644;&#x52A0;&#x4FE1;&#x606F;</li><li>&#x652F;&#x6301;&#x81EA;&#x5B9A;&#x4E49;&#x5B57;&#x4F53;&#xFF0C;&#x989C;&#x8272;&#xFF0C;&#x80CC;&#x666F;&#xFF0C;&#x624B;&#x52BF;&#xFF0C;&#x865A;&#x7EBF;&#x7B49;</li></ul><h1 id="&#x56FE;&#x8868;&#x7C7B;&#x578B;"><a href="#&#x56FE;&#x8868;&#x7C7B;&#x578B;" class="headerlink" title="&#x56FE;&#x8868;&#x7C7B;&#x578B;"></a>&#x56FE;&#x8868;&#x7C7B;&#x578B;</h1><ul><li><p>LineChart (with legend, simple design)<br><img src="http://cdn.tiimor.cn/images/LineChart1.png" alt="LineChart1"></p></li><li><p>LineChart (with legend, simple design)<br><img src="http://cdn.tiimor.cn/images/LineChart2.png" alt="LineChart2"></p></li><li><p>LineChart (cubic lines)<br><img src="http://cdn.tiimor.cn/images/LineChart3.png" alt="LineChart3"></p></li><li><p>LineChart (gradient fill)<br><img src="http://cdn.tiimor.cn/images/LineChart4.png" alt="LineChart4"></p></li><li><p>Combined-Chart (bar- and linechart in this case)<br><img src="http://cdn.tiimor.cn/images/Combined-Chart.png" alt="Combined-Chart"></p></li><li><p>BarChart (with legend, simple design)<br><img src="http://cdn.tiimor.cn/images/BarChart1.png" alt="BarChart1"></p></li><li><p>BarChart (grouped DataSets)<br><img src="http://cdn.tiimor.cn/images/BarChart2.png" alt="BarChart2"></p></li><li><p>Horizontal-BarChart<br><img src="http://cdn.tiimor.cn/images/Horizontal-BarChart.png" alt="Horizontal-BarChart"></p></li><li><p>PieChart (with selection, &#x2026;)<br><img src="http://cdn.tiimor.cn/images/PieChart.png" alt="PieChart"></p></li><li><p>ScatterChart (with squares, triangles, circles, &#x2026; and more)<br><img src="http://cdn.tiimor.cn/images/ScatterChart.png" alt="ScatterChart"></p></li><li><p>CandleStickChart (for financial data)<br><img src="http://cdn.tiimor.cn/images/CandleStickChart.png" alt="CandleStickChart"></p></li><li><p>BubbleChart (area covered by bubbles indicates the yValue)<br><img src="http://cdn.tiimor.cn/images/BubbleChart.png" alt="BubbleChart"></p></li><li><p>RadarChart (spider web chart)<br><img src="http://cdn.tiimor.cn/images/RadarChart.png" alt="RadarChart"></p></li></ul><h1 id="&#x56FE;&#x8868;&#x7ED8;&#x5236;"><a href="#&#x56FE;&#x8868;&#x7ED8;&#x5236;" class="headerlink" title="&#x56FE;&#x8868;&#x7ED8;&#x5236;"></a>&#x56FE;&#x8868;&#x7ED8;&#x5236;</h1><h2 id="XY&#x8F74;&#x7ED8;&#x5236;"><a href="#XY&#x8F74;&#x7ED8;&#x5236;" class="headerlink" title="XY&#x8F74;&#x7ED8;&#x5236;"></a>XY&#x8F74;&#x7ED8;&#x5236;</h2><ul><li><code>setEnabled(boolean enabled)</code>:&#x8BBE;&#x7F6E;&#x8F74;&#x662F;&#x5426;&#x88AB;&#x7ED8;&#x5236;&#x3002;&#x9ED8;&#x8BA4;&#x7ED8;&#x5236;,false&#x4E0D;&#x4F1A;&#x88AB;&#x7ED8;&#x5236;&#x3002;</li><li><code>setDrawLabels(boolean enabled)</code>:&#x8BBE;&#x7F6E;&#x4E3A;true&#x6253;&#x5F00;&#x7ED8;&#x5236;&#x8F74;&#x7684;&#x6807;&#x7B7E;&#x3002;</li><li><code>setDrawAxisLine(boolean enabled)</code>:&#x8BBE;&#x7F6E;&#x4E3A;true&#xFF0C;&#x7ED8;&#x5236;&#x8F74;&#x7EBF;</li><li><code>setDrawGridLines(boolean enabled)</code>:&#x8BBE;&#x7F6E;&#x4E3A;true&#x7ED8;&#x5236;&#x7F51;&#x683C;&#x7EBF;&#x3002;</li></ul><h2 id="&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x6837;&#x5F0F;"><a href="#&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x6837;&#x5F0F;" class="headerlink" title="&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x6837;&#x5F0F;"></a>&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x6837;&#x5F0F;</h2><ul><li><code>setTextColor(int color)</code>:&#x8BBE;&#x7F6E;&#x8F74;&#x6807;&#x7B7E;&#x6587;&#x672C;&#x989C;&#x8272;&#x3002;</li><li><code>setTextSize(float size)</code>:&#x8BBE;&#x7F6E;&#x8F74;&#x6807;&#x7B7E;&#x7684;&#x5B57;&#x4F53;&#x5927;&#x5C0F;&#x3002;</li><li><code>setTypeface(Typeface tf)</code>:&#x8BBE;&#x7F6E;&#x8F74;&#x6807;&#x7B7E;&#x7684;&#x81EA;&#x5B9A;&#x4E49;Typeface</li><li><code>setGridColor(int color)</code>:&#x8BBE;&#x7F6E;&#x7F51;&#x683C;&#x7EBF;&#x989C;&#x8272;&#x3002;</li><li><code>setGridLineWidth(float width)</code>:&#x8BBE;&#x7F6E;&#x7F51;&#x683C;&#x7EBF;&#x5BBD;&#x5EA6;&#x3002;</li><li><code>setAxisLineColor(int color)</code>:&#x8BBE;&#x7F6E;&#x6B64;&#x8F74;&#x7684;&#x5750;&#x6807;&#x8F74;&#x7684;&#x989C;&#x8272;&#x3002;</li><li><code>setAxisLineWidth(float width)</code>:&#x8BBE;&#x7F6E;&#x6B64;&#x8F74;&#x7684;&#x5750;&#x6807;&#x8F74;&#x7684;&#x5BBD;&#x5EA6;&#x3002;</li><li><code>setVisibleXRangeMaximum(float maxXRange)</code>:&#x8BBE;&#x7F6E;x&#x8F74;&#x6700;&#x591A;&#x663E;&#x793A;&#x6570;&#x636E;&#x6761;&#x6570;&#xFF0C;&#xFF08;&#x8981;&#x5728;&#x8BBE;&#x7F6E;&#x6570;&#x636E;&#x6E90;&#x540E;&#x8C03;&#x7528;&#xFF0C;&#x5426;&#x5219;&#x662F;&#x65E0;&#x6548;&#x7684;&#xFF09;</li><li><code>enableGridDashedLine(float lineLength, float spaceLength, float phase)</code>:&#x663E;&#x793A;&#x7F51;&#x683C;&#x7EBF;&#x865A;&#x7EBF;&#x6A21;&#x5F0F;&#xFF0C;&#x201C;lineLength&#x201D;&#x63A7;&#x5236;&#x77ED;&#x7EBF;&#x6761;&#x7684;&#x957F;&#x5EA6;&#xFF0C;&#x201C;spaceLength&#x201D;&#x63A7;&#x5236;&#x4E24;&#x6BB5;&#x7EBF;&#x4E4B;&#x95F4;&#x7684;&#x95F4;&#x9694;&#x957F;&#x5EA6;&#xFF0C;&#x201C;phase&#x201D;&#x63A7;&#x5236;&#x5F00;&#x59CB;&#x7684;&#x70B9;&#x3002;</li></ul><h2 id="&#x81EA;&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x7684;&#x503C;"><a href="#&#x81EA;&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x7684;&#x503C;" class="headerlink" title="&#x81EA;&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x7684;&#x503C;"></a>&#x81EA;&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x7684;&#x503C;</h2><ul><li><code>setAdjustXLabels(boolean enabled)</code>:&#x5982;&#x679C;&#x88AB;&#x8BBE;&#x7F6E;&#x4E3A;true&#xFF0C;x&#x8F74;&#x6761;&#x76EE;&#x5C06;&#x4F9D;&#x8D56;&#x4E8E;&#x5B83;&#x81EA;&#x5DF1;&#x5728;&#x8FDB;&#x884C;&#x7F29;&#x653E;&#x7684;&#x65F6;&#x5019;&#x3002;&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E3A;false&#xFF0C;x&#x8F74;&#x6761;&#x76EE;&#x5C06;&#x603B;&#x662F;&#x4FDD;&#x6301;&#x76F8;&#x540C;&#x3002;</li><li><code>setAvoidFirstLastClipping(boolean enabled)</code>:&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E3A;true&#xFF0C;&#x56FE;&#x8868;&#x5C06;&#x907F;&#x514D;&#x7B2C;&#x4E00;&#x4E2A;&#x548C;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x6807;&#x7B7E;&#x6761;&#x76EE;&#x88AB;&#x51CF;&#x6389;&#x5728;&#x56FE;&#x8868;&#x6216;&#x5C4F;&#x5E55;&#x7684;&#x8FB9;&#x7F18;&#x3002;</li><li><code>setSpaceBetweenLabels(int characters)</code>:&#x8BBE;&#x7F6E;x&#x8F74;&#x6807;&#x7B7E;&#x4E4B;&#x95F4;&#x7684;&#x7A7A;&#x95F4;&#x5B57;&#x7B26;&#x6570;&#xFF0C;&#x9ED8;&#x8BA4;&#x662F;4&#x4E2A;&#x3002;</li><li><code>setPosition(XAxisPosition pos)</code>:&#x8BBE;&#x7F6E;XAxis&#x5E94;&#x8BE5;&#x51FA;&#x73B0;&#x7684;&#x4F4D;&#x7F6E;&#x3002;&#x53EF;&#x4EE5;&#x9009;&#x62E9;TOP&#xFF0C;BOTTOM&#xFF0C;BOTH_SIDED&#xFF0C;TOP_INSIDE&#x6216;&#x8005;BOTTOM_INSIDE&#x3002;</li><li><code>setStartAtZero(boolean enabled)</code>:&#x5982;&#x679C;&#x8FD9;&#x4E2A;&#x6253;&#x5F00;&#xFF0C;&#x8F74;&#x7EBF;&#x603B;&#x662F;&#x6709;&#x6700;&#x5C0F;&#x503C;0,&#x65E0;&#x8BBA;&#x4EC0;&#x4E48;&#x7C7B;&#x578B;&#x7684;&#x56FE;&#x8868;&#x88AB;&#x5C55;&#x793A;&#x3002;</li><li><code>setAxisMaxValue(float max)</code>:&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x6700;&#x5927;&#x503C;&#x4E3A;&#x8FD9;&#x6761;&#x8F74;&#xFF0C;&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E86;&#xFF0C;&#x8FD9;&#x4E2A;&#x503C;&#x5C06;&#x4E0D;&#x4F1A;&#x4F9D;&#x8D56;&#x4E8E;&#x63D0;&#x4F9B;&#x7684;&#x6570;&#x636E;&#x81EA;&#x52A8;&#x8BA1;&#x7B97;&#x3002;</li><li><code>resetAxisMaxValue()</code>:&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x5C06;&#x64A4;&#x9500;&#x4EE5;&#x524D;&#x8BBE;&#x7F6E;&#x7684;&#x6700;&#x5927;&#x503C;&#x3002;&#x8FD9;&#x610F;&#x5473;&#x7740;&#xFF0C;&#x4F60;&#x5C06;&#x518D;&#x6B21;&#x5141;&#x8BB8;&#x8F74;&#x81EA;&#x52A8;&#x8BA1;&#x7B97;&#x5B83;&#x7684;&#x6700;&#x5927;&#x503C;&#x3002;</li><li><code>setAxisMinValue(float min)</code>:&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x6700;&#x5C0F;&#x503C;&#x3002;&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E86;&#xFF0C;&#x8FD9;&#x4E2A;&#x503C;&#x5C06;&#x4E0D;&#x4F1A;&#x4F9D;&#x8D56;&#x4E8E;&#x4F60;&#x63D0;&#x4F9B;&#x7684;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x81EA;&#x52A8;&#x8BA1;&#x7B97;&#x3002;</li><li><code>resetAxisMinValue()</code>:&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x64A4;&#x9500;&#x4EE5;&#x524D;&#x8BBE;&#x7F6E;&#x7684;&#x6700;&#x5C0F;&#x503C;&#x3002;&#x8FD9;&#x610F;&#x5473;&#x7740;&#xFF0C;&#x4F60;&#x5C06;&#x518D;&#x6B21;&#x5141;&#x8BB8;&#x8F74;&#x81EA;&#x52A8;&#x8BA1;&#x7B97;&#x4ED6;&#x7684;&#x6700;&#x5C0F;&#x503C;&#x3002;</li><li><code>setInverted(boolean enabled)</code>:&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E3A;true&#xFF0C;&#x8FD9;&#x4E2A;&#x8F74;&#x5C06;&#x88AB;&#x53CD;&#x5411;&#xFF0C;&#x90A3;&#x610F;&#x5473;&#x7740;&#x6700;&#x9AD8;&#x51FA;&#x7684;&#x5C06;&#x5230;&#x5E95;&#x90E8;&#xFF0C;&#x6700;&#x4F4E;&#x90E8;&#x7684;&#x5230;&#x9876;&#x7AEF;&#x3002;</li><li><code>setSpaceTop(float percent)</code>:&#x8BBE;&#x7F6E;&#x5728;&#x56FE;&#x8868;&#x4E0A;&#x6700;&#x9AD8;&#x5904;&#x7684;&#x503C;&#x76F8;&#x6BD4;&#x8F74;&#x4E0A;&#x6700;&#x9AD8;&#x503C;&#x7684;&#x9876;&#x7AEF;&#x7A7A;&#x95F4;&#xFF08;&#x603B;&#x8F74;&#x8303;&#x56F4;&#x7684;&#x767E;&#x5206;&#x6BD4;&#xFF09;</li><li><code>setSpaceBottom(float percent)</code>:&#x8BBE;&#x7F6E;&#x5728;&#x56FE;&#x8868;&#x4E0A;&#x6700;&#x4F4E;&#x5904;&#x7684;&#x503C;&#x76F8;&#x6BD4;&#x8F74;&#x4E0A;&#x6700;&#x4F4E;&#x5904;&#x503C;&#x7684;&#x5E95;&#x90E8;&#x7A7A;&#x95F4;&#xFF08;&#x603B;&#x8F74;&#x8303;&#x56F4;&#x7684;&#x767E;&#x5206;&#x6BD4;&#xFF09;</li><li><code>setShowOnlyMinMax(boolean enabled)</code>:&#x5982;&#x679C;&#x6253;&#x5F00;&#x4E86;&#xFF0C;&#x8FD9;&#x4E2A;&#x8F74;&#x5C06;&#x5C55;&#x793A;&#x51FA;&#x5B83;&#x7684;&#x6700;&#x5C0F;&#x503C;&#x548C;&#x6700;&#x5927;&#x503C;&#x3002;&#x8FD9;&#x5C06;&#x5FFD;&#x7565;&#x6216;&#x8005;&#x8986;&#x76D6;&#x5B9A;&#x4E49;&#x8FC7;&#x7684;label-count&#x3002;</li><li><code>setPosition(YAxisLabelPosition pos)</code>:&#x8BBE;&#x7F6E;&#x8F74;&#x6807;&#x7B7E;&#x5E94;&#x8BE5;&#x88AB;&#x7ED8;&#x5236;&#x7684;&#x4F4D;&#x7F6E;&#x3002;INSIDE_CHART&#x6216;&#x8005;OUTSIDE_CHART&#x4E2D;&#x7684;&#x4E00;&#x4E2A;&#x3002; &#x81EA;&#x5B9A;&#x4E49;&#x5F71;&#x54CD;&#x8F74;&#x7684;&#x6570;&#x503C;&#x8303;&#x56F4;&#x5E94;&#x8BE5;&#x5728;&#x56FE;&#x8868;&#x88AB;&#x8BBE;&#x7F6E;&#x6570;&#x636E;&#x4E4B;&#x524D;&#x5E94;&#x7528;&#x3002;</li></ul><h2 id="&#x56FE;&#x8868;&#x6837;&#x5F0F;"><a href="#&#x56FE;&#x8868;&#x6837;&#x5F0F;" class="headerlink" title="&#x56FE;&#x8868;&#x6837;&#x5F0F;"></a>&#x56FE;&#x8868;&#x6837;&#x5F0F;</h2><p>&#x4E00;&#x4E9B;&#x6837;&#x5F0F;&#x76F8;&#x5173;&#x65B9;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x4F7F;&#x7528;<br>&#x6709;&#x5173;&#x66F4;&#x8BE6;&#x5C3D;&#x5355;&#x72EC;&#x56FE;&#x8868;&#x7C7B;&#x578B;&#x7684;&#x6837;&#x5F0F;&#x548C;&#x8BBE;&#x7F6E;&#xFF0C;&#x8BF7;&#x770B;&#x770B;&#x5177;&#x4F53;&#x7684;&#x56FE;&#x8868;&#x8BBE;&#x7F6E;&#x7684;wiki&#x9875;&#x9762;<a href="https://github.com/PhilJay/MPAndroidChart/wiki/Specific-chart-settings" target="_blank" rel="noopener">Specific-chart-settings</a></p><ul><li><code>setBackgroundColor(int color)</code>:&#x8BBE;&#x7F6E;&#x6574;&#x4E2A;&#x56FE;&#x8868;&#x89C6;&#x56FE;&#x7684;&#x80CC;&#x666F;</li><li><code>setDescription(String desc)</code>:&#x53F3;&#x4E0B;&#x89D2;&#x5BF9;&#x56FE;&#x8868;&#x7684;&#x63CF;&#x8FF0;&#x4FE1;&#x606F;</li><li><code>setDescriptionColor(int color)</code>:&#x63CF;&#x8FF0;&#x4FE1;&#x606F;&#x7684;&#x989C;&#x8272;</li><li><code>setDescriptionPosition(float x, float y)</code>:&#x81EA;&#x5B9A;&#x4E49;&#x63CF;&#x8FF0;&#x4FE1;&#x606F;&#x4F4D;&#x7F6E;.</li><li><code>setDescriptionTypeface(Typeface t)</code>:&#x81EA;&#x5B9A;&#x4E49;&#x63CF;&#x8FF0;&#x4FE1;&#x606F;&#x5B57;&#x4F53;</li><li><code>setDescriptionTextSize(float size)</code>:&#x81EA;&#x5B9A;&#x4E49;&#x63CF;&#x8FF0;&#x4FE1;&#x606F;&#x5B57;&#x4F53;&#x5927;&#x5C0F;, &#x6700;&#x5C0F;&#x503C;6f, &#x6700;&#x5927;&#x503C;16f.</li><li><code>setNoDataTextDescription(String desc)</code>:&#x8BBE;&#x7F6E;&#x7A7A;&#x8868;&#x7684;&#x63CF;&#x8FF0;&#x4FE1;&#x606F;</li><li><code>setDrawGridBackground(boolean enabled)</code>:&#x662F;&#x5426;&#x7ED8;&#x5236;&#x7F51;&#x683C;&#x80CC;&#x666F;</li><li><code>setGridBackgroundColor(int color)</code>:&#x8BBE;&#x7F6E;&#x7F51;&#x683C;&#x80CC;&#x666F;&#x989C;&#x8272;</li><li><code>setDrawBorders(boolean enabled)</code>:&#x662F;&#x5426;&#x7ED8;&#x5236;&#x8FB9;&#x7EBF;</li><li><code>setBorderColor(int color)</code>:&#x8FB9;&#x7EBF;&#x989C;&#x8272;</li><li><code>setBorderWidth(float width)</code>:&#x8FB9;&#x7EBF;&#x5BBD;&#x5EA6;&#xFF0C;&#x5355;&#x4F4D;dp</li><li><code>setMaxVisibleValueCount(int count)</code>:&#x8BBE;&#x7F6E;&#x56FE;&#x8868;&#x7ED8;&#x5236;&#x53EF;&#x89C1;&#x6807;&#x7B7E;&#x6570;&#x91CF;&#x6700;&#x5927;&#x503C;. &#x4EC5;&#x5728;setDrawValues() &#x542F;&#x7528;&#x65F6;&#x751F;&#x6548;</li></ul><h2 id="&#x6253;&#x5370;&#x65E5;&#x5FD7;"><a href="#&#x6253;&#x5370;&#x65E5;&#x5FD7;" class="headerlink" title="&#x6253;&#x5370;&#x65E5;&#x5FD7;"></a>&#x6253;&#x5370;&#x65E5;&#x5FD7;</h2><ul><li><code>setLogEnabled(boolean enabled)</code>:&#x8BBE;&#x7F6E;&#x4E3A;true&#x4F1A;&#x6FC0;&#x6D3B;log&#x8F93;&#x51FA;&#x3002;&#x4F7F;&#x7528;&#x8FD9;&#x79CD;log&#x4F1A;&#x5BF9;&#x6027;&#x80FD;&#x9020;&#x6210;&#x5F71;&#x54CD;&#xFF0C;&#x6CA1;&#x6709;&#x5FC5;&#x8981;&#x7528;&#x7684;&#x8BDD;&#x5173;&#x6389;&#x5B83;&#x3002;</li></ul><h2 id="&#x5237;&#x65B0;"><a href="#&#x5237;&#x65B0;" class="headerlink" title="&#x5237;&#x65B0;"></a>&#x5237;&#x65B0;</h2><ul><li><code>invalidate()</code>:&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x80FD;&#x4F7F;&#x56FE;&#x8868;&#x91CD;&#x7ED8;.&#x8981;&#x4F7F;&#x56FE;&#x8868;&#x66F4;&#x6539;&#x751F;&#x6548;&#xFF0C;&#x8FD9;&#x4E2A;&#x65B9;&#x6CD5;&#x662F;&#x5FC5;&#x8981;&#x7684;&#x3002;</li><li><code>notifyDataSetChanged()</code>:&#x8BA9;&#x56FE;&#x8868;&#x77E5;&#x9053;&#x5B83;&#x7684;&#x57FA;&#x7840;&#x6570;&#x636E;&#x53D1;&#x751F;&#x66F4;&#x6539;&#xFF0C;&#x5E76;&#x6267;&#x884C;&#x6240;&#x6709;&#x5FC5;&#x8981;&#x7684;&#x91CD;&#x65B0;&#x8BA1;&#x7B97;(offsets, legend, maxima, minima, &#x2026;)&#x3002; &#x52A8;&#x6001;&#x6DFB;&#x52A0;&#x6570;&#x636E;&#x65F6;&#xFF0C;&#x8FD9;&#x662F;&#x5FC5;&#x987B;&#x8C03;&#x7528;&#x7684;&#x3002;</li></ul><h1 id="&#x56FE;&#x8868;&#x7684;&#x4EA4;&#x4E92;"><a href="#&#x56FE;&#x8868;&#x7684;&#x4EA4;&#x4E92;" class="headerlink" title="&#x56FE;&#x8868;&#x7684;&#x4EA4;&#x4E92;"></a>&#x56FE;&#x8868;&#x7684;&#x4EA4;&#x4E92;</h1><h2 id="&#x542F;&#x7528;-&#x7981;&#x7528;&#x4EA4;&#x4E92;"><a href="#&#x542F;&#x7528;-&#x7981;&#x7528;&#x4EA4;&#x4E92;" class="headerlink" title="&#x542F;&#x7528;/&#x7981;&#x7528;&#x4EA4;&#x4E92;"></a>&#x542F;&#x7528;/&#x7981;&#x7528;&#x4EA4;&#x4E92;</h2><ul><li><code>setTouchEnabled(boolean enabled)</code>:&#x542F;&#x7528;&#x56FE;&#x8868;&#x89E6;&#x6478;&#x4E8B;&#x4EF6;</li><li><code>setDragEnabled(boolean enabled)</code>:&#x542F;&#x7528;&#x56FE;&#x8868;&#x62D6;&#x62FD;&#x4E8B;&#x4EF6;</li><li><code>setScaleEnabled(boolean enabled)</code>:&#x542F;&#x7528;&#x56FE;&#x8868;&#x7F29;&#x653E;&#x4E8B;&#x4EF6;</li><li><code>setScaleXEnabled(boolean enabled)</code>:&#x542F;&#x7528;X&#x8F74;&#x4E0A;&#x7684;&#x7F29;&#x653E;</li><li><code>setScaleYEnabled(boolean enabled)</code>:&#x542F;&#x7528;Y&#x8F74;&#x4E0A;&#x7684;&#x7F29;&#x653E;</li><li><code>setPinchZoom(boolean enabled)</code>:XY&#x540C;&#x65F6;&#x7F29;&#x653E;</li><li><code>setDoubleTapToZoomEnabled(boolean enabled)</code>:&#x542F;&#x7528;&#x53CC;&#x51FB;&#x7F29;&#x653E;</li><li><code>setHighlightPerDragEnabled(boolean enabled)</code>:&#x62D6;&#x62FD;&#x8D85;&#x8FC7;&#x56FE;&#x6807;&#x7ED8;&#x5236;&#x753B;&#x5E03;&#x65F6;&#x9AD8;&#x4EAE;&#x663E;&#x793A;</li><li><code>setHighlightPerTapEnabled(boolean enabled)</code>:&#x53CC;&#x51FB;&#x9AD8;&#x4EAE;&#x663E;&#x793A;</li></ul><h2 id="&#x56FE;&#x8868;&#x7684;&#x51CF;&#x901F;&#x5668;"><a href="#&#x56FE;&#x8868;&#x7684;&#x51CF;&#x901F;&#x5668;" class="headerlink" title="&#x56FE;&#x8868;&#x7684;&#x51CF;&#x901F;&#x5668;"></a>&#x56FE;&#x8868;&#x7684;&#x51CF;&#x901F;&#x5668;</h2><ul><li><code>setDragDecelerationEnabled(boolean enabled)</code>:&#x62AC;&#x8D77;&#x4E4B;&#x540E;&#x7EE7;&#x7EED;&#x6EDA;&#x52A8;</li><li><code>setDragDecelerationFrictionCoef(float coef)</code>: &#x51CF;&#x901F;&#x63D2;&#x503C;&#xFF0C;&#x53D6;&#x503C;&#x8303;&#x56F4;[0&#xFF0C;1)&#x3002;0&#x8868;&#x793A;&#x7ACB;&#x505C;&#x6B62;&#x3002;&#x503C;&#x8D8A;&#x5927;&#x901F;&#x5EA6;&#x4E0B;&#x964D;&#x8D8A;&#x7F13;&#x6162;</li></ul><h2 id="&#x9AD8;&#x4EAE;&#x65B9;&#x5F0F;"><a href="#&#x9AD8;&#x4EAE;&#x65B9;&#x5F0F;" class="headerlink" title="&#x9AD8;&#x4EAE;&#x65B9;&#x5F0F;"></a>&#x9AD8;&#x4EAE;&#x65B9;&#x5F0F;</h2><ul><li><code>highlightValues(Highlight[] highs)</code>:&#x9AD8;&#x4EAE;&#x70B9;&#x7684;&#x96C6;&#x5408;&#xFF0C;&#x5982;&#x679C;&#x4E3A;&#x7A7A;&#xFF0C;&#x5168;&#x90E8;&#x4E0D;&#x9AD8;&#x4EAE;</li><li><code>highlightValue(int xIndex, int dataSetIndex)</code>:x&#x8F74;&#x4E0A;&#x7684;&#x6570;&#x636E;&#x96C6;&#x5408;&#x9AD8;&#x4EAE;&#x3002;&#x5982;&#x679C;&#x4E3A;-1&#xFF0C;&#x5168;&#x90E8;&#x4E0D;&#x9AD8;&#x4E24;</li><li><code>getHighlighted()</code>:&#x83B7;&#x53D6;&#x9AD8;&#x4EAE;&#x70B9;&#x7684;&#x96C6;&#x5408;&#xFF0C;&#x9AD8;&#x4EAE;&#x663E;&#x793A;&#x4F7F;&#x7528;OnChartValueSelectedListener&#x4E0D;&#x4F1A;&#x751F;&#x6210;&#x4E00;&#x4E2A;&#x56DE;&#x8C03;&#x3002;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;ChartData&#x6216;DataSet&#x5BF9;&#x8C61;&#x542F;&#x7528;&#x548C;&#x7981;&#x7528;&#x9AD8;&#x4EAE;&#x663E;&#x793A;&#x3002;</li></ul><h2 id="&#x81EA;&#x5B9A;&#x4E49;&#x9AD8;&#x4EAE;&#x7B26;&#x53F7;"><a href="#&#x81EA;&#x5B9A;&#x4E49;&#x9AD8;&#x4EAE;&#x7B26;&#x53F7;" class="headerlink" title="&#x81EA;&#x5B9A;&#x4E49;&#x9AD8;&#x4EAE;&#x7B26;&#x53F7;"></a>&#x81EA;&#x5B9A;&#x4E49;&#x9AD8;&#x4EAE;&#x7B26;&#x53F7;</h2><p>&#x6240;&#x6709;&#x7684;&#x7528;&#x6237;&#x8F93;&#x5165;&#x5728;&#x5185;&#x90E8;&#x88AB;&#x9ED8;&#x8BA4;ChartHighlighter&#x7C7B;&#x5904;&#x7406;&#x3002;&#x5B83;&#x53EF;&#x4EE5;&#x7528;&#x4E0B;&#x9762;&#x7684;&#x65B9;&#x6CD5;&#x81EA;&#x5B9A;&#x4E49;&#x5B9E;&#x73B0;&#x66FF;&#x6362;&#x9ED8;&#x8BA4;highligher&#xFF1A;</p><ul><li><code>setHighlighter(ChartHighlighter highlighter)</code>:&#x901A;&#x8FC7;&#x7EE7;&#x627F;ChartHighlighter&#x7C7B;&#x5B9E;&#x73B0;&#x81EA;&#x5B9A;&#x4E49;&#x9AD8;&#x4EAE;&#x7B26;&#x53F7;&#x3002;&#x901A;&#x8FC7;setHighlighter&#x8BBE;&#x7F6E;&#x70B9;&#x51FB;&#x7B49;&#x64CD;&#x4F5C;&#x9AD8;&#x4EAE;&#x663E;&#x793A;&#x7684;&#x7B26;&#x53F7;</li></ul><h2 id="&#x9009;&#x62E9;&#x56DE;&#x8C03;"><a href="#&#x9009;&#x62E9;&#x56DE;&#x8C03;" class="headerlink" title="&#x9009;&#x62E9;&#x56DE;&#x8C03;"></a>&#x9009;&#x62E9;&#x56DE;&#x8C03;</h2><ul><li><code>OnChartValueSelectedListener</code>:&#x89E6;&#x6478;&#x9AD8;&#x4EAE;&#x503C;&#x65F6;&#x56DE;&#x8C03;</li></ul><h2 id="&#x624B;&#x52BF;&#x56DE;&#x8C03;"><a href="#&#x624B;&#x52BF;&#x56DE;&#x8C03;" class="headerlink" title="&#x624B;&#x52BF;&#x56DE;&#x8C03;"></a>&#x624B;&#x52BF;&#x56DE;&#x8C03;</h2><ul><li><code>OnChartGestureListener</code>:&#x8FD9;&#x4E2A;&#x56DE;&#x8C03;&#x53EF;&#x4EE5;&#x5B9A;&#x5236;&#x624B;&#x52BF;&#x64CD;&#x4F5C;&#x76F8;&#x5173;&#x56DE;&#x8C03;&#x3002;&#x6CE8;&#x610F;&#x8BE5;&#x624B;&#x52BF;&#x7684;&#x7F29;&#x653E;&#x662F;&#x5BF9;&#x56FE;&#x8868;&#x7684;Matrix&#x7F29;&#x653E;&#xFF0C;&#x5E76;&#x4E0D;&#x6539;&#x53D8;X&#x8F74;&#x7684;&#x503C;&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x5B9E;&#x73B0;X&#x8F74;&#x6570;&#x503C;&#x53D8;&#x5316;&#x7F29;&#x653E;&#xFF0C;&#x5982;&#x5929;&#x6708;&#x5E74;&#x7684;&#x5207;&#x6362;&#xFF0C;&#x9700;&#x8981;&#x501F;&#x52A9;&#x624B;&#x52BF;&#x7C7B;&#x5B9E;&#x73B0;&#x3002;</li></ul><h1 id="&#x4E3B;&#x8981;&#x56FE;&#x8868;&#x7C7B;"><a href="#&#x4E3B;&#x8981;&#x56FE;&#x8868;&#x7C7B;" class="headerlink" title="&#x4E3B;&#x8981;&#x56FE;&#x8868;&#x7C7B;"></a>&#x4E3B;&#x8981;&#x56FE;&#x8868;&#x7C7B;</h1><h2 id="&#x8F74;AxisBase"><a href="#&#x8F74;AxisBase" class="headerlink" title="&#x8F74;AxisBase"></a>&#x8F74;AxisBase</h2><p>AxisBase &#x8FD9;&#x4E2A;&#x7C7B;&#xFF0C;&#x4ED6;&#x662F;XAxis &#x548C;YAxis&#x7684;&#x57FA;&#x7C7B;</p><h2 id="X&#x8F74;XAxis"><a href="#X&#x8F74;XAxis" class="headerlink" title="X&#x8F74;XAxis"></a>X&#x8F74;XAxis</h2><p>XAxis &#x662F;AxisBase&#x7684;&#x5B50;&#x7C7B;&#x3002;<br>XAxis &#x7C7B;&#x662F;&#x6240;&#x6709;&#x7684;&#x6570;&#x636E;&#x548C;&#x4FE1;&#x606F;&#x7684;&#x5BB9;&#x5668;&#x4E0E;&#x6C34;&#x5E73;&#x8F74;&#x6709;&#x5173;&#x3002;&#x3002;XAxis&#x663E;&#x793A;&#x4EC0;&#x4E48;&#x662F;&#x4EA4;&#x7ED9;ChartData&#x5BF9;&#x8C61;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;ArrayList<string> &#x6216;&#x8005;String[]&#x3002;<br>XAxis&#x7C7B;&#x5141;&#x8BB8;&#x81EA;&#x5B9A;&#x4E49;&#x6837;&#x5F0F;&#x548C;&#x4EE5;&#x4E0B;&#x90E8;&#x5206;:<br>&#x6C34;&#x5E73;&#x5BF9;&#x9F50;&#x6807;&#x7B7E;&#x7ED8;&#x5236;,&#x5176;&#x4E2D;&#x5305;&#x542B;&#x8F74;&#x63CF;&#x8FF0;&#x503C;,&#x4E3A;&#x56FE;&#x8868;X&#x8F74;&#x63D0;&#x4F9B;&#x7684;&#x6570;&#x636E;&#x5BF9;&#x8C61;&#x8BBE;&#x7F6E;&#x3002;<br>&#x5728;&#x6807;&#x7B7E;&#x65C1;&#x8FB9;&#x4E0E;&#x6807;&#x7B7E;&#x5E73;&#x884C;&#x7ED8;&#x5236;&#x4E86;&#x4E00;&#x4E2A;&#x201C;axis-line&#x201D;&#x3002;<br>&#x6BCF;&#x4E2A;&#x5728;&#x5782;&#x76F4;&#x65B9;&#x5411;&#x5750;&#x6807;&#x8F74;&#x6807;&#x7B7E;&#x7684;&#x7F51;&#x683C;&#x7EBF;&#x3002;</string></p><h2 id="Y&#x8F74;YAxis"><a href="#Y&#x8F74;YAxis" class="headerlink" title="Y&#x8F74;YAxis"></a>Y&#x8F74;YAxis</h2><p>YAxis &#x662F;AxisBase&#x7684;&#x5B50;&#x7C7B;&#x3002;<br>YAxis &#x7C7B;&#x662F;&#x4E0E;&#x5782;&#x76F4;&#x8F74;&#x76F8;&#x5173;&#x7684;&#x6240;&#x6709;&#x6570;&#x636E;&#x548C;&#x4FE1;&#x606F;&#x5BB9;&#x5668;&#xFF0C;&#x4E0E;&#x5DE6;&#x8FB9;&#x53F3;&#x8FB9;&#x5782;&#x76F4;&#x7684;&#x8F74;&#x76F8;&#x5173;&#x3002;RadarChart &#x53EA;&#x6709;&#x4E00;&#x4E2A;Y&#x8F74;&#xFF0C;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x56FE;&#x6807;&#x7684;&#x4E24;&#x4E2A;&#x8F74;&#x90FD;&#x542F;&#x7528;&#x7ED8;&#x5236;&#x3002;</p><h2 id="zeroline"><a href="#zeroline" class="headerlink" title="zeroline"></a>zeroline</h2><p>&#x9664;&#x4E86;&#x7F51;&#x683C;&#x7EBF;&#xFF0C;&#x5728;&#x6C34;&#x5E73;&#x65B9;&#x5411;Y&#x8F74;&#x7684;&#x6BCF;&#x4E2A;&#x503C;&#xFF0C;&#x6709;&#x6240;&#x8C13;&#x7684;zeroline&#xFF0C;&#x8FD9;&#x662F;&#x5728;0&#x4F4D;&#x7F6E;&#x8F74;&#x7EBF;&#x4E0A;&#x503C;&#x7ED8;&#x5236;&#x7684;&#xFF0C;&#x662F;&#x7C7B;&#x4F3C;&#x4E8E;&#x7F51;&#x683C;&#x7EBF;&#xFF0C;&#x4F46;&#x53EF;&#x4EE5;&#x5355;&#x72EC;&#x914D;&#x7F6E;&#x3002;</p><h2 id="LimitLine-&#x7C7B;"><a href="#LimitLine-&#x7C7B;" class="headerlink" title="LimitLine &#x7C7B;"></a>LimitLine &#x7C7B;</h2><p>&#x4E24;&#x8F74;&#x652F;&#x6301;&#xFF0C;&#x6240;&#x8C13;LimitLines&#x5141;&#x8BB8;&#x663E;&#x793A;&#x7279;&#x6B8A;&#x4FE1;&#x606F;,&#x5982;&#x8FB9;&#x754C;&#x6216;&#x9650;&#x5236;&#x3002;LimitLine&#x5728;&#x6C34;&#x5E73;&#x65B9;&#x5411;&#x65F6;&#x6DFB;&#x52A0;&#x5230;YAxis,&#x800C;&#x5728;&#x5782;&#x76F4;&#x65B9;&#x5411;&#x65F6;&#x6DFB;&#x52A0;&#x5230;XAxis&#x3002;&#x8FD9;&#x662F;&#x5982;&#x4F55;&#x4ECE;&#x8F74;&#x6DFB;&#x52A0;&#x548C;&#x5220;&#x9664;LimitLines</p><ul><li><code>addLimitLine(LimitLine l)</code>:&#x5728;&#x8F74;&#x4E0A;&#x6DFB;&#x52A0;&#x65B0;&#x7684; LimitLine</li><li><code>removeLimitLine(LimitLine l)</code>:&#x4ECE;&#x8F74;&#x4E0A;&#x79FB;&#x9664; LimitLine</li><li><code>setDrawLimitLinesBehindData(boolean enabled)</code>:&#x5141;&#x8BB8;&#x63A7;&#x5236;LimitLines&#x4E4B;&#x95F4;&#x7684;z&#x8F74;&#x4E0A;&#x7684;&#x5B9E;&#x9645;&#x7684;&#x6570;&#x636E;&#x987A;&#x5E8F;&#x3002;&#x5982;&#x679C;&#x8BBE;&#x7F6E;&#x4E3A;true,LimitLines&#x5728;&#x771F;&#x5B9E;&#x6570;&#x636E;&#x540E;&#x8FB9;&#x7ED8;&#x5236;&#xFF0C;,&#x5426;&#x5219;&#x5728;&#x4E0A;&#x9762;&#x3002;&#x9ED8;&#x8BA4;false</li></ul><h1 id="&#x5E38;&#x89C1;&#x95EE;&#x9898;"><a href="#&#x5E38;&#x89C1;&#x95EE;&#x9898;" class="headerlink" title="&#x5E38;&#x89C1;&#x95EE;&#x9898;"></a>&#x5E38;&#x89C1;&#x95EE;&#x9898;</h1><h2 id="&#x663E;&#x793A;&#x9690;&#x85CF;Y&#x8F74;&#x7EBF;&#x53CA;&#x81EA;&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x7684;&#x663E;&#x793A;&#x6837;&#x5F0F;"><a href="#&#x663E;&#x793A;&#x9690;&#x85CF;Y&#x8F74;&#x7EBF;&#x53CA;&#x81EA;&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x7684;&#x663E;&#x793A;&#x6837;&#x5F0F;" class="headerlink" title="&#x663E;&#x793A;&#x9690;&#x85CF;Y&#x8F74;&#x7EBF;&#x53CA;&#x81EA;&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x7684;&#x663E;&#x793A;&#x6837;&#x5F0F;"></a>&#x663E;&#x793A;&#x9690;&#x85CF;Y&#x8F74;&#x7EBF;&#x53CA;&#x81EA;&#x5B9A;&#x4E49;&#x8F74;&#x7EBF;&#x7684;&#x663E;&#x793A;&#x6837;&#x5F0F;</h2><ul><li><code>mChart.getAxisLeft().setEnabled(false)</code>:&#x9690;&#x85CF;Y&#x8F74;&#x5DE6;&#x8FB9;&#x8F74;&#x7EBF;&#xFF0C;&#x6B64;&#x65F6;&#x6807;&#x7B7E;&#x6570;&#x5B57;&#x4E5F;&#x9690;&#x85CF;</li><li><code>mChart.getAxisRight().setEnabled(false)</code>:&#x9690;&#x85CF;Y&#x8F74;&#x53F3;&#x8FB9;&#x8F74;&#x7EBF;&#xFF0C;&#x6B64;&#x65F6;&#x6807;&#x7B7E;&#x6570;&#x5B57;&#x4E5F;&#x9690;&#x85CF;  </li><li><code>mChart.getAxisRight().setDrawAxisLine(false)</code>:&#x5982;&#x679C;&#x60F3;&#x9690;&#x85CF;&#x8F74;&#x7EBF;&#x4F46;&#x662F;&#x60F3;&#x663E;&#x793A;&#x6570;&#x5B57;&#x6807;&#x7B7E;</li></ul><h2 id="Y&#x8F74;&#x7EBF;&#x6570;&#x636E;&#x6807;&#x7B7E;&#x600E;&#x4E48;&#x81EA;&#x5DF1;&#x63A7;&#x5236;&#x663E;&#x793A;&#x4E2A;&#x6570;"><a href="#Y&#x8F74;&#x7EBF;&#x6570;&#x636E;&#x6807;&#x7B7E;&#x600E;&#x4E48;&#x81EA;&#x5DF1;&#x63A7;&#x5236;&#x663E;&#x793A;&#x4E2A;&#x6570;" class="headerlink" title="Y&#x8F74;&#x7EBF;&#x6570;&#x636E;&#x6807;&#x7B7E;&#x600E;&#x4E48;&#x81EA;&#x5DF1;&#x63A7;&#x5236;&#x663E;&#x793A;&#x4E2A;&#x6570;"></a>Y&#x8F74;&#x7EBF;&#x6570;&#x636E;&#x6807;&#x7B7E;&#x600E;&#x4E48;&#x81EA;&#x5DF1;&#x63A7;&#x5236;&#x663E;&#x793A;&#x4E2A;&#x6570;</h2><ul><li><code>mChart.getAxisLeft().setLabelCount(8, false)</code>:&#x6B64;&#x65F6;&#x8BBE;&#x7F6E;&#x4E86;&#x5206;8&#x4E2A;&#xFF0C;&#x53EF;&#x6839;&#x636E;&#x81EA;&#x5DF1;&#x559C;&#x597D;&#x8BBE;&#x7F6E;</li></ul><h2 id="&#x8BBE;&#x7F6E;&#x8F74;&#x7EBF;&#x989C;&#x8272;&#xFF0C;&#x5BBD;&#x5EA6;&#x7B49;&#x4FE1;&#x606F;"><a href="#&#x8BBE;&#x7F6E;&#x8F74;&#x7EBF;&#x989C;&#x8272;&#xFF0C;&#x5BBD;&#x5EA6;&#x7B49;&#x4FE1;&#x606F;" class="headerlink" title="&#x8BBE;&#x7F6E;&#x8F74;&#x7EBF;&#x989C;&#x8272;&#xFF0C;&#x5BBD;&#x5EA6;&#x7B49;&#x4FE1;&#x606F;"></a>&#x8BBE;&#x7F6E;&#x8F74;&#x7EBF;&#x989C;&#x8272;&#xFF0C;&#x5BBD;&#x5EA6;&#x7B49;&#x4FE1;&#x606F;</h2><figure class="highlight jboss-cli"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">YAxis leftAxis = mChart.getAxisLeft<span class="params">()</span>;</span><br><span class="line"><span class="string">//</span> &#x663E;&#x793A;&#x8F74;&#x7EBF;&#x5185;&#x90E8;INSIDE_CHART  </span><br><span class="line">leftAxis.<span class="keyword">set</span>Position<span class="params">(YAxisLabelPosition.OUTSIDE_CHART)</span>;</span><br><span class="line"><span class="string">//</span> &#x8BBE;&#x7F6E;&#x8F74;&#x7EBF;&#x989C;&#x8272;</span><br><span class="line">leftAxis.<span class="keyword">set</span>AxisLineColor<span class="params">(Color.parseColor(&#x201C;#ff0000&#x201D;)</span>);</span><br><span class="line"><span class="string">//</span> &#x8BBE;&#x7F6E;&#x8F74;&#x7EBF;&#x5BBD;&#x5EA6;</span><br><span class="line">leftAxis.<span class="keyword">set</span>AxisLineWidth<span class="params">(1)</span>; </span><br><span class="line"><span class="string">//</span> &#x8BBE;&#x7F6E;y&#x8F74;&#x6807;&#x7B7E;&#x5B57;&#x4F53;&#x5927;&#x5C0F; </span><br><span class="line">leftAxis.<span class="keyword">set</span>TextSize<span class="params">(20)</span>;</span><br><span class="line"><span class="string">//</span> &#x8BBE;&#x7F6E;&#x81EA;&#x5B9A;&#x4E49;&#x5B57;&#x4F53;</span><br><span class="line">leftAxis.<span class="keyword">set</span>Typeface<span class="params">()</span>; </span><br><span class="line"><span class="string">//</span> &#x8BBE;&#x7F6E;&#x662F;&#x5426;&#x663E;&#x793A;&#x7F51;&#x683C;&#x7EBF;</span><br><span class="line">leftAxis.<span class="keyword">set</span>DrawGridLines<span class="params">(Boolean)</span>;</span><br></pre></td></tr></tbody></table></figure><h2 id="&#x81EA;&#x5B9A;&#x4E49;Y&#x8F74;&#x65B9;&#x5411;&#x4E0A;&#x7684;&#x503C;"><a href="#&#x81EA;&#x5B9A;&#x4E49;Y&#x8F74;&#x65B9;&#x5411;&#x4E0A;&#x7684;&#x503C;" class="headerlink" title="&#x81EA;&#x5B9A;&#x4E49;Y&#x8F74;&#x65B9;&#x5411;&#x4E0A;&#x7684;&#x503C;"></a>&#x81EA;&#x5B9A;&#x4E49;Y&#x8F74;&#x65B9;&#x5411;&#x4E0A;&#x7684;&#x503C;</h2><p>&#x91CD;&#x5199;ValueFormatter&#xFF0C;&#x4F7F;&#x7528;DataSet.setValueFormatter&#x8FDB;&#x884C;&#x8BBE;&#x7F6E;<br></p><figure class="highlight aspectj"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">CustomerValueFormatter</span> <span class="keyword">implements</span> <span class="title">ValueFormatter</span> </span>{</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> DecimalFormat mFormat;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">CustomerValueFormatter</span><span class="params">()</span> </span>{</span><br><span class="line">        <span class="comment">// &#x6B64;&#x5904;&#x662F;&#x663E;&#x793A;&#x6570;&#x636E;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x663E;&#x793A;&#x6574;&#x578B;&#x6216;&#x8005;&#x5C0F;&#x6570;&#x540E;&#x9762;&#x5C0F;&#x6570;&#x4F4D;&#x6570;&#x81EA;&#x5DF1;&#x968F;&#x610F;&#x786E;&#x5B9A;</span></span><br><span class="line">        mFormat = <span class="keyword">new</span> DecimalFormat(<span class="string">&quot;###,###,###,##0&quot;</span>);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function">String <span class="title">getFormattedValue</span><span class="params">(<span class="keyword">float</span> value, Entry entry, <span class="keyword">int</span> dataSetIndex, ViewPortHandler viewPortHandler)</span> </span>{</span><br><span class="line"><span class="comment">// &#x6570;&#x636E;&#x524D;&#x6216;&#x8005;&#x540E;&#x53EF;&#x6839;&#x636E;&#x81EA;&#x5DF1;&#x60F3;&#x8981;&#x663E;&#x793A;&#x7684;&#x65B9;&#x5F0F;&#x6DFB;&#x52A0;</span></span><br><span class="line">        <span class="function"><span class="keyword">return</span> mFormat.<span class="title">format</span><span class="params">(value)</span></span>;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p></p><h2 id="&#x81EA;&#x5B9A;&#x4E49;Y&#x8F74;&#x5750;&#x6807;&#x663E;&#x793A;&#x7684;&#x503C;"><a href="#&#x81EA;&#x5B9A;&#x4E49;Y&#x8F74;&#x5750;&#x6807;&#x663E;&#x793A;&#x7684;&#x503C;" class="headerlink" title="&#x81EA;&#x5B9A;&#x4E49;Y&#x8F74;&#x5750;&#x6807;&#x663E;&#x793A;&#x7684;&#x503C;"></a>&#x81EA;&#x5B9A;&#x4E49;Y&#x8F74;&#x5750;&#x6807;&#x663E;&#x793A;&#x7684;&#x503C;</h2><p>&#x91CD;&#x5199;YAxisValueFormatter&#xFF0C;&#x4F7F;&#x7528;YAxis.setValueFormatter&#x8BBE;&#x7F6E;<br></p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">CustomerValueFormatter</span> <span class="keyword">implements</span> <span class="title">YAxisValueFormatter</span> </span>{</span><br><span class="line"></span><br><span class="line">    <span class="keyword">private</span> DecimalFormat mFormat;</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">CustomerValueFormatter</span><span class="params">()</span> </span>{</span><br><span class="line">        mFormat = <span class="keyword">new</span> DecimalFormat(<span class="string">&quot;###,###,###,##0&quot;</span>);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> String <span class="title">getFormattedValue</span><span class="params">(<span class="keyword">float</span> value, YAxis yAxis)</span> </span>{</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;&#xFFE5;&quot;</span>+mFormat.format(value);</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p></p><h2 id="&#x81EA;&#x5B9A;&#x4E49;X&#x8F74;&#x5750;&#x6807;&#x663E;&#x793A;&#x7684;&#x503C;"><a href="#&#x81EA;&#x5B9A;&#x4E49;X&#x8F74;&#x5750;&#x6807;&#x663E;&#x793A;&#x7684;&#x503C;" class="headerlink" title="&#x81EA;&#x5B9A;&#x4E49;X&#x8F74;&#x5750;&#x6807;&#x663E;&#x793A;&#x7684;&#x503C;"></a>&#x81EA;&#x5B9A;&#x4E49;X&#x8F74;&#x5750;&#x6807;&#x663E;&#x793A;&#x7684;&#x503C;</h2><p>&#x91CD;&#x5199;XAxisValueFormatter&#xFF0C;&#x4F7F;&#x7528;XAxis.setValueFormatter&#x8BBE;&#x7F6E;</p><h2 id="&#x5C06;x&#x8F74;&#x6807;&#x7B7E;&#x503E;&#x659C;&#x663E;&#x793A;"><a href="#&#x5C06;x&#x8F74;&#x6807;&#x7B7E;&#x503E;&#x659C;&#x663E;&#x793A;" class="headerlink" title="&#x5C06;x&#x8F74;&#x6807;&#x7B7E;&#x503E;&#x659C;&#x663E;&#x793A;"></a>&#x5C06;x&#x8F74;&#x6807;&#x7B7E;&#x503E;&#x659C;&#x663E;&#x793A;</h2><figure class="highlight jboss-cli"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">XAxis xl = mChart.getXAxis<span class="params">()</span>;</span><br><span class="line"><span class="string">//</span> &#x8BBE;&#x7F6E;x&#x8F74;&#x5B57;&#x4F53;&#x663E;&#x793A;&#x89D2;&#x5EA6;</span><br><span class="line">xl.<span class="keyword">set</span>LabelRotationAngle<span class="params">(-20)</span>;</span><br><span class="line"><span class="string">//</span> &#x8BBE;&#x7F6E;X&#x8F74;&#x7684;&#x4F4D;&#x7F6E;TOP, BOTTOM, BOTH_SIDED, TOP_INSIDE, BOTTOM_INSIDE</span><br><span class="line">xl.<span class="keyword">set</span>Position<span class="params">(XAxisPosition.BOTTOM)</span>;</span><br><span class="line"><span class="string">//</span> &#x8BBE;&#x7F6E;Lable&#x4E4B;&#x95F4;&#x7684;&#x8DDD;&#x79BB;&#xFF08;&#x5B57;&#x7B26;&#xFF09;&#xFF0C;&#x5C0F;&#x4E8E;&#x8DDD;&#x79BB;&#x5C06;&#x4E0D;&#x663E;&#x793A;&#xFF0C;&#x9700;&#x8981;&#x653E;&#x5927;&#x56FE;&#x6807;&#x624D;&#x80FD;&#x770B;&#x5230;</span><br><span class="line">xl.<span class="keyword">set</span>SpaceBetweenLabels<span class="params">(int spaceCharacters)</span></span><br></pre></td></tr></tbody></table></figure><h2 id="&#x8BBE;&#x7F6E;&#x4E00;&#x9875;&#x6570;&#x636E;&#x70B9;&#x6570;"><a href="#&#x8BBE;&#x7F6E;&#x4E00;&#x9875;&#x6570;&#x636E;&#x70B9;&#x6570;" class="headerlink" title="&#x8BBE;&#x7F6E;&#x4E00;&#x9875;&#x6570;&#x636E;&#x70B9;&#x6570;"></a>&#x8BBE;&#x7F6E;&#x4E00;&#x9875;&#x6570;&#x636E;&#x70B9;&#x6570;</h2><p><code>setVisibleXRange(float minXRange, float maxXRange)</code></p><h1 id="&#x8865;&#x5145;"><a href="#&#x8865;&#x5145;" class="headerlink" title="&#x8865;&#x5145;"></a>&#x8865;&#x5145;</h1><p>&#x66F4;&#x591A;&#x8BE6;&#x7EC6;&#x4ECB;&#x7ECD;&#x53EF;&#x53C2;&#x8003;</p><blockquote><ul><li><a href="https://github.com/Android-View/JNChartDemo" target="_blank" rel="noopener">JNChartDemo</a></li><li><a href="https://github.com/Android-View/ChartLib-Demo-Android" target="_blank" rel="noopener">ChartLib-Demo-Android</a></li><li><a href="https://jitpack.io/com/github/PhilJay/MPAndroidChart/v3.0.0-beta1/javadoc/" target="_blank" rel="noopener">API</a></li></ul></blockquote><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/MPAndroidChart.png&quot; alt=&quot;Android&quot; title=&quot;MPAndroidChart&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/PhilJay/MPAndroidChart&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;MPAndroidChart&lt;/a&gt;图表库的使用&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Android图表" scheme="https://tiimor.cn/tags/Android%E5%9B%BE%E8%A1%A8/"/>
    
      <category term="MPAndroidChart" scheme="https://tiimor.cn/tags/MPAndroidChart/"/>
    
  </entry>
  
  <entry>
    <title>Android数据库加密</title>
    <link href="https://tiimor.cn/Android%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8A%A0%E5%AF%86/"/>
    <id>https://tiimor.cn/Android数据库加密/</id>
    <published>2017-11-05T07:11:51.000Z</published>
    <updated>2019-03-17T06:47:42.365Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8DTalk%20is%20cheap%EF%BC%8Cshow%20me%20the%20code.jpg" alt="Android" title="Talk is cheap&#xFF0C;show me the code"></p><p><strong>Android&#x6570;&#x636E;&#x5E93;&#x52A0;&#x5BC6;&#xFF0C;&#x52A0;&#x5BC6;&#x5E94;&#x7528;&#x91CC;&#x91CD;&#x8981;&#x7684;&#x4FE1;&#x606F;&#xFF0C;&#x907F;&#x514D;&#x5E72;&#x574F;&#x4E8B;&#xFF0C;&#x574F;&#x4EBA;&#xFF01;</strong></p><a id="more"></a><h1 id="&#x52A0;&#x5BC6;&#x65B9;&#x6848;"><a href="#&#x52A0;&#x5BC6;&#x65B9;&#x6848;" class="headerlink" title="&#x52A0;&#x5BC6;&#x65B9;&#x6848;"></a>&#x52A0;&#x5BC6;&#x65B9;&#x6848;</h1><p>SQLite&#x4E0D;&#x652F;&#x6301;&#x52A0;&#x5BC6;&#xFF0C;&#x5E94;&#x7528;&#x4E2D;&#x91CD;&#x8981;&#x7684;&#x6570;&#x636E;&#x8D26;&#x53F7;&#x5BC6;&#x7801;&#x7B49;&#x5BB9;&#x6613;&#x88AB;&#x6CC4;&#x9732;&#x3002;</p><h2 id="&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x5E93;&#x5185;&#x5BB9;"><a href="#&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x5E93;&#x5185;&#x5BB9;" class="headerlink" title="&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x5E93;&#x5185;&#x5BB9;"></a>&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x5E93;&#x5185;&#x5BB9;</h2><p>&#x5728;&#x5B58;&#x50A8;&#x6570;&#x636E;&#x65F6;&#x52A0;&#x5BC6;&#x5185;&#x5BB9;&#xFF0C;&#x5728;&#x67E5;&#x8BE2;&#x65F6;&#x8FDB;&#x884C;&#x89E3;&#x5BC6;&#x3002;&#x4F46;&#x662F;&#x8FD9;&#x79CD;&#x65B9;&#x5F0F;&#x4E0D;&#x80FD;&#x5F7B;&#x5E95;&#x52A0;&#x5BC6;&#xFF0C;&#x6570;&#x636E;&#x5E93;&#x7684;&#x8868;&#x7ED3;&#x6784;&#x7B49;&#x4FE1;&#x606F;&#x8FD8;&#x662F;&#x80FD;&#x88AB;&#x67E5;&#x770B;&#x5230;&#xFF0C;&#x53E6;&#x5916;&#x68C0;&#x7D22;&#x6570;&#x636E;&#x4E5F;&#x662F;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#x3002;</p><h2 id="&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x5E93;&#x6587;&#x4EF6;"><a href="#&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x5E93;&#x6587;&#x4EF6;" class="headerlink" title="&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x5E93;&#x6587;&#x4EF6;"></a>&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x5E93;&#x6587;&#x4EF6;</h2><p>&#x501F;&#x52A9;<a href="https://github.com/sqlcipher/android-database-sqlcipher" target="_blank" rel="noopener">SQLCipher</a>&#x3002;<a href="https://github.com/sqlcipher/android-database-sqlcipher" target="_blank" rel="noopener">SQLCipher</a>&#x662F;&#x4E00;&#x4E2A;&#x5728;SQLite&#x57FA;&#x7840;&#x4E4B;&#x4E0A;&#x8FDB;&#x884C;&#x6269;&#x5C55;&#x7684;&#x5F00;&#x6E90;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x5B83;&#x4E3B;&#x8981;&#x662F;&#x5728;SQLite&#x7684;&#x57FA;&#x7840;&#x4E4B;&#x4E0A;&#x589E;&#x52A0;&#x4E86;&#x6570;&#x636E;&#x52A0;&#x5BC6;&#x529F;&#x80FD;&#x3002;</p><ul><li>&#x52A0;&#x5BC6;&#x6027;&#x80FD;&#x9AD8;&#x3001;&#x5F00;&#x9500;&#x5C0F;&#xFF0C;&#x53EA;&#x8981;5-15%&#x7684;&#x5F00;&#x9500;&#x7528;&#x4E8E;&#x52A0;&#x5BC6;</li><li>&#x5B8C;&#x5168;&#x505A;&#x5230;&#x6570;&#x636E;&#x5E93;100%&#x52A0;&#x5BC6;</li><li>&#x91C7;&#x7528;&#x826F;&#x597D;&#x7684;&#x52A0;&#x5BC6;&#x65B9;&#x5F0F;&#xFF08;CBC&#x52A0;&#x5BC6;&#x6A21;&#x5F0F;&#xFF09;</li><li>&#x4F7F;&#x7528;&#x65B9;&#x4FBF;&#xFF0C;&#x505A;&#x5230;&#x5E94;&#x7528;&#x7EA7;&#x522B;&#x52A0;&#x5BC6;</li><li>&#x91C7;&#x7528;OpenSSL&#x52A0;&#x5BC6;&#x5E93;&#x63D0;&#x4F9B;&#x7684;&#x7B97;&#x6CD5;</li></ul><h1 id="&#x52A0;&#x5BC6;&#x5185;&#x5BB9;"><a href="#&#x52A0;&#x5BC6;&#x5185;&#x5BB9;" class="headerlink" title="&#x52A0;&#x5BC6;&#x5185;&#x5BB9;"></a>&#x52A0;&#x5BC6;&#x5185;&#x5BB9;</h1><p>&#x4ECB;&#x7ECD;&#x4E00;&#x4E9B;&#x5E38;&#x7528;&#x7684;&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x8FD9;&#x4E9B;&#x65B9;&#x5F0F;&#x52A0;&#x5BC6;&#x5B58;&#x50A8;&#x7684;&#x6570;&#x636E;&#x5E93;&#x5185;&#x5BB9;&#x3002;</p><table><thead><tr><th>&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;</th><th>&#x63CF;&#x8FF0;</th><th>&#x4F18;&#x70B9;</th><th>&#x7F3A;&#x70B9;</th></tr></thead><tbody><tr><td>DES&#xFF0C;3DES</td><td>&#x5BF9;&#x79F0;&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;</td><td>&#x7B97;&#x6CD5;&#x516C;&#x5F00;&#x3001;&#x8BA1;&#x7B97;&#x91CF;&#x5C0F;&#x3001;&#x52A0;&#x5BC6;&#x901F;&#x5EA6;&#x5FEB;&#x3001;&#x52A0;&#x5BC6;&#x6548;&#x7387;&#x9AD8;</td><td>&#x53CC;&#x65B9;&#x90FD;&#x4F7F;&#x7528;&#x540C;&#x6837;&#x5BC6;&#x94A5;&#xFF0C;&#x5B89;&#x5168;&#x6027;&#x5F97;&#x4E0D;&#x5230;&#x4FDD;&#x8BC1;</td></tr><tr><td>AES</td><td>&#x5BF9;&#x79F0;&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;</td><td>&#x7B97;&#x6CD5;&#x516C;&#x5F00;&#x3001;&#x8BA1;&#x7B97;&#x91CF;&#x5C0F;&#x3001;&#x52A0;&#x5BC6;&#x901F;&#x5EA6;&#x5FEB;&#x3001;&#x52A0;&#x5BC6;&#x6548;&#x7387;&#x9AD8;</td><td>&#x53CC;&#x65B9;&#x90FD;&#x4F7F;&#x7528;&#x540C;&#x6837;&#x5BC6;&#x94A5;&#xFF0C;&#x5B89;&#x5168;&#x6027;&#x5F97;&#x4E0D;&#x5230;&#x4FDD;&#x8BC1;</td></tr><tr><td>XOR</td><td>&#x5F02;&#x6216;&#x52A0;&#x5BC6;</td><td>&#x4E24;&#x4E2A;&#x53D8;&#x91CF;&#x7684;&#x4E92;&#x6362;&#xFF08;&#x4E0D;&#x501F;&#x52A9;&#x7B2C;&#x4E09;&#x4E2A;&#x53D8;&#x91CF;&#xFF09;&#xFF0C;&#x7B80;&#x5355;&#x7684;&#x6570;&#x636E;&#x52A0;&#x5BC6;</td><td>&#x52A0;&#x5BC6;&#x65B9;&#x5F0F;&#x7B80;&#x5355;</td></tr><tr><td>Base64</td><td>&#x7B97;&#x4E0D;&#x4E0A;&#x4EC0;&#x4E48;&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;&#xFF0C;&#x53EA;&#x662F;&#x5BF9;&#x6570;&#x636E;&#x8FDB;&#x884C;&#x7F16;&#x7801;&#x4F20;&#x8F93;</td><td></td><td></td></tr><tr><td>SHA</td><td>&#x975E;&#x5BF9;&#x79F0;&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;&#x3002;&#x5B89;&#x5168;&#x6563;&#x5217;&#x7B97;&#x6CD5;&#xFF0C;&#x6570;&#x5B57;&#x7B7E;&#x540D;&#x5DE5;&#x5177;&#x3002;&#x8457;&#x540D;&#x7684;&#x56FE;&#x7247;&#x52A0;&#x8F7D;&#x6846;&#x67B6;Glide&#x5728;&#x7F13;&#x5B58;key&#x65F6;&#x5C31;&#x91C7;&#x7528;&#x7684;&#x6B64;&#x52A0;&#x5BC6;</td><td>&#x7834;&#x89E3;&#x96BE;&#x5EA6;&#x9AD8;&#xFF0C;&#x4E0D;&#x53EF;&#x9006;</td><td>&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x7A77;&#x4E3E;&#x6CD5;&#x8FDB;&#x884C;&#x7834;&#x89E3;</td></tr><tr><td>RSA</td><td>&#x975E;&#x5BF9;&#x79F0;&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;&#xFF0C;&#x6700;&#x6D41;&#x884C;&#x7684;&#x516C;&#x94A5;&#x5BC6;&#x7801;&#x7B97;&#x6CD5;&#xFF0C;&#x4F7F;&#x7528;&#x957F;&#x5EA6;&#x53EF;&#x53D8;&#x7684;&#x79D8;&#x94A5;</td><td>&#x4E0D;&#x53EF;&#x9006;&#xFF0C;&#x65E2;&#x80FD;&#x7528;&#x4E8E;&#x6570;&#x636E;&#x52A0;&#x5BC6;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x5E94;&#x7528;&#x4E8E;&#x6570;&#x5B57;&#x7B7E;&#x540D;</td><td>RSA&#x975E;&#x5BF9;&#x79F0;&#x52A0;&#x5BC6;&#x5185;&#x5BB9;&#x957F;&#x5EA6;&#x6709;&#x9650;&#x5236;&#xFF0C;1024&#x4F4D;key&#x7684;&#x6700;&#x591A;&#x53EA;&#x80FD;&#x52A0;&#x5BC6;127&#x4F4D;&#x6570;&#x636E;</td></tr><tr><td>MD5</td><td>&#x975E;&#x5BF9;&#x79F0;&#x52A0;&#x5BC6;&#x7B97;&#x6CD5;&#x3002;&#x5168;&#x7A0B;&#xFF1A;Message-Digest Algorithm&#xFF0C;&#x7FFB;&#x8BD1;&#x4E3A;&#x6D88;&#x606F;&#x6458;&#x8981;&#x7B97;&#x6CD5;</td><td>&#x4E0D;&#x53EF;&#x9006;&#xFF0C;&#x538B;&#x7F29;&#x6027;&#xFF0C;&#x4E0D;&#x5BB9;&#x6613;&#x4FEE;&#x6539;&#xFF0C;&#x5BB9;&#x6613;&#x8BA1;&#x7B97;</td><td>&#x7A77;&#x4E3E;&#x6CD5;&#x53EF;&#x4EE5;&#x7834;&#x89E3;</td></tr></tbody></table><h1 id="&#x52A0;&#x5BC6;&#x6587;&#x4EF6;"><a href="#&#x52A0;&#x5BC6;&#x6587;&#x4EF6;" class="headerlink" title="&#x52A0;&#x5BC6;&#x6587;&#x4EF6;"></a>&#x52A0;&#x5BC6;&#x6587;&#x4EF6;</h1><h2 id="&#x96C6;&#x6210;"><a href="#&#x96C6;&#x6210;" class="headerlink" title="&#x96C6;&#x6210;"></a>&#x96C6;&#x6210;</h2><p>AndroidStudio&#x7684;Module&#x4E2D;build.gradle&#x6DFB;&#x52A0;<a href="https://github.com/sqlcipher/android-database-sqlcipher" target="_blank" rel="noopener">SQLCipher</a>&#x7684;&#x4F9D;&#x8D56;<br></p><figure class="highlight gradle"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">compile</span> <span class="string">&apos;net.zetetic:android-database-sqlcipher:3.5.7&apos;</span></span><br></pre></td></tr></tbody></table></figure><p></p><h2 id="GreenDao&#x52A0;&#x5BC6;"><a href="#GreenDao&#x52A0;&#x5BC6;" class="headerlink" title="GreenDao&#x52A0;&#x5BC6;"></a>GreenDao&#x52A0;&#x5BC6;</h2><p>GreenDao&#x6709;&#x52A0;&#x5BC6;&#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x4F7F;&#x7528;&#x975E;&#x5E38;&#x65B9;&#x4FBF;&#xFF0C;&#x5728;GreenDao&#x521D;&#x59CB;&#x5316;&#x7684;&#x65F6;&#x5019;&#x542F;&#x52A8;&#x52A0;&#x5BC6;&#x6A21;&#x5F0F;&#x3002;</p><ul><li><p>&#x975E;&#x52A0;&#x5BC6;&#x6A21;&#x5F0F;</p><figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DaoMaster<span class="selector-class">.OpenHelper</span><span class="selector-class">.getWritableDatabase</span>()</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x52A0;&#x5BC6;&#x6A21;&#x5F0F;</p><figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DaoMaster<span class="selector-class">.OpenHelper</span><span class="selector-class">.getEncryptedWritableDb</span>(key)</span><br></pre></td></tr></tbody></table></figure>  <figure class="highlight haxe"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">DaoMaster.OpenHelper encryptedHelper = <span class="keyword">new</span> <span class="type">DaoMaster</span>.DevOpenHelper(<span class="built_in">this</span>, VOD_DB, <span class="literal">null</span>);</span><br><span class="line"><span class="comment">// &#x9009;&#x7528;&#x8BBE;&#x5907;&#x552F;&#x4E00;&#x7801;&#x4F5C;&#x4E3A;&#x52A0;&#x5BC6;&#x7684;key</span></span><br><span class="line">DaoSession encryptedDaoSession = <span class="keyword">new</span> <span class="type">DaoMaster</span>(encryptedHelper.getEncryptedWritableDb(getUniquePseudoID())).<span class="keyword">new</span><span class="type">Session</span>();</span><br></pre></td></tr></tbody></table></figure></li></ul><p><strong>&#x6CE8;&#x610F;</strong></p><ul><li>&#x8BFB;&#x53D6;&#x6570;&#x636E;&#x5E93;&#x65F6;&#xFF0C;key&#x9700;&#x8981;&#x4FDD;&#x5B58;&#x4E00;&#x81F4;&#xFF0C;&#x5426;&#x5219;&#xFF0C;&#x8BFB;&#x51FA;&#x7684;&#x6570;&#x636E;&#x4E3A;&#x7A7A;</li><li>&#x589E;&#x5220;&#x6539;&#x67E5;&#x7684;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;&#x52A0;&#x5BC6;&#x975E;&#x52A0;&#x5BC6;&#x6A21;&#x5F0F;&#x4E0B;&#x90FD;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;</li></ul><h2 id="SQLiteOpenHelper&#x52A0;&#x5BC6;"><a href="#SQLiteOpenHelper&#x52A0;&#x5BC6;" class="headerlink" title="SQLiteOpenHelper&#x52A0;&#x5BC6;"></a>SQLiteOpenHelper&#x52A0;&#x5BC6;</h2><p>&#x4F7F;&#x7528;SQLiteOpenHelper&#x81EA;&#x5DF1;&#x5B9A;&#x4E49;&#x7684;&#x63A5;&#x53E3;</p><ul><li><p>&#x521D;&#x59CB;&#x5316;SQLiteOpenHelper&#x65F6;&#xFF0C;&#x52A0;&#x8F7D;so&#x5E93;</p><figure class="highlight scala"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">public <span class="class"><span class="keyword">class</span> <span class="title">DBCipherHelper</span> <span class="keyword">extends</span> <span class="title">SQLiteOpenHelper</span> </span>{</span><br><span class="line"></span><br><span class="line">public <span class="type">DBCipherHelper</span>(<span class="type">Context</span> context, <span class="type">String</span> name, <span class="type">SQLiteDatabase</span>.<span class="type">CursorFactory</span> factory, int version) {</span><br><span class="line">        <span class="keyword">super</span>(context, name, factory, version);</span><br><span class="line">        <span class="comment">//&#x4E0D;&#x53EF;&#x5FFD;&#x7565;&#x7684; &#x8FDB;&#x884C;so&#x5E93;&#x52A0;&#x8F7D;</span></span><br><span class="line">        <span class="type">SQLiteDatabase</span>.loadLibs(context);</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4F7F;&#x7528;</p><ul><li><p>&#x4F20;&#x7EDF;&#x6A21;&#x5F0F;</p><figure class="highlight gcode"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//&#x83B7;&#x53D6;&#x53EF;&#x5199;&#x6570;&#x636E;&#x5E93;</span></span><br><span class="line">SQLiteDatabase db = dbHelper.getWritableDatabase<span class="comment">()</span>;</span><br><span class="line"><span class="comment">//&#x83B7;&#x53D6;&#x53EF;&#x8BFB;&#x6570;&#x636E;&#x5E93;</span></span><br><span class="line">SQLiteDatabase db = dbHelper.getReadableDatabase<span class="comment">()</span>;</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x52A0;&#x5BC6;&#x6A21;&#x5F0F;</p><figure class="highlight gauss"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//&#x83B7;&#x53D6;&#x5199;&#x6570;&#x636E;&#x5E93;</span></span><br><span class="line">SQLiteDatabase db = dbHelper.getWritableDatabase(<span class="built_in">key</span>);</span><br><span class="line"><span class="comment">//&#x83B7;&#x53D6;&#x53EF;&#x8BFB;&#x6570;&#x636E;&#x5E93;</span></span><br><span class="line">SQLiteDatabase db = dbHelper.getReadableDatabase(<span class="built_in">key</span>);</span><br></pre></td></tr></tbody></table></figure></li></ul></li></ul><h1 id="&#x52A0;&#x5BC6;&#x65B9;&#x6848;&#x603B;&#x7ED3;"><a href="#&#x52A0;&#x5BC6;&#x65B9;&#x6848;&#x603B;&#x7ED3;" class="headerlink" title="&#x52A0;&#x5BC6;&#x65B9;&#x6848;&#x603B;&#x7ED3;"></a>&#x52A0;&#x5BC6;&#x65B9;&#x6848;&#x603B;&#x7ED3;</h1><ul><li><strong>&#x52A0;&#x5BC6;&#x5185;&#x5BB9;</strong>&#x540E;&#xFF0C;&#x5C06;&#x6570;&#x636E;&#x5E93;&#x6253;&#x5F00;&#xFF0C;&#x67E5;&#x8BE2;&#xFF0C;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x52A0;&#x5BC6;&#x540E;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x5373;&#x5BC6;&#x6587;&#x3002;</li><li><strong>&#x52A0;&#x5BC6;&#x6587;&#x4EF6;</strong>&#xFF0C;&#x96C6;&#x6210;<a href="https://github.com/sqlcipher/android-database-sqlcipher" target="_blank" rel="noopener">SQLCipher</a>&#x540E;&#xFF0C;<strong>&#x6570;&#x636E;&#x5E93;&#x6587;&#x4EF6;.db&#x662F;&#x5B8C;&#x5168;&#x52A0;&#x5BC6;&#x7684;</strong>&#xFF0C;&#x56E0;&#x6B64;&#xFF0C;&#x901A;&#x8FC7;&#x547D;&#x4EE4;&#x67E5;&#x8BE2;&#x7B49;&#x64CD;&#x4F5C;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x4F1A;&#x88AB;&#x63D0;&#x793A;&#x6570;&#x636E;&#x5E93;&#x52A0;&#x5BC6;&#xFF0C;&#x64CD;&#x4F5C;&#x5931;&#x8D25;&#xFF01;</li><li>&#x6839;&#x636E;&#x4E0D;&#x540C;&#x9700;&#x6C42;&#xFF0C;&#x4F7F;&#x7528;&#x52A0;&#x5BC6;&#x6587;&#x4EF6;&#x6216;&#x8005;&#x52A0;&#x5BC6;&#x5185;&#x5BB9;&#x7684;&#x65B9;&#x5F0F;&#x8FDB;&#x884C;&#x6570;&#x636E;&#x7684;&#x5B89;&#x5168;&#x4FDD;&#x62A4;&#xFF0C;<a href="https://github.com/sqlcipher/android-database-sqlcipher" target="_blank" rel="noopener">SQLCipher</a>&#x4F1A;&#x589E;&#x52A0;apk&#x7684;&#x5927;&#x5C0F;&#x3002;</li></ul><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8DTalk%20is%20cheap%EF%BC%8Cshow%20me%20the%20code.jpg&quot; alt=&quot;Android&quot; title=&quot;Talk is cheap，show me the code&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Android数据库加密，加密应用里重要的信息，避免干坏事，坏人！&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Android" scheme="https://tiimor.cn/tags/Android/"/>
    
      <category term="加密" scheme="https://tiimor.cn/tags/%E5%8A%A0%E5%AF%86/"/>
    
      <category term="SQLCipher" scheme="https://tiimor.cn/tags/SQLCipher/"/>
    
      <category term="SQLite" scheme="https://tiimor.cn/tags/SQLite/"/>
    
      <category term="GreenDao" scheme="https://tiimor.cn/tags/GreenDao/"/>
    
  </entry>
  
  <entry>
    <title>Android白银篇-GreenDao3</title>
    <link href="https://tiimor.cn/Android%E7%99%BD%E9%93%B6%E7%AF%87-GreenDao3/"/>
    <id>https://tiimor.cn/Android白银篇-GreenDao3/</id>
    <published>2017-11-04T08:34:52.000Z</published>
    <updated>2019-03-17T06:47:42.367Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/GreenDao.png" alt="GreenDao"></p><p>GreenDao &#x662F;&#x4E00;&#x4E2A;&#x5C06;&#x5BF9;&#x8C61;&#x6620;&#x5C04;&#x5230; SQLite &#x6570;&#x636E;&#x5E93;&#x4E2D;&#x7684;&#x8F7B;&#x91CF;&#x4E14;&#x5FEB;&#x901F;&#x7684; ORM &#x89E3;&#x51B3;&#x65B9;&#x6848;&#x3002;&#x5B83;&#x7684;&#x672C;&#x8D28;&#x5C31;&#x662F;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x9762;&#x5411;&#x5BF9;&#x8C61;&#x7684;&#x63A5;&#x53E3;&#xFF0C;&#x4F7F;&#x5F97;&#x5F00;&#x53D1;&#x8005;&#x66F4;&#x52A0;&#x65B9;&#x4FBF;&#x5730;&#x5C06;&#x6570;&#x636E;&#x5B58;&#x50A8;&#x5230;&#x6570;&#x636E;&#x5E93;SQLite&#x4E4B;&#x4E2D;&#x3002;&#x6211;&#x4EEC;&#x53EA;&#x9700;&#x8981;&#x5B9A;&#x4E49;&#x6570;&#x636E;&#x6A21;&#x578B;&#xFF0C;GreenDao&#x5C31;&#x4F1A;&#x4E3A;&#x6211;&#x4EEC;&#x751F;&#x6210;&#x5B9E;&#x4F53;&#x7C7B;&#x4EE5;&#x53CA;DAOs(data access objects)&#xFF0C;&#xFF08;&#x5728;3.0&#x4E4B;&#x540E;&#x4E0D;&#x9700;&#x8981;&#x6211;&#x4EEC;&#x7F16;&#x5199;generator&#x800C;&#x662F;&#x7F16;&#x5199;&#x5B9E;&#x4F53;&#x7C7B;&#x5E76;&#x6DFB;&#x52A0;&#x6CE8;&#x89E3;&#xFF0C;GreenDao&#x4F1A;&#x4E3A;&#x6211;&#x4EEC;&#x751F;&#x6210;schema&#xFF0C;&#x4EE5;&#x53CA;DAOs&#xFF09;&#x4ECE;&#x800C;&#x907F;&#x514D;&#x4E86;&#x5F00;&#x53D1;&#x8005;&#x7F16;&#x5199;&#x8F83;&#x591A;&#x67AF;&#x71E5;&#x7684;&#x6570;&#x636E;&#x5B58;&#x50A8;&#x548C;&#x52A0;&#x8F7D;&#x7684;&#x4EE3;&#x7801;&#x3002;</p><a id="more"></a><hr><blockquote><ul><li><a href="http://tiimor.cn/Android%E9%BB%84%E9%87%91%E7%AF%87-SQLite%E6%95%B0%E6%8D%AE%E5%BA%93/">Android&#x9EC4;&#x91D1;&#x7BC7;-SQLite&#x6570;&#x636E;&#x5E93;</a></li><li><a href="http://tiimor.cn/Android%E6%95%B0%E6%8D%AE%E5%BA%93%E5%8A%A0%E5%AF%86/">Android&#x6570;&#x636E;&#x5E93;&#x52A0;&#x5BC6;</a></li></ul></blockquote><hr><font size="4"><strong><a href="https://github.com/greenrobot/greenDAO" target="_blank" rel="noopener">GreenDao&#x4F20;&#x9001;&#x95E8;</a></strong></font><p><br></p><h1 id="GreenDao&#x4ECB;&#x7ECD;"><a href="#GreenDao&#x4ECB;&#x7ECD;" class="headerlink" title="GreenDao&#x4ECB;&#x7ECD;"></a>GreenDao&#x4ECB;&#x7ECD;</h1><p>&#x5728;GreenDao&#x4E2D;&#xFF0C;&#x9ED8;&#x8BA4;&#x4F1A;&#x4E3A;&#x6BCF;&#x4E00;&#x4E2A;&#x5B9E;&#x4F53;&#x7C7B;&#x5EFA;&#x7ACB;&#x4E00;&#x5F20;&#x6570;&#x636E;&#x8868;&#xFF0C;&#x5B9E;&#x4F53;&#x7C7B;&#x7684;&#x6BCF;&#x4E00;&#x4E2A;&#x5C5E;&#x6027;&#x5BF9;&#x5E94;&#x6570;&#x636E;&#x8868;&#x4E2D;&#x7684;&#x4E00;&#x5217;&#x3002;</p><p><strong>&#x4F18;&#x70B9;</strong></p><ul><li>Android&#x7CBE;&#x7B80;&#x7684;&#x4F9D;&#x8D56;&#x5E93;&#xFF0C;&#x65B9;&#x4FBF;&#x96C6;&#x6210;</li><li>&#x6027;&#x80FD;&#x6700;&#x5927;&#x5316;</li><li>&#x5185;&#x5B58;&#x5F00;&#x9500;&#x6700;&#x5C0F;&#x5316;</li><li>&#x6613;&#x4E8E;&#x4F7F;&#x7528;&#x7684;APIs</li><li>&#x5BF9;Android&#x8FDB;&#x884C;&#x9AD8;&#x5EA6;&#x4F18;&#x5316;</li></ul><p><img src="http://cdn.tiimor.cn/images/GreenDao-%E5%8D%95%E4%BD%8D%E6%97%B6%E9%97%B4%E5%86%85%E7%9A%84%E6%93%8D%E4%BD%9C%E6%95%B0%E9%87%8F.png" alt="&#x6027;&#x80FD;&#x6BD4;&#x8F83;" title="&#x5355;&#x4F4D;&#x65F6;&#x95F4;&#x5185;&#x7684;&#x64CD;&#x4F5C;&#x6570;&#x91CF;"></p><h1 id="&#x914D;&#x7F6E;"><a href="#&#x914D;&#x7F6E;" class="headerlink" title="&#x914D;&#x7F6E;"></a>&#x914D;&#x7F6E;</h1><p>GreenDao3 &#x91C7;&#x7528;&#x6CE8;&#x89E3;&#x65B9;&#x5F0F;&#x6765;&#x5B9A;&#x4E49;&#x5B9E;&#x4F53;&#x7C7B;&#xFF0C;&#x901A;&#x8FC7;gradle&#x63D2;&#x4EF6;&#x751F;&#x6210;&#x76F8;&#x5E94;&#x7684;&#x4EE3;&#x7801;&#x3002;</p><h2 id="&#x914D;&#x7F6E;&#x63D2;&#x4EF6;"><a href="#&#x914D;&#x7F6E;&#x63D2;&#x4EF6;" class="headerlink" title="&#x914D;&#x7F6E;&#x63D2;&#x4EF6;"></a>&#x914D;&#x7F6E;&#x63D2;&#x4EF6;</h2><p>&#x5728;&#x5DE5;&#x7A0B;<strong>&#x6839;&#x76EE;&#x5F55;&#x4E0B;&#x7684;build.gradle&#x6587;&#x4EF6;&#x91CC;</strong>&#xFF0C;&#x6DFB;&#x52A0;&#x4EE3;&#x7801;&#xFF1A;<br></p><figure class="highlight gradle"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">dependencies</span> {</span><br><span class="line"><span class="keyword">classpath</span> <span class="string">&apos;com.android.tools.build:gradle:2.3.3&apos;</span></span><br><span class="line"><span class="comment">// &#x6DFB;&#x52A0;GreenDao&#x63D2;&#x4EF6;</span></span><br><span class="line"><span class="keyword">classpath</span> <span class="string">&apos;org.greenrobot:greendao-gradle-plugin:3.2.0&apos;</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p></p><h2 id="&#x914D;&#x7F6E;&#x4F9D;&#x8D56;"><a href="#&#x914D;&#x7F6E;&#x4F9D;&#x8D56;" class="headerlink" title="&#x914D;&#x7F6E;&#x4F9D;&#x8D56;"></a>&#x914D;&#x7F6E;&#x4F9D;&#x8D56;</h2><p>&#x5728;<strong>Module&#x4E0B;&#x7684;build.gradle</strong>&#x6587;&#x4EF6;&#x91CC;&#xFF0C;&#x6DFB;&#x52A0;&#x4EE3;&#x7801;&#xFF1A;<br></p><figure class="highlight sqf"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">apply</span> plugin: <span class="string">&apos;com.android.application&apos;</span></span><br><span class="line"><span class="comment">// &#x6DFB;&#x52A0;</span></span><br><span class="line"><span class="built_in">apply</span> plugin: <span class="string">&apos;org.greenrobot.greendao&apos;</span></span><br><span class="line"></span><br><span class="line">dependencies {</span><br><span class="line"><span class="comment">// &#x6DFB;&#x52A0;</span></span><br><span class="line"><span class="built_in">compile</span> <span class="string">&apos;org.greenrobot:greendao:3.2.0&apos;</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x6DFB;&#x52A0;</span></span><br><span class="line">greendao {</span><br><span class="line">    schemaVersion <span class="number">1</span></span><br><span class="line">    daoPackage <span class="string">&apos;com.excellence.medical.greendao&apos;</span></span><br><span class="line">    targetGenDir <span class="string">&apos;src/main/java&apos;</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p></p><ul><li>schemaVersion&#xFF1A; &#x6570;&#x636E;&#x5E93;&#x7248;&#x672C;&#x53F7;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;1</li><li>daoPackage&#xFF1A; &#x751F;&#x6210;&#x7684;DAOs&#x3001;DaoMaster&#x3001;DaoSession&#x5305;&#x540D;&#xFF1B;&#x9ED8;&#x8BA4;&#x4E3A;entities&#xFF08;&#x6570;&#x636E;&#x5E93;&#x5B9E;&#x4F53;&#x7C7B;&#xFF09;&#x6240;&#x5728;&#x7684;&#x5305;&#x540D;</li><li>targetGenDir: &#x751F;&#x6210;&#x7684;DAOs&#x3001;DaoMaster&#x3001;DaoSession&#x7684;&#x76EE;&#x5F55;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;build/generated/source/greendao</li><li>generateTests: &#x8BBE;&#x7F6E;true&#x81EA;&#x52A8;&#x751F;&#x6210;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x3002;</li><li>targetGenDirTests: &#x8BBE;&#x7F6E;&#x751F;&#x6210;&#x5355;&#x5143;&#x6D4B;&#x8BD5;&#x76EE;&#x5F55;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A;src/androidTest/java</li></ul><h1 id="&#x57FA;&#x672C;&#x7528;&#x6CD5;"><a href="#&#x57FA;&#x672C;&#x7528;&#x6CD5;" class="headerlink" title="&#x57FA;&#x672C;&#x7528;&#x6CD5;"></a>&#x57FA;&#x672C;&#x7528;&#x6CD5;</h1><h2 id="&#x5B9E;&#x4F53;"><a href="#&#x5B9E;&#x4F53;" class="headerlink" title="&#x5B9E;&#x4F53;"></a>&#x5B9E;&#x4F53;</h2><p>&#x521B;&#x5EFA;&#x5E26;&#x6CE8;&#x89E3;@Entity&#x7684;&#x5B9E;&#x4F53;&#x7C7B;&#xFF0C;&#x5B9E;&#x4F53;&#x7C7B;&#x5373;&#x6570;&#x636E;&#x8868;&#xFF1B;&#x901A;&#x5E38;&#xFF08;&#x9664;&#x5F00;&#x5E26;@Transient&#x6CE8;&#x89E3;&#x7684;&#x6210;&#x5458;&#xFF09;&#x5B9E;&#x4F53;&#x7C7B;&#x4E2D;&#x6210;&#x5458;&#x5C31;&#x662F;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x5BF9;&#x5E94;&#x7684;&#x5B57;&#x6BB5;&#x3002;&#x7136;&#x540E;<code>make project</code>&#x7F16;&#x8BD1;&#x9879;&#x76EE;&#xFF0C;&#x5B9E;&#x4F53;&#x7C7B;&#x4F1A;&#x81EA;&#x52A8;&#x751F;&#x6210;get&#x3001;set&#x65B9;&#x6CD5;&#xFF0C;&#x5E76;&#x4E14;&#x5728;<code>targetGenDir</code>&#x76EE;&#x5F55;&#x4E0B;&#x7684;<code>daoPackage</code>&#x5305;&#x91CC;&#xFF0C;&#x5982;<code>src/main/java/com/excellence/medical/greendao</code>&#xFF0C;&#x751F;&#x6210;DaoMaster&#x3001;DaoSession&#x3001;&#x4EE5;&#x53CA;AccountDao&#x3002;</p><p>&#x5982;&#x679C;&#x60F3;&#x589E;&#x52A0;&#x6216;&#x51CF;&#x5C11;&#x6570;&#x636E;&#x5E93;&#x5B57;&#x6BB5;&#xFF0C;&#x5220;&#x9664;&#x5B9E;&#x4F53;&#x7C7B;&#x4E2D;&#x81EA;&#x52A8;&#x751F;&#x6210;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x7136;&#x540E;&#x8FDB;&#x884C;&#x589E;&#x52A0;&#x6216;&#x51CF;&#x5C11;&#x5B9E;&#x4F53;&#x7C7B;&#x4E2D;&#x7684;&#x6210;&#x5458;&#x3002;</p><figure class="highlight kotlin"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Entity(nameInDb = <span class="meta-string">&quot;account&quot;</span>)</span></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Account</span> </span>{</span><br><span class="line"></span><br><span class="line"><span class="meta">@Id(autoincrement = true)</span></span><br><span class="line"><span class="keyword">private</span> <span class="built_in">Long</span>id;</span><br><span class="line"><span class="meta">@Unique</span></span><br><span class="line"><span class="keyword">private</span> StringaccountId;</span><br><span class="line"><span class="keyword">private</span> StringaccountName;</span><br><span class="line"><span class="keyword">private</span> StringaccountPwd;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="&#x6CE8;&#x89E3;"><a href="#&#x6CE8;&#x89E3;" class="headerlink" title="&#x6CE8;&#x89E3;"></a>&#x6CE8;&#x89E3;</h2><ul><li><p>@Entity<br>&#x4FEE;&#x9970;&#x5B9E;&#x4F53;&#x7C7B;&#x540D;</p><figure class="highlight nix"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">@Entity(</span><br><span class="line">    // schema &#x540D;&#xFF0C;&#x591A;&#x4E2A; schema &#x65F6;&#x8BBE;&#x7F6E;&#x5173;&#x8054;&#x5B9E;&#x4F53;&#x3002;&#x63D2;&#x4EF6;&#x4EA7;&#x751F;&#x4E0D;&#x652F;&#x6301;&#xFF0C;&#x9700;&#x4F7F;&#x7528;&#x4EA7;&#x751F;&#x5668;</span><br><span class="line">    // <span class="attr">schema</span> = <span class="string">&quot;myschema&quot;</span>,</span><br><span class="line"></span><br><span class="line">    // &#x6807;&#x8BB0;&#x4E00;&#x4E2A;&#x5B9E;&#x4F53;&#x662F;&#x5426;&#x5904;&#x4E8E;&#x6D3B;&#x52A8;&#x72B6;&#x6001;&#xFF0C;&#x6D3B;&#x52A8;&#x5B9E;&#x4F53;&#x6709; update&#x3001;delete&#x3001;refresh &#x65B9;&#x6CD5;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; <span class="literal">false</span></span><br><span class="line">    <span class="attr">active</span> = <span class="literal">false</span>,</span><br><span class="line"></span><br><span class="line">    // &#x8868;&#x540D;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E3A;&#x7C7B;&#x540D;</span><br><span class="line">    <span class="attr">nameInDb</span> = <span class="string">&quot;Account&quot;</span>,</span><br><span class="line"></span><br><span class="line">    // &#x5B9A;&#x4E49;&#x591A;&#x5217;&#x7D22;&#x5F15;</span><br><span class="line">    <span class="attr">indexes</span> = {</span><br><span class="line">            @Index(<span class="attr">value</span> = <span class="string">&quot;name DESC&quot;</span>, <span class="attr">unique</span> = <span class="literal">true</span>)</span><br><span class="line">    },</span><br><span class="line"></span><br><span class="line">    // &#x6807;&#x8BB0;&#x662F;&#x5426;&#x521B;&#x5EFA;&#x8868;&#xFF0C;&#x9ED8;&#x8BA4; <span class="literal">true</span>&#x3002;&#x591A;&#x5B9E;&#x4F53;&#x5BF9;&#x5E94;&#x4E00;&#x4E2A;&#x8868;&#x6216;&#x8005;&#x8868;&#x5DF2;&#x521B;&#x5EFA;&#xFF0C;&#x4E0D;&#x9700;&#x8981; greenDAO &#x521B;&#x5EFA;&#x65F6;&#x8BBE;&#x7F6E; <span class="literal">false</span></span><br><span class="line">    <span class="attr">createInDb</span> = <span class="literal">true</span>,</span><br><span class="line"></span><br><span class="line">    // &#x662F;&#x5426;&#x4EA7;&#x751F;&#x6240;&#x6709;&#x53C2;&#x6570;&#x6784;&#x9020;&#x5668;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; <span class="literal">true</span>&#x3002;&#x65E0;&#x53C2;&#x6784;&#x9020;&#x5668;&#x5FC5;&#x5B9A;&#x4EA7;&#x751F;</span><br><span class="line">    <span class="attr">generateConstructors</span> = <span class="literal">true</span>,</span><br><span class="line"></span><br><span class="line">    // &#x5982;&#x679C;&#x6CA1;&#x6709; get/set &#x65B9;&#x6CD5;&#xFF0C;&#x662F;&#x5426;&#x751F;&#x6210;&#x3002;&#x9ED8;&#x8BA4;&#x4E3A; <span class="literal">true</span></span><br><span class="line">    <span class="attr">generateGettersSetters</span> = <span class="literal">true</span></span><br><span class="line">)</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x4FEE;&#x9970;&#x5B9E;&#x4F53;&#x7C7B;&#x6210;&#x5458;</p><figure class="highlight less"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x4E3B;&#x952E;&#xFF0C;autoincrement&#x8BBE;&#x7F6E;&#x81EA;&#x589E;&#xFF0C;&#x6CE8;&#x610F;&#x7C7B;&#x578B;&#x662F;Long&#xFF0C;&#x800C;&#x4E0D;&#x662F;long</span></span><br><span class="line"><span class="variable">@Id</span>(autoincrement = true)</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x552F;&#x4E00;&#xFF0C;&#x9ED8;&#x8BA4;&#x7D22;&#x5F15;</span></span><br><span class="line"><span class="variable">@Unique</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5217;&#x540D;-&#x5B57;&#x6BB5;&#x540D;&#xFF0C;&#x9ED8;&#x8BA4;&#x4F7F;&#x7528;&#x53D8;&#x91CF;&#x540D;&#x3002;&#x53D8;&#x5316;&#xFF1A;customName --&gt; CUSTOM_NAME</span></span><br><span class="line"><span class="variable">@Property</span>(nameInDb = <span class="string">&quot;USERNAME&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x7D22;&#x5F15;&#xFF0C;unique&#x8BBE;&#x7F6E;&#x552F;&#x4E00;&#xFF0C;name&#x8BBE;&#x7F6E;&#x7D22;&#x5F15;&#x522B;&#x540D;</span></span><br><span class="line"><span class="variable">@Index</span>(unique = true)</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x975E;&#x7A7A;</span></span><br><span class="line"><span class="variable">@NotNull</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5FFD;&#x7565;&#xFF0C;&#x4E0D;&#x6301;&#x4E45;&#x5316;&#xFF0C;&#x5373;&#x6570;&#x636E;&#x8868;&#x4E0D;&#x521B;&#x5EFA;&#x8BE5;&#x5B57;&#x6BB5;&#xFF0C;&#x53EF;&#x7528;&#x5173;&#x952E;&#x5B57;transient&#x66FF;&#x4EE3;</span></span><br><span class="line"><span class="variable">@Transient</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5BF9;&#x4E00;&#xFF0C;&#x5B9E;&#x4F53;&#x5C5E;&#x6027; joinProperty &#x5BF9;&#x5E94;&#x5916;&#x8054;&#x5B9E;&#x4F53;ID</span></span><br><span class="line"><span class="variable">@ToOne</span>(joinProperty = <span class="string">&quot;fk_dogId&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5BF9;&#x591A;&#x3002;&#x5B9E;&#x4F53;ID&#x5BF9;&#x5E94;&#x5916;&#x8054;&#x5B9E;&#x4F53;&#x5C5E;&#x6027; referencedJoinProperty</span></span><br><span class="line"><span class="variable">@ToMany</span>(referencedJoinProperty = <span class="string">&quot;fk_userId&quot;</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5BF9;&#x591A;&#x3002;@JoinProperty&#xFF1A;name &#x5B9E;&#x4F53;&#x5C5E;&#x6027;&#x5BF9;&#x5E94;&#x5916;&#x8054;&#x5B9E;&#x4F53;&#x5C5E;&#x6027; referencedName</span></span><br><span class="line"><span class="variable">@ToMany</span>(joinProperties = {<span class="variable">@JoinProperty</span>(name = <span class="string">&quot;horseName&quot;</span>, referencedName = <span class="string">&quot;name&quot;</span>)})</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5BF9;&#x591A;&#x3002;@JoinEntity&#xFF1A;entity &#x4E2D;&#x95F4;&#x8868;&#xFF1B;&#x4E2D;&#x95F4;&#x8868;&#x5C5E;&#x6027; sourceProperty &#x5BF9;&#x5E94;&#x5B9E;&#x4F53;ID&#xFF1B;&#x4E2D;&#x95F4;&#x8868;&#x5C5E;&#x6027; targetProperty &#x5BF9;&#x5E94;&#x5916;&#x8054;&#x5B9E;&#x4F53;ID</span></span><br><span class="line"><span class="variable">@ToMany</span></span><br><span class="line"><span class="variable">@JoinEntity</span>(entity = JoinUserWithSheep.class, sourceProperty = <span class="string">&quot;uId&quot;</span>, targetProperty = <span class="string">&quot;sId&quot;</span>)</span><br></pre></td></tr></tbody></table></figure></li></ul><h2 id="&#x521D;&#x59CB;&#x5316;"><a href="#&#x521D;&#x59CB;&#x5316;" class="headerlink" title="&#x521D;&#x59CB;&#x5316;"></a>&#x521D;&#x59CB;&#x5316;</h2><p>&#x5728;Application&#x4E2D;&#x8FDB;&#x884C;&#x521D;&#x59CB;&#x5316;&#xFF0C;GreenDao&#x6253;&#x5F00;&#x6570;&#x636E;&#x5E93;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#xFF1A;&#x2460;&#x6253;&#x5F00;&#x5185;&#x90E8;&#xFF08;<code>/data/data/xxxpackageNamexxx/</code>&#xFF09;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x2461;&#x6253;&#x5F00;&#x5916;&#x90E8;&#xFF08;&#x5176;&#x4ED6;&#x76EE;&#x5F55;&#x4E0B;&#xFF09;&#x6570;&#x636E;&#x5E93;</p><ul><li><p>&#x5185;&#x90E8;&#x6570;&#x636E;&#x5E93;</p><figure class="highlight haxe"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x6CE8;&#x610F;</span></span><br><span class="line">DaoMaster.OpenHelper helper = <span class="keyword">new</span> <span class="type">DaoMaster</span>.DevOpenHelper(<span class="built_in">this</span>, VOD_DB, <span class="literal">null</span>);</span><br><span class="line">mDaoMaster = <span class="keyword">new</span> <span class="type">DaoMaster</span>(helper.getWritableDatabase());</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5982;&#x679C;&#x60F3;&#x4F7F;&#x7528;Dao&#xFF0C;&#x76F4;&#x63A5;&#x7528;mDaoSession&#x83B7;&#x53D6;&#x5BF9;&#x5E94;&#x7684;Dao&#x6765;&#x64CD;&#x4F5C;</span></span><br><span class="line">mDaoSession = mDaoMaster.<span class="keyword">new</span><span class="type">Session</span>();</span><br><span class="line"><span class="comment">// Dao&#xFF0C;&#x6267;&#x884C;&#x589E;&#x5220;&#x6539;&#x67E5;&#x64CD;&#x4F5C;</span></span><br><span class="line">AccountDao dao = mDaoSession.getAccountDao();</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x5982;&#x679C;&#x60F3;&#x4F7F;&#x7528;Sql&#x8BED;&#x53E5;&#xFF0C;&#x5C31;&#x4F7F;&#x7528;mDaoDatabase&#x64CD;&#x4F5C;</span></span><br><span class="line">mDaoDatabase = mDaoSession.getDatabase();</span><br><span class="line"></span><br><span class="line"><span class="comment">// GreenDao&#x6709;&#x7279;&#x6B8A;&#x7684;&#x7EBF;&#x7A0B;&#x6765;&#x5904;&#x7406;&#x6570;&#x636E;&#x5E93;&#x7684;&#x8017;&#x65F6;&#x64CD;&#x4F5C;</span></span><br><span class="line">mAsyncSession = mDaoSession.startAsyncSession();</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x5916;&#x90E8;&#x6570;&#x636E;&#x5E93;</p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">DatabaseContext</span> <span class="keyword">extends</span> <span class="title">ContextWrapper</span> </span>{</span><br><span class="line"></span><br><span class="line"><span class="keyword">private</span> String mDBPath = <span class="keyword">null</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="title">DatabaseContext</span><span class="params">(Context base)</span> </span>{</span><br><span class="line"><span class="keyword">super</span>(base);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="title">DatabaseContext</span><span class="params">(Context base, String dbPath)</span> </span>{</span><br><span class="line"><span class="keyword">super</span>(base);</span><br><span class="line">mDBPath = dbPath;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> File <span class="title">getDatabasePath</span><span class="params">(String name)</span> </span>{</span><br><span class="line">String dbPath = mDBPath + name;</span><br><span class="line"><span class="keyword">if</span> (FileUtils.isFileExists(dbPath)) {</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">new</span> File(dbPath);</span><br><span class="line">} <span class="keyword">else</span> {</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">null</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> SQLiteDatabase <span class="title">openOrCreateDatabase</span><span class="params">(String name, <span class="keyword">int</span> mode, SQLiteDatabase.CursorFactory factory)</span> </span>{</span><br><span class="line"><span class="keyword">int</span> flags = SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.NO_LOCALIZED_COLLATORS;</span><br><span class="line"><span class="keyword">return</span> SQLiteDatabase.openDatabase(getDatabasePath(name).getAbsolutePath(), factory, flags, <span class="keyword">null</span>);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> SQLiteDatabase <span class="title">openOrCreateDatabase</span><span class="params">(String name, <span class="keyword">int</span> mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler)</span> </span>{</span><br><span class="line"><span class="keyword">int</span> flags = SQLiteDatabase.CREATE_IF_NECESSARY | SQLiteDatabase.NO_LOCALIZED_COLLATORS;</span><br><span class="line"><span class="keyword">return</span> SQLiteDatabase.openDatabase(getDatabasePath(name).getAbsolutePath(), factory, flags, errorHandler);</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ul><figure class="highlight haxe"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x91CD;&#x5199;&#x4F20;&#x5165;DaoMaster.DevOpenHelper&#x7684;Context&#xFF0C;&#x5373;&#x6539;&#x53D8;&#x6570;&#x636E;&#x5E93;&#x7684;&#x8DEF;&#x5F84;</span></span><br><span class="line">DatabaseContext databaseContext = <span class="keyword">new</span> <span class="type">DatabaseContext</span>(<span class="built_in">this</span>, DB_PATH);</span><br><span class="line">DaoMaster.OpenHelper helper = <span class="keyword">new</span> <span class="type">DaoMaster</span>.DevOpenHelper(databaseContext, VOD_DB, <span class="literal">null</span>);</span><br><span class="line">&#x5176;&#x4ED6;&#x7C7B;&#x4F3C;&#x6253;&#x5F00;&#x5185;&#x90E8;&#x6570;&#x636E;&#x5E93;</span><br></pre></td></tr></tbody></table></figure><ul><li><p><strong>&#x6CE8;&#x610F;&#xFF1A;</strong></p><ul><li>DaoMaster.DevOpenHelper&#x5728;&#x6570;&#x636E;&#x5E93;&#x5347;&#x7EA7;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F1A;&#x5220;&#x9664;&#x6240;&#x6709;&#x7684;&#x8868;&#xFF0C;&#x53EA;&#x80FD;&#x7528;&#x4E8E;Debug&#x8C03;&#x8BD5;&#xFF0C;&#x6B63;&#x5F0F;&#x9879;&#x76EE;&#x9700;&#x8981;&#x5C01;&#x88C5;&#x5904;&#x7406;&#xFF0C;GreenDao&#x5347;&#x7EA7;&#x8BF7;&#x53C2;&#x8003;&#xFF1A;<a href="https://github.com/yuweiguocn/GreenDaoUpgradeHelper" target="_blank" rel="noopener">GreenDaoUpgradeHelper</a></li><li>&#x5982;&#x679C;GreenDao&#x60F3;&#x4F7F;&#x7528;<strong>&#x6253;&#x5F00;&#x591A;&#x4E2A;&#x6570;&#x636E;&#x5E93;</strong>&#xFF0C;&#x53EF;&#x4EE5;&#x521B;&#x5EFA;&#x591A;&#x4E2A;DaoMaster.OpenHelper&#x548C;DaoSession&#xFF1B;&#x540C;&#x65F6;&#x91CD;&#x5199;onCreate&#x65B9;&#x6CD5;&#xFF0C;&#x5426;&#x5219;&#x6BCF;&#x4E2A;&#x6570;&#x636E;&#x5E93;&#x7684;&#x8868;&#x662F;&#x4E00;&#x6837;&#x7684;&#x3002;&#x4F8B;&#x5982;&#xFF1A;<figure class="highlight haxe"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">DaoMaster.OpenHelper helper = <span class="keyword">new</span> <span class="type">DaoMaster</span>.OpenHelper(<span class="built_in">this</span>, DB_NAME) {</span><br><span class="line">@Override</span><br><span class="line"><span class="keyword">public</span> void onCreate(Database db) {</span><br><span class="line">ConfigDao.createTable(db, <span class="literal">false</span>);</span><br><span class="line">MemberDao.createTable(db, <span class="literal">false</span>);</span><br><span class="line">}</span><br><span class="line">};</span><br><span class="line">mDaoSession = <span class="keyword">new</span> <span class="type">DaoMaster</span>(helper.getWritableDatabase()).<span class="keyword">new</span><span class="type">Session</span>();</span><br><span class="line"></span><br><span class="line">DaoMaster.OpenHelper encryptedHelper = <span class="keyword">new</span> <span class="type">DaoMaster</span>.OpenHelper(<span class="built_in">this</span>, ENCRYPTED_DB_NAME) {</span><br><span class="line">@Override</span><br><span class="line"><span class="keyword">public</span> void onCreate(Database db) {</span><br><span class="line">AccountDao.createTable(db, <span class="literal">false</span>);</span><br><span class="line">}</span><br><span class="line">};</span><br><span class="line">mEncryptedDaoSession = <span class="keyword">new</span> <span class="type">DaoMaster</span>(encryptedHelper.getEncryptedWritableDb(getUniquePseudoID())).<span class="keyword">new</span><span class="type">Session</span>();</span><br></pre></td></tr></tbody></table></figure></li></ul></li></ul><h2 id="&#x589E;&#x5220;&#x6539;&#x67E5;"><a href="#&#x589E;&#x5220;&#x6539;&#x67E5;" class="headerlink" title="&#x589E;&#x5220;&#x6539;&#x67E5;"></a>&#x589E;&#x5220;&#x6539;&#x67E5;</h2><ul><li><p>&#x4F7F;&#x7528;Dao&#x64CD;&#x4F5C;&#x65F6;&#xFF0C;&#x6570;&#x636E;&#x5E93;&#x91CC;&#x5FC5;&#x987B;&#x6709;<strong>&#x4E3B;&#x952E;</strong>&#xFF0C;&#x64CD;&#x4F5C;&#x624D;&#x4F1A;&#x6210;&#x529F;&#xFF1B;&#x5426;&#x5219;&#x64CD;&#x4F5C;&#x65E0;&#x6548;&#x6216;&#x8FBE;&#x4E0D;&#x5230;&#x9884;&#x671F;&#x7684;&#x7ED3;&#x679C;</p></li><li><p>GreenDao&#x6709;&#x4E00;&#x4E2A;&#x7F13;&#x5B58;&#x673A;&#x5236;&#xFF0C;&#x5373;&#x628A;&#x7528;&#x6237;&#x63D2;&#x5165;&#xFF0C;&#x66F4;&#x6539;&#x6216;&#x67E5;&#x627E;&#x7684;&#x5B9E;&#x4F53;&#x4FDD;&#x5B58;&#x5728;&#x5185;&#x5B58;&#x4E2D;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x4E0B;&#x4E00;&#x6B21;&#x67E5;&#x627E;&#x65F6;&#x5148;&#x4ECE;&#x5185;&#x5B58;&#x4E2D;&#x67E5;&#x627E;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#x518D;&#x4ECE;&#x6570;&#x636E;&#x5E93;&#x4E2D;&#x67E5;&#x627E;&#xFF0C;&#x6E05;&#x9664;&#x7F13;&#x5B58;&#x4F7F;&#x7528;&#xFF1A;<code>DaoSession.clear()</code></p></li><li><p>&#x5982;&#x679C;&#x6CA1;&#x6709;&#x4E3B;&#x952E;&#xFF0C;&#x5219;&#x53EA;&#x80FD;&#x4F7F;&#x7528;Sql&#x8BED;&#x53E5;&#x64CD;&#x4F5C;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x53EF;&#x4EE5;&#x53C2;&#x8003;&#xFF1A;<a href="http://tiimor.cn/Android%E9%BB%84%E9%87%91%E7%AF%87-SQLite%E6%95%B0%E6%8D%AE%E5%BA%93/">Android&#x9EC4;&#x91D1;&#x7BC7;-SQLite&#x6570;&#x636E;&#x5E93;</a></p></li></ul><h3 id="Dao&#x589E;&#x52A0;"><a href="#Dao&#x589E;&#x52A0;" class="headerlink" title="Dao&#x589E;&#x52A0;"></a>Dao&#x589E;&#x52A0;</h3><figure class="highlight processing"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">long</span>     insert(T entity)  <span class="comment">// &#x63D2;&#x5165;&#x6307;&#x5B9A;&#x5B9E;&#x4F53;</span></span><br><span class="line"><span class="keyword">void</span>     insertInTx(T... entities)</span><br><span class="line"><span class="keyword">void</span>     insertInTx(java.lang.Iterable&lt;T&gt; entities)</span><br><span class="line"><span class="keyword">void</span>     insertInTx(java.lang.Iterable&lt;T&gt; entities, <span class="built_in">boolean</span> setPrimaryKey)</span><br><span class="line"><span class="keyword">long</span>     insertWithoutSettingPk(T entity)  <span class="comment">// &#x63D2;&#x5165;&#x6307;&#x5B9A;&#x5B9E;&#x4F53;&#xFF0C;&#x65E0;&#x4E3B;&#x952E;</span></span><br><span class="line"><span class="keyword">long</span>     insertOrReplace(T entity)  <span class="comment">// &#x63D2;&#x5165;&#x6216;&#x66FF;&#x6362;&#x6307;&#x5B9A;&#x5B9E;&#x4F53;</span></span><br><span class="line"><span class="keyword">void</span>     insertOrReplaceInTx(T... entities)</span><br><span class="line"><span class="keyword">void</span>     insertOrReplaceInTx(java.lang.Iterable&lt;T&gt; entities)</span><br><span class="line"><span class="keyword">void</span>     insertOrReplaceInTx(java.lang.Iterable&lt;T&gt; entities, <span class="built_in">boolean</span> setPrimaryKey)</span><br><span class="line"><span class="keyword">void</span>     <span class="built_in">save</span>(T entity)  <span class="comment">// &#x4F9D;&#x8D56;&#x6307;&#x5B9A;&#x7684;&#x4E3B;&#x952E;&#x63D2;&#x5165;&#x6216;&#x4FEE;&#x6539;&#x5B9E;&#x4F53;</span></span><br><span class="line"><span class="keyword">void</span>     saveInTx(T... entities)</span><br><span class="line"><span class="keyword">void</span>     saveInTx(java.lang.Iterable&lt;T&gt; entities)</span><br></pre></td></tr></tbody></table></figure><h3 id="Dao&#x5220;&#x9664;"><a href="#Dao&#x5220;&#x9664;" class="headerlink" title="Dao&#x5220;&#x9664;"></a>Dao&#x5220;&#x9664;</h3><figure class="highlight dart"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span>     deleteAll()  <span class="comment">// &#x5220;&#x9664;&#x6240;&#x6709;</span></span><br><span class="line"><span class="keyword">void</span>     delete(T entity)  <span class="comment">// &#x5220;&#x9664;&#x6307;&#x5B9A;&#x7684;&#x5B9E;&#x4F53;</span></span><br><span class="line"><span class="keyword">void</span>     deleteInTx(T... entities)</span><br><span class="line"><span class="keyword">void</span>     deleteInTx(java.lang.<span class="built_in">Iterable</span>&lt;T&gt; entities)</span><br><span class="line"><span class="keyword">void</span>     deleteByKey(K key)  <span class="comment">// &#x5220;&#x9664;&#x6307;&#x5B9A;&#x4E3B;&#x952E;&#x5BF9;&#x5E94;&#x7684;&#x5B9E;&#x4F53;</span></span><br><span class="line"><span class="keyword">void</span>     deleteByKeyInTx(K... keys)</span><br><span class="line"><span class="keyword">void</span>     deleteByKeyInTx(java.lang.<span class="built_in">Iterable</span>&lt;K&gt; keys)</span><br></pre></td></tr></tbody></table></figure><h3 id="Dao&#x4FEE;&#x6539;"><a href="#Dao&#x4FEE;&#x6539;" class="headerlink" title="Dao&#x4FEE;&#x6539;"></a>Dao&#x4FEE;&#x6539;</h3><figure class="highlight lisp"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">void     update(<span class="name">T</span> entity)</span><br><span class="line">void     updateInTx(<span class="name">T</span>... entities)</span><br><span class="line">void     updateInTx(<span class="name">java</span>.lang.Iterable&lt;T&gt; entities)</span><br></pre></td></tr></tbody></table></figure><h3 id="Dao&#x67E5;&#x8BE2;"><a href="#Dao&#x67E5;&#x8BE2;" class="headerlink" title="Dao&#x67E5;&#x8BE2;"></a>Dao&#x67E5;&#x8BE2;</h3><figure class="highlight pf"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">java.util.List<span class="variable">&lt;T&gt;</span>     <span class="built_in">load</span>All()</span><br><span class="line">T     <span class="built_in">load</span>(K key)</span><br><span class="line">T     <span class="built_in">load</span>ByRowId(long rowId)</span><br></pre></td></tr></tbody></table></figure><h3 id="QueryBuilder&#x67E5;&#x8BE2;"><a href="#QueryBuilder&#x67E5;&#x8BE2;" class="headerlink" title="QueryBuilder&#x67E5;&#x8BE2;"></a>QueryBuilder&#x67E5;&#x8BE2;</h3><figure class="highlight dts"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     queryBuilder()  <span class="comment">// Dao</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// QueryBuilder</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     where(WhereCondition cond, WhereCondition... condMore)  <span class="comment">// &#x6761;&#x4EF6;&#xFF0C;AND &#x8FDE;&#x63A5;</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     whereOr(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore)  <span class="comment">// &#x6761;&#x4EF6;&#xFF0C;OR &#x8FDE;&#x63A5;</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     distinct()  <span class="comment">// &#x53BB;&#x91CD;&#xFF0C;&#x4F8B;&#x5982;&#x4F7F;&#x7528;&#x8054;&#x5408;&#x67E5;&#x8BE2;&#x65F6;</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     limit(int limit)  <span class="comment">// &#x9650;&#x5236;&#x8FD4;&#x56DE;&#x6570;</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     offset(int offset)  <span class="comment">// &#x504F;&#x79FB;&#x7ED3;&#x679C;&#x8D77;&#x59CB;&#x4F4D;&#xFF0C;&#x914D;&#x5408;limit(int)&#x4F7F;&#x7528;</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     orderAsc(Property... properties)  <span class="comment">// &#x6392;&#x5E8F;&#xFF0C;&#x5347;&#x5E8F;</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     orderDesc(Property... properties)  <span class="comment">// &#x6392;&#x5E8F;&#xFF0C;&#x964D;&#x5E8F;</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     orderCustom(Property property, java.lang.String customOrderForProperty)  <span class="comment">// &#x6392;&#x5E8F;&#xFF0C;&#x81EA;&#x5B9A;&#x4E49;</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     orderRaw(java.lang.String rawOrder)  <span class="comment">// &#x6392;&#x5E8F;&#xFF0C;SQL &#x8BED;&#x53E5;</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     preferLocalizedStringOrder()  <span class="comment">// &#x672C;&#x5730;&#x5316;&#x5B57;&#x7B26;&#x4E32;&#x6392;&#x5E8F;&#xFF0C;&#x7528;&#x4E8E;&#x52A0;&#x5BC6;&#x6570;&#x636E;&#x5E93;&#x65E0;&#x6548;</span></span><br><span class="line">QueryBuilder<span class="params">&lt;T&gt;</span>     stringOrderCollation(java.lang.String stringOrderCollation)  <span class="comment">// &#x81EA;&#x5B9A;&#x4E49;&#x5B57;&#x7B26;&#x4E32;&#x6392;&#x5E8F;&#xFF0C;&#x9ED8;&#x8BA4;&#x4E0D;&#x533A;&#x5206;&#x5927;&#x5C0F;&#x5199;</span></span><br><span class="line"></span><br><span class="line">WhereCondition     and(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore)  <span class="comment">// &#x6761;&#x4EF6;&#xFF0C;AND &#x8FDE;&#x63A5;</span></span><br><span class="line">WhereCondition     or(WhereCondition cond1, WhereCondition cond2, WhereCondition... condMore)  <span class="comment">// &#x6761;&#x4EF6;&#xFF0C;OR &#x8FDE;&#x63A5;</span></span><br></pre></td></tr></tbody></table></figure><p>&#x793A;&#x4F8B;<br></p><figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">mAccountDao</span><span class="selector-class">.queryBuilder</span>()<span class="selector-class">.orderDesc</span>(<span class="selector-tag">Properties</span><span class="selector-class">.Date</span>)<span class="selector-class">.limit</span>(1)<span class="selector-class">.unique</span>()</span><br></pre></td></tr></tbody></table></figure><p></p><h3 id="DaoSession&#x5F02;&#x6B65;&#x64CD;&#x4F5C;"><a href="#DaoSession&#x5F02;&#x6B65;&#x64CD;&#x4F5C;" class="headerlink" title="DaoSession&#x5F02;&#x6B65;&#x64CD;&#x4F5C;"></a>DaoSession&#x5F02;&#x6B65;&#x64CD;&#x4F5C;</h3><figure class="highlight less"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">DaoSession</span>()<span class="selector-class">.startAsyncSession</span>()<span class="selector-class">.runInTx</span>(new Runnable() {</span><br><span class="line"></span><br><span class="line">    <span class="variable">@Override</span></span><br><span class="line">    public void run() {</span><br><span class="line">        <span class="comment">// insert</span></span><br><span class="line">        <span class="comment">// delete</span></span><br><span class="line">        <span class="comment">// update</span></span><br><span class="line"><span class="comment">// query</span></span><br><span class="line">    }</span><br><span class="line">});</span><br><span class="line"><span class="selector-tag">DaoSession</span><span class="selector-class">.startAsyncSession</span>()<span class="selector-class">.insertInTx</span></span><br><span class="line"><span class="selector-tag">DaoSession</span><span class="selector-class">.startAsyncSession</span>()<span class="selector-class">.deleteInTx</span></span><br><span class="line"><span class="selector-tag">DaoSession</span><span class="selector-class">.startAsyncSession</span>()<span class="selector-class">.updateInTx</span></span><br><span class="line"><span class="selector-tag">DaoSession</span><span class="selector-class">.startAsyncSession</span>()<span class="selector-class">.insertInTx</span></span><br><span class="line"><span class="selector-tag">DaoSession</span><span class="selector-class">.startAsyncSession</span>()<span class="selector-class">.insertOrReplaceInTx</span></span><br></pre></td></tr></tbody></table></figure><h3 id="DaoSession&#x589E;&#x5220;&#x6539;&#x67E5;"><a href="#DaoSession&#x589E;&#x5220;&#x6539;&#x67E5;" class="headerlink" title="DaoSession&#x589E;&#x5220;&#x6539;&#x67E5;"></a>DaoSession&#x589E;&#x5220;&#x6539;&#x67E5;</h3><figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// DaoSession &#x7684;&#x65B9;&#x6CD5;&#x8F6C;&#x6362;&#x6210; Dao &#x7684;&#x5BF9;&#x5E94;&#x65B9;&#x6CD5;&#x6267;&#x884C;</span></span><br><span class="line">&lt;T&gt; long     insert(T entity)</span><br><span class="line">&lt;T&gt; long     insertOrReplace(T entity)</span><br><span class="line">&lt;T&gt; void     delete(T entity)</span><br><span class="line">&lt;T&gt; void     deleteAll(java<span class="selector-class">.lang</span><span class="selector-class">.Class</span>&lt;T&gt; entityClass)</span><br><span class="line">&lt;T&gt; void     update(T entity)</span><br><span class="line">&lt;T,K&gt; T     load(java<span class="selector-class">.lang</span><span class="selector-class">.Class</span>&lt;T&gt; entityClass, K key)</span><br><span class="line">&lt;T,K&gt; java<span class="selector-class">.util</span><span class="selector-class">.List</span>&lt;T&gt;     loadAll(java<span class="selector-class">.lang</span><span class="selector-class">.Class</span>&lt;T&gt; entityClass)</span><br><span class="line">&lt;T&gt; QueryBuilder&lt;T&gt;     queryBuilder(java<span class="selector-class">.lang</span><span class="selector-class">.Class</span>&lt;T&gt; entityClass)</span><br><span class="line">&lt;T,K&gt; java<span class="selector-class">.util</span><span class="selector-class">.List</span>&lt;T&gt;     queryRaw(java<span class="selector-class">.lang</span><span class="selector-class">.Class</span>&lt;T&gt; entityClass, java<span class="selector-class">.lang</span><span class="selector-class">.String</span> where, java<span class="selector-class">.lang</span><span class="selector-class">.String</span>... selectionArgs)</span><br><span class="line">&lt;T&gt; void     refresh(T entity)</span><br></pre></td></tr></tbody></table></figure><h3 id="Query&#x91CD;&#x590D;&#x67E5;&#x8BE2;"><a href="#Query&#x91CD;&#x590D;&#x67E5;&#x8BE2;" class="headerlink" title="Query&#x91CD;&#x590D;&#x67E5;&#x8BE2;"></a>Query&#x91CD;&#x590D;&#x67E5;&#x8BE2;</h3><figure class="highlight glsl"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// QueryBuilder</span></span><br><span class="line">Query&lt;T&gt;     build()</span><br><span class="line">CursorQuery     buildCursor()</span><br><span class="line">CountQuery&lt;T&gt;     buildCount()</span><br><span class="line">DeleteQuery&lt;T&gt;     buildDelete()</span><br><span class="line"></span><br><span class="line"><span class="comment">// Query</span></span><br><span class="line"><span class="comment">// &#x8BBE;&#x7F6E;&#x67E5;&#x8BE2;&#x53C2;&#x6570;&#xFF0C;&#x4ECE; 0 &#x5F00;&#x59CB;</span></span><br><span class="line">Query&lt;T&gt;     setParameter(<span class="type">int</span> <span class="keyword">index</span>, java.lang.Object parameter)</span><br><span class="line">Query&lt;T&gt;     setParameter(<span class="type">int</span> <span class="keyword">index</span>, java.lang.Boolean parameter)</span><br><span class="line">Query&lt;T&gt;     setParameter(<span class="type">int</span> <span class="keyword">index</span>, java.util.Date parameter)</span><br><span class="line"><span class="type">void</span>     setLimit(<span class="type">int</span> limit)  <span class="comment">// &#x9650;&#x5236;&#x8FD4;&#x56DE;&#x6570;</span></span><br><span class="line"><span class="type">void</span>     setOffset(<span class="type">int</span> <span class="keyword">offset</span>)  <span class="comment">// &#x504F;&#x79FB;&#x7ED3;&#x679C;&#x8D77;&#x59CB;&#x4F4D;&#xFF0C;&#x914D;&#x5408;limit(int)&#x4F7F;&#x7528;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Query &#x7ED1;&#x5B9A;&#x7EBF;&#x7A0B;&#xFF0C;&#x6267;&#x884C;&#x975E;&#x672C;&#x7EBF;&#x7A0B;&#x7684; Query &#x629B;&#x5F02;&#x5E38;&#xFF0C;&#x8C03;&#x7528;&#x83B7;&#x53D6;&#x672C;&#x7EBF;&#x7A0B; Query</span></span><br><span class="line">Query&lt;T&gt;     forCurrentThread()  <span class="comment">// &#x83B7;&#x53D6;&#x672C;&#x7EBF;&#x7A0B; Query</span></span><br></pre></td></tr></tbody></table></figure><h3 id="&#x67E5;&#x8BE2;&#x7ED3;&#x679C;"><a href="#&#x67E5;&#x8BE2;&#x7ED3;&#x679C;" class="headerlink" title="&#x67E5;&#x8BE2;&#x7ED3;&#x679C;"></a>&#x67E5;&#x8BE2;&#x7ED3;&#x679C;</h3><figure class="highlight dts"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// QueryBuilder&#x3001;Query</span></span><br><span class="line">T     unique()  <span class="comment">// &#x8FD4;&#x56DE;&#x552F;&#x4E00;&#x7ED3;&#x679C;&#x6216;&#x8005; null</span></span><br><span class="line">T     uniqueOrThrow()  <span class="comment">// &#x8FD4;&#x56DE;&#x552F;&#x4E00;&#x975E;&#x7A7A;&#x7ED3;&#x679C;&#xFF0C;&#x5982;&#x679C; null &#x5219;&#x629B;&#x5F02;&#x5E38;</span></span><br><span class="line">java.util.List<span class="params">&lt;T&gt;</span>     list()  <span class="comment">// &#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x96C6;&#x8FDB;&#x5185;&#x5B58;</span></span><br><span class="line"><span class="comment">// &#x61D2;&#x52A0;&#x8F7D;&#xFF0C;&#x987B;&#x5728; try/finally &#x4EE3;&#x7801;&#x4E2D;&#x5173;&#x95ED;&#x3002;</span></span><br><span class="line">LazyList<span class="params">&lt;T&gt;</span>     listLazy()  <span class="comment">// &#x7B2C;&#x4E00;&#x6B21;&#x4F7F;&#x7528;&#x8FD4;&#x56DE;&#x7ED3;&#x679C;&#x96C6;&#xFF0C;&#x6240;&#x6709;&#x6570;&#x636E;&#x4F7F;&#x7528;&#x540E;&#x4F1A;&#x81EA;&#x52A8;&#x5173;&#x95ED;</span></span><br><span class="line">LazyList<span class="params">&lt;T&gt;</span>     listLazyUncached()  <span class="comment">// &#x8FD4;&#x56DE;&#x865A;&#x62DF;&#x7ED3;&#x679C;&#x96C6;&#xFF0C;&#x6570;&#x636E;&#x5E93;&#x8BFB;&#x53D6;&#x4E0D;&#x7F13;&#x5B58;</span></span><br><span class="line">CloseableListIterator<span class="params">&lt;T&gt;</span>     listIterator()  <span class="comment">// &#x61D2;&#x52A0;&#x8F7D;&#x6570;&#x636E;&#x8FED;&#x4EE3;&#x5668;&#xFF0C;&#x4E0D;&#x7F13;&#x5B58;&#xFF0C;&#x6240;&#x6709;&#x6570;&#x636E;&#x4F7F;&#x7528;&#x540E;&#x4F1A;&#x81EA;&#x52A8;&#x5173;&#x95ED;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// QueryBuilder&#x3001;CountQuery</span></span><br><span class="line">long     count()  <span class="comment">// &#x83B7;&#x53D6;&#x7ED3;&#x679C;&#x6570;&#x91CF;</span></span><br></pre></td></tr></tbody></table></figure><h1 id="&#x6DF7;&#x6DC6;"><a href="#&#x6DF7;&#x6DC6;" class="headerlink" title="&#x6DF7;&#x6DC6;"></a>&#x6DF7;&#x6DC6;</h1><p>&#x5728;&#x6DF7;&#x6DC6;&#x6587;&#x4EF6;proguard-rules.pro&#x4E2D;&#x6DFB;&#x52A0;</p><figure class="highlight scala"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">### greenDAO <span class="number">3</span></span><br><span class="line">-keepclassmembers <span class="class"><span class="keyword">class</span> <span class="title">*</span> <span class="keyword">extends</span> <span class="title">org</span>.<span class="title">greenrobot</span>.<span class="title">greendao</span>.<span class="title">AbstractDao</span> </span>{</span><br><span class="line">public static java.lang.<span class="type">String</span> <span class="type">TABLENAME</span>;</span><br><span class="line">}</span><br><span class="line">-keep <span class="class"><span class="keyword">class</span> <span class="title">**$Properties</span></span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">#</span> <span class="title">If</span> <span class="title">you</span> <span class="title">do</span> <span class="title">not</span> <span class="title">use</span> <span class="title">SQLCipher</span></span>:</span><br><span class="line">-dontwarn org.greenrobot.greendao.database.**</span><br><span class="line"># <span class="type">If</span> you do not use <span class="type">RxJava</span>:</span><br><span class="line">-dontwarn rx.**</span><br></pre></td></tr></tbody></table></figure><p><strong>@ToOne&#x3001;@ToMany&#xFF0C;1&#xFF1A;1&#x3001;1&#xFF1A;n&#x3001;n&#xFF1A;m&#x7B49;&#x591A;&#x5F20;&#x8868;&#x5173;&#x8054;&#x5F85;&#x7EED;^_^</strong></p><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/GreenDao.png&quot; alt=&quot;GreenDao&quot;&gt;&lt;/p&gt;
&lt;p&gt;GreenDao 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案。它的本质就是提供一个面向对象的接口，使得开发者更加方便地将数据存储到数据库SQLite之中。我们只需要定义数据模型，GreenDao就会为我们生成实体类以及DAOs(data access objects)，（在3.0之后不需要我们编写generator而是编写实体类并添加注解，GreenDao会为我们生成schema，以及DAOs）从而避免了开发者编写较多枯燥的数据存储和加载的代码。&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Android" scheme="https://tiimor.cn/tags/Android/"/>
    
      <category term="SQLite" scheme="https://tiimor.cn/tags/SQLite/"/>
    
      <category term="GreenDao" scheme="https://tiimor.cn/tags/GreenDao/"/>
    
  </entry>
  
  <entry>
    <title>Android适配器终结者？</title>
    <link href="https://tiimor.cn/Android%E9%80%82%E9%85%8D%E5%99%A8%E7%BB%88%E7%BB%93%E8%80%85%EF%BC%9F/"/>
    <id>https://tiimor.cn/Android适配器终结者？/</id>
    <published>2017-10-22T06:39:56.000Z</published>
    <updated>2019-03-17T06:47:42.368Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E7%94%A8%E4%BD%A0%E7%9A%84%E9%92%A5%E5%8C%99%EF%BC%8C%E6%89%93%E5%BC%80%E6%88%91%E7%9A%84%E5%BF%83%E6%89%89.jpg" alt="Android" title="&#x7528;&#x4F60;&#x7684;&#x94A5;&#x5319;&#xFF0C;&#x6253;&#x5F00;&#x6211;&#x7684;&#x5FC3;&#x6249;"></p><p><strong>&#x7EC8;&#x7ED3;Adapter&#x3001;ViewHolder&#xFF0C;&#x5C01;&#x88C5;&#x901A;&#x7528;&#x9002;&#x914D;&#x5668;</strong></p><a id="more"></a><font size="4"><strong><a href="https://github.com/VeiZhang/BaseToolsLibrary" target="_blank" rel="noopener">&#x9879;&#x76EE;&#x4F20;&#x9001;&#x95E8;</a></strong></font><figure class="highlight gradle"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">compile</span> <span class="string">&apos;com.excellence:basetools:1.2.4&apos;</span></span><br></pre></td></tr></tbody></table></figure><h1 id="Android&#x9002;&#x914D;&#x5668;"><a href="#Android&#x9002;&#x914D;&#x5668;" class="headerlink" title="Android&#x9002;&#x914D;&#x5668;"></a>Android&#x9002;&#x914D;&#x5668;</h1><p>&#x5728;Android&#x5F00;&#x53D1;&#x4E2D;&#xFF0C;&#x7ECF;&#x5E38;&#x4F7F;&#x7528;Adapter&#x548C;ViewHolder&#xFF0C;&#x603B;&#x662F;&#x5199;&#x7740;&#x5343;&#x7BC7;&#x4E00;&#x5F8B;&#x7684;&#x9002;&#x914D;&#x5668;&#x4EE3;&#x7801;&#xFF0C;&#x6240;&#x4EE5;&#x8FDB;&#x884C;&#x901A;&#x7528;&#x578B;&#x3001;&#x4E07;&#x80FD;&#x578B;&#x7684;Adapter&#x5C01;&#x88C5;&#x3002;</p><ul><li><p>MVVM&#x6A21;&#x5F0F;Adapter&#x5C01;&#x88C5;<br>&#x6700;&#x8FD1;&#x5B66;&#x4E60;MVVM&#xFF0C;&#x53D1;&#x73B0;&#x4E00;&#x7CFB;&#x5217;&#x4F18;&#x70B9;&#xFF0C;&#x9002;&#x914D;&#x5668;&#x5C01;&#x88C5;&#x4E5F;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x5E76;&#x4E14;&#x53EF;&#x4EE5;&#x8BA9;ViewHolder&#x53BB;&#x6B7B;&#x5427;&#xFF0C;&#x53EA;&#x7559;&#x4E0B;&#x53EF;&#x7231;&#x7684;Adapter&#xFF1B;&#x5F00;&#x542F;DataBinding&#xFF0C;&#x8FDB;&#x884C;&#x5C01;&#x88C5;&#x3002;</p></li><li><p>&#x666E;&#x901A;Adapter&#x5C01;&#x88C5;<br>&#x5176;&#x4ED6;&#x73AF;&#x5883;&#x4E0B;&#xFF1A;&#x4E0D;&#x5F00;&#x542F;DataBinding&#xFF0C;&#x5C01;&#x88C5;Adapter&#x548C;ViewHolder&#xFF0C;&#x4F7F;&#x7528;&#x65F6;&#x9700;&#x8981;&#x5B9E;&#x73B0;Adapter&#x7684;&#x62BD;&#x8C61;&#x63A5;&#x53E3;&#x3002;</p></li></ul><p><strong>&#x4EE5;&#x4E0A;&#x4E24;&#x79CD;&#x65B9;&#x5F0F;&#x90FD;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x5355;&#x5E03;&#x5C40;&#x7C7B;&#x578B;&#x3001;&#x591A;&#x5E03;&#x5C40;&#x7C7B;&#x578B;&#x7684;&#x9002;&#x914D;&#x5668;&#x3002;</strong></p><h1 id="Adapter&#x793A;&#x4F8B;"><a href="#Adapter&#x793A;&#x4F8B;" class="headerlink" title="Adapter&#x793A;&#x4F8B;"></a>Adapter&#x793A;&#x4F8B;</h1><p><img src="https://github.com/VeiZhang/BaseToolsLibrary/raw/master/images/common_adapter.png?raw=true" alt="&#x5355;&#x5E03;&#x5C40;&#x7C7B;&#x578B;" title="&#x5355;&#x5E03;&#x5C40;&#x7C7B;&#x578B;"></p><p><img src="https://github.com/VeiZhang/BaseToolsLibrary/raw/master/images/multi_adapter.png?raw=true" alt="&#x591A;&#x5E03;&#x5C40;&#x7C7B;&#x578B;" title="&#x591A;&#x5E03;&#x5C40;&#x7C7B;&#x578B;"></p><h2 id="MVVM&#x6A21;&#x5F0F;Adapter&#x793A;&#x4F8B;"><a href="#MVVM&#x6A21;&#x5F0F;Adapter&#x793A;&#x4F8B;" class="headerlink" title="MVVM&#x6A21;&#x5F0F;Adapter&#x793A;&#x4F8B;"></a>MVVM&#x6A21;&#x5F0F;Adapter&#x793A;&#x4F8B;</h2><h3 id="DataBinding&#xFF0C;ListVew&#x3001;GridView&#x9002;&#x914D;&#x5668;"><a href="#DataBinding&#xFF0C;ListVew&#x3001;GridView&#x9002;&#x914D;&#x5668;" class="headerlink" title="DataBinding&#xFF0C;ListVew&#x3001;GridView&#x9002;&#x914D;&#x5668;"></a>DataBinding&#xFF0C;ListVew&#x3001;GridView&#x9002;&#x914D;&#x5668;</h3><ul><li><p>&#x5355;&#x5E03;&#x5C40;&#x7C7B;&#x578B;<br><strong>&#x7B80;&#x5355;&#x5230;&#x7206;&#x70B8;&#x6709;&#x6728;&#x6709;!!!</strong></p><figure class="highlight jboss-cli"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">//</span> &#x76F4;&#x63A5;&#x521B;&#x5EFA;CommonBindingAdapter</span><br><span class="line">CommonBindingAdapter&lt;Flower&gt; adapter = new CommonBindingAdapter&lt;&gt;<span class="params">(mFlowers, R.layout.item_flower, BR.flower)</span>;</span><br><span class="line"><span class="string">//</span> &#x8BBE;&#x7F6E;&#x9002;&#x914D;&#x5668;&#xFF0C;&#x7B49;&#x540C;&#x4E8E;ListView.<span class="keyword">set</span>Adapter<span class="params">()</span>&#x3001;GridView.<span class="keyword">set</span>Adapter<span class="params">()</span></span><br><span class="line">mBinding.<span class="keyword">set</span>Adapter<span class="params">(adapter)</span>;</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x591A;&#x5E03;&#x5C40;&#x7C7B;&#x578B;<br>&#x4E3B;&#x8981;&#x662F;&#x5B9E;&#x73B0;&#x591A;&#x5E03;&#x5C40;&#x7C7B;&#x578B;&#x7684;<code>ViewDelegate</code>&#x7684;&#x63A5;&#x53E3;</p><figure class="highlight haxe"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x76F4;&#x63A5;&#x521B;&#x5EFA;MultiItemTypeBindingAdapter</span></span><br><span class="line">MultiItemTypeBindingAdapter&lt;Flower&gt; adapter = <span class="keyword">new</span> <span class="type">MultiItemTypeBindingAdapter</span>&lt;&gt;(mFlowers);</span><br><span class="line"><span class="comment">// &#x6DFB;&#x52A0;&#x591A;&#x5E03;&#x5C40;&#x7C7B;&#x578B;</span></span><br><span class="line">adapter.addItemViewDelegate(<span class="keyword">new</span> <span class="type">RoseViewDelegate</span>());</span><br><span class="line">adapter.addItemViewDelegate(<span class="keyword">new</span> <span class="type">TulipViewDelegate</span>());</span><br><span class="line"><span class="comment">// &#x8BBE;&#x7F6E;&#x9002;&#x914D;&#x5668;</span></span><br><span class="line">mBinding.setAdapter(adapter);</span><br></pre></td></tr></tbody></table></figure><p>  &#x5B9E;&#x73B0;<code>ItemViewDelegate</code>&#x7684;&#x63A5;&#x53E3;</p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">RoseViewDelegate</span> <span class="keyword">implements</span> <span class="title">ItemViewDelegate</span>&lt;<span class="title">Flower</span>&gt;</span></span><br><span class="line"><span class="class"></span>{</span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getItemViewLayoutId</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">return</span> R.layout.item_rose;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getItemVariable</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">return</span> BR.rose;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isForViewType</span><span class="params">(Flower item, <span class="keyword">int</span> position)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">return</span> item <span class="keyword">instanceof</span> Rose;</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ul><h3 id="DataBinding&#xFF0C;RecyclerView&#x9002;&#x914D;&#x5668;"><a href="#DataBinding&#xFF0C;RecyclerView&#x9002;&#x914D;&#x5668;" class="headerlink" title="DataBinding&#xFF0C;RecyclerView&#x9002;&#x914D;&#x5668;"></a>DataBinding&#xFF0C;RecyclerView&#x9002;&#x914D;&#x5668;</h3><p>&#x540C;&#x4E0A;</p><ul><li><p>&#x5355;&#x5E03;&#x5C40;&#x7C7B;&#x578B;</p><figure class="highlight haxe"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x76F4;&#x63A5;&#x521B;&#x5EFA;BaseRecyclerBindingAdapter</span></span><br><span class="line">BaseRecyclerBindingAdapter&lt;Flower&gt; adapter = <span class="keyword">new</span> <span class="type">BaseRecyclerBindingAdapter</span>&lt;&gt;(mFlowers, R.layout.item_flower, BR.flower);</span><br><span class="line"><span class="comment">// &#x8BBE;&#x7F6E;&#x9002;&#x914D;&#x5668;&#xFF0C;&#x7B49;&#x540C;&#x4E8E;RecyclerView.setAdapter()</span></span><br><span class="line">mBinding.setAdapter(adapter);</span><br><span class="line"><span class="comment">// &#x6CE8;&#x610F;&#x8BBE;&#x7F6E;LayoutManager&#xFF0C;&#x7B49;&#x540C;&#x4E8E;RecyclerView.setLayoutManager()</span></span><br><span class="line">mBinding.setLayoutManager(<span class="keyword">new</span> <span class="type">LinearLayoutManager</span>(<span class="built_in">this</span>));</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x591A;&#x5E03;&#x5C40;&#x7C7B;&#x578B;</p><figure class="highlight haxe"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">MultiItemTypeBindingRecyclerAdapter&lt;Flower&gt; adapter = <span class="keyword">new</span> <span class="type">MultiItemTypeBindingRecyclerAdapter</span>&lt;&gt;(mFlowers);</span><br><span class="line">adapter.addItemViewDelegate(<span class="keyword">new</span> <span class="type">RoseViewDelegate</span>());</span><br><span class="line">adapter.addItemViewDelegate(<span class="keyword">new</span> <span class="type">TulipViewDelegate</span>());</span><br><span class="line">mBinding.setAdapter(adapter);</span><br><span class="line">mBinding.setLayoutManager(<span class="keyword">new</span> <span class="type">LinearLayoutManager</span>(<span class="built_in">this</span>));</span><br></pre></td></tr></tbody></table></figure></li></ul><h2 id="&#x666E;&#x901A;Adapter&#x793A;&#x4F8B;"><a href="#&#x666E;&#x901A;Adapter&#x793A;&#x4F8B;" class="headerlink" title="&#x666E;&#x901A;Adapter&#x793A;&#x4F8B;"></a>&#x666E;&#x901A;Adapter&#x793A;&#x4F8B;</h2><h3 id="ListVew&#x3001;GridView&#x9002;&#x914D;&#x5668;"><a href="#ListVew&#x3001;GridView&#x9002;&#x914D;&#x5668;" class="headerlink" title="ListVew&#x3001;GridView&#x9002;&#x914D;&#x5668;"></a>ListVew&#x3001;GridView&#x9002;&#x914D;&#x5668;</h3><ul><li><p>&#x5355;&#x5E03;&#x5C40;&#x7C7B;&#x578B;<br>&#x5B9E;&#x73B0;<code>CommonAdapter</code>&#x7684;&#x63A5;&#x53E3;</p><figure class="highlight scala"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x521B;&#x5EFA;adapter&#x7C7B;&#x7EE7;&#x627F;CommonAdapter&#xFF0C;&#x7136;&#x540E;&#x8BBE;&#x7F6E;&#x9002;&#x914D;&#x5668;&#x5373;&#x53EF;</span></span><br><span class="line"><span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">AppGridAdapter</span> <span class="keyword">extends</span> <span class="title">CommonAdapter&lt;ResolveInfo&gt;</span></span></span><br><span class="line"><span class="class"></span>{</span><br><span class="line">    public <span class="type">AppGridAdapter</span>(<span class="type">Context</span> context, <span class="type">List</span>&lt;<span class="type">ResolveInfo</span>&gt; datas, int layoutId)</span><br><span class="line">    {</span><br><span class="line">        <span class="keyword">super</span>(context, datas, layoutId);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    public void convert(<span class="type">ViewHolder</span> viewHolder, <span class="type">ResolveInfo</span> item, int position)</span><br><span class="line">    {</span><br><span class="line"><span class="comment">// ViewHolder&#x5C01;&#x88C5;&#x4E86;&#x4E00;&#x4E9B;&#x8F85;&#x52A9;&#x65B9;&#x6CD5;&#xFF0C;&#x65B9;&#x4FBF;View&#x7684;&#x5404;&#x79CD;&#x8BBE;&#x7F6E;</span></span><br><span class="line">        <span class="type">ImageView</span> iconView = viewHolder.getView(android.<span class="type">R</span>.id.icon);</span><br><span class="line">        iconView.setImageDrawable(item.loadIcon(mPackageManager));</span><br><span class="line">        viewHolder.setText(android.<span class="type">R</span>.id.text1, item.loadLabel(mPackageManager).toString());</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x591A;&#x5E03;&#x5C40;&#x7C7B;&#x578B;<br>&#x5B9E;&#x73B0;<code>ItemViewDelegate</code>&#x63A5;&#x53E3;</p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x591A;&#x5E03;&#x5C40;&#x9002;&#x914D;&#x5668;</span></span><br><span class="line"><span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">ChatAdapter</span> <span class="keyword">extends</span> <span class="title">MultiItemTypeAdapter</span>&lt;<span class="title">People</span>&gt;</span></span><br><span class="line"><span class="class"></span>{</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">ChatAdapter</span><span class="params">(Context context, List&lt;People&gt; messages)</span></span></span><br><span class="line"><span class="function">    </span>{</span><br><span class="line">        <span class="keyword">super</span>(context, messages);</span><br><span class="line">        addItemViewDelegate(<span class="keyword">new</span> ComputerDelegate());</span><br><span class="line">        addItemViewDelegate(<span class="keyword">new</span> BlueDelegate());</span><br><span class="line">        addItemViewDelegate(<span class="keyword">new</span> PurpleDelegate());</span><br><span class="line">    }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x4E0D;&#x540C;&#x7684;&#x5E03;&#x5C40;&#x89C6;&#x56FE;</span></span><br><span class="line"><span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">ComputerDelegate</span> <span class="keyword">implements</span> <span class="title">ItemViewDelegate</span>&lt;<span class="title">People</span>&gt;</span></span><br><span class="line"><span class="class"></span>{</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getItemViewLayoutId</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>{</span><br><span class="line">        <span class="keyword">return</span> R.layout.item_computer;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isForViewType</span><span class="params">(People item, <span class="keyword">int</span> position)</span></span></span><br><span class="line"><span class="function">    </span>{</span><br><span class="line">        <span class="keyword">return</span> item <span class="keyword">instanceof</span> ComputerData;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">convert</span><span class="params">(ViewHolder viewHolder, People item, <span class="keyword">int</span> position)</span></span></span><br><span class="line"><span class="function">    </span>{</span><br><span class="line">        viewHolder.setText(R.id.computer_text, item.getMsg());</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ul><h3 id="RecyclerView&#x9002;&#x914D;&#x5668;"><a href="#RecyclerView&#x9002;&#x914D;&#x5668;" class="headerlink" title="RecyclerView&#x9002;&#x914D;&#x5668;"></a>RecyclerView&#x9002;&#x914D;&#x5668;</h3><ul><li><p>&#x5355;&#x5E03;&#x5C40;&#x7C7B;&#x578B;<br>&#x5B9E;&#x73B0;<code>BaseRecyclerAdapter</code>&#x7684;&#x63A5;&#x53E3;</p><figure class="highlight scala"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x521B;&#x5EFA;adapter&#x7C7B;&#x7EE7;&#x627F;BaseRecyclerAdapter</span></span><br><span class="line"><span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">AppRecyclerAdapter</span> <span class="keyword">extends</span> <span class="title">BaseRecyclerAdapter&lt;ResolveInfo&gt;</span></span></span><br><span class="line"><span class="class"></span>{</span><br><span class="line">    <span class="keyword">private</span> <span class="type">PackageManager</span> mPackageManager = <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line">    public <span class="type">AppRecyclerAdapter</span>(<span class="type">Context</span> context, <span class="type">List</span>&lt;<span class="type">ResolveInfo</span>&gt; datas, int layoutId)</span><br><span class="line">    {</span><br><span class="line">        <span class="keyword">super</span>(context, datas, layoutId);</span><br><span class="line">        mPackageManager = context.getPackageManager();</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    public void convert(<span class="type">RecyclerViewHolder</span> viewHolder, <span class="type">ResolveInfo</span> item, int position)</span><br><span class="line">    {</span><br><span class="line"><span class="comment">// ViewHolder&#x5C01;&#x88C5;&#x4E86;&#x4E00;&#x4E9B;&#x8F85;&#x52A9;&#x65B9;&#x6CD5;&#xFF0C;&#x65B9;&#x4FBF;View&#x7684;&#x5404;&#x79CD;&#x8BBE;&#x7F6E;</span></span><br><span class="line">        viewHolder.setText(android.<span class="type">R</span>.id.text1, item.loadLabel(mPackageManager));</span><br><span class="line">        viewHolder.setImageDrawable(android.<span class="type">R</span>.id.icon, item.loadIcon(mPackageManager));</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x591A;&#x5E03;&#x5C40;&#x7C7B;&#x578B;<br>&#x5B9E;&#x73B0;<code>ItemViewDelegate</code>&#x7684;&#x63A5;&#x53E3;</p><figure class="highlight java"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x591A;&#x5E03;&#x5C40;&#x9002;&#x914D;&#x5668;</span></span><br><span class="line"><span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">WarAdapter</span> <span class="keyword">extends</span> <span class="title">MultiItemTypeRecyclerAdapter</span>&lt;<span class="title">People</span>&gt;</span></span><br><span class="line"><span class="class"></span>{</span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">WarAdapter</span><span class="params">(Context context, List&lt;People&gt; datas)</span></span></span><br><span class="line"><span class="function">    </span>{</span><br><span class="line">        <span class="keyword">super</span>(context, datas);</span><br><span class="line">        addItemViewDelegate(<span class="keyword">new</span> ComputerRecyclerDelegate());</span><br><span class="line">        addItemViewDelegate(<span class="keyword">new</span> BlueRecyclerDelegate());</span><br><span class="line">        addItemViewDelegate(<span class="keyword">new</span> PurpleRecyclerDelegate());</span><br><span class="line">    }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x4E0D;&#x540C;&#x7684;&#x5E03;&#x5C40;&#x89C6;&#x56FE;</span></span><br><span class="line"><span class="keyword">private</span> <span class="class"><span class="keyword">class</span> <span class="title">ComputerRecyclerDelegate</span> <span class="keyword">implements</span> <span class="title">ItemViewDelegate</span>&lt;<span class="title">People</span>&gt;</span></span><br><span class="line"><span class="class"></span>{</span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">int</span> <span class="title">getItemViewLayoutId</span><span class="params">()</span></span></span><br><span class="line"><span class="function">    </span>{</span><br><span class="line">        <span class="keyword">return</span> R.layout.item_computer;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">isForViewType</span><span class="params">(People item, <span class="keyword">int</span> position)</span></span></span><br><span class="line"><span class="function">    </span>{</span><br><span class="line">        <span class="keyword">return</span> item <span class="keyword">instanceof</span> ComputerData;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="meta">@Override</span></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">convert</span><span class="params">(RecyclerViewHolder viewHolder, People item, <span class="keyword">int</span> position)</span></span></span><br><span class="line"><span class="function">    </span>{</span><br><span class="line">        viewHolder.setText(R.id.computer_text, item.getMsg());</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ul><font size="4"><strong>&#x6B22;&#x8FCE;star!!!</strong></font><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E7%94%A8%E4%BD%A0%E7%9A%84%E9%92%A5%E5%8C%99%EF%BC%8C%E6%89%93%E5%BC%80%E6%88%91%E7%9A%84%E5%BF%83%E6%89%89.jpg&quot; alt=&quot;Android&quot; title=&quot;用你的钥匙，打开我的心扉&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;终结Adapter、ViewHolder，封装通用适配器&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Android-Adapter" scheme="https://tiimor.cn/tags/Android-Adapter/"/>
    
      <category term="适配器终结者" scheme="https://tiimor.cn/tags/%E9%80%82%E9%85%8D%E5%99%A8%E7%BB%88%E7%BB%93%E8%80%85/"/>
    
  </entry>
  
  <entry>
    <title>Android6.0+动态权限管理</title>
    <link href="https://tiimor.cn/Android6-0-%E5%8A%A8%E6%80%81%E6%9D%83%E9%99%90%E7%AE%A1%E7%90%86/"/>
    <id>https://tiimor.cn/Android6-0-动态权限管理/</id>
    <published>2017-10-21T11:52:28.000Z</published>
    <updated>2019-03-17T06:47:42.354Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8Dlistener%20your%20heart.jpg" alt="Android" title="listener your heart"></p><p><strong>&#x5C01;&#x88C5;Android&#x4F9D;&#x8D56;&#x5E93;&#xFF0C;&#x65B9;&#x4FBF;Android6.0+&#x73AF;&#x5883;&#x4E0B;&#x52A8;&#x6001;&#x7533;&#x8BF7;&#x6743;&#x9650;&#x3002;</strong></p><a id="more"></a><p>Android6.0&#x4EE5;&#x540E;&#xFF0C;&#x4E00;&#x4E9B;&#x6743;&#x9650;&#x4E0D;&#x53EA;&#x662F;&#x901A;&#x8FC7;AndroidManifest&#x7533;&#x660E;&#xFF0C;&#x8FD8;&#x9700;&#x8981;&#x5728;&#x4EE3;&#x7801;&#x7533;&#x8BF7;&#xFF0C;&#x7CFB;&#x7EDF;&#x5F39;&#x51FA;&#x6743;&#x9650;&#x7533;&#x8BF7;&#x5F39;&#x6846;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x786E;&#x8BA4;&#x6388;&#x6743;&#xFF0C;&#x624D;&#x80FD;&#x4F7F;&#x7528;&#x8FD9;&#x4E9B;&#x6743;&#x9650;&#xFF0C;&#x5982;&#xFF1A;WRITE_EXTERNAL_STORAGE&#x3002;</p><h1 id="Android&#x6743;&#x9650;"><a href="#Android&#x6743;&#x9650;" class="headerlink" title="Android&#x6743;&#x9650;"></a>Android&#x6743;&#x9650;</h1><ul><li><p>&#x9700;&#x8981;&#x7533;&#x8BF7;&#x6743;&#x9650;<br>&#x9700;&#x8981;&#x7533;&#x8BF7;&#x7684;&#x6743;&#x9650;&#x5206;&#x4E3A;9&#x7EC4;&#xFF0C;&#x6BCF;&#x7EC4;&#x53EA;&#x8981;&#x6709;&#x4E00;&#x4E2A;&#x6743;&#x9650;&#x7533;&#x8BF7;&#x6210;&#x529F;&#xFF0C;&#x5C31;&#x9ED8;&#x8BA4;&#x6574;&#x7EC4;&#x6743;&#x9650;&#x90FD;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x3002;</p>  <figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line">group:android<span class="selector-class">.permission-group</span><span class="selector-class">.CONTACTS</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.WRITE_CONTACTS</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.GET_ACCOUNTS</span>    </span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.READ_CONTACTS</span></span><br><span class="line"></span><br><span class="line">group:android<span class="selector-class">.permission-group</span><span class="selector-class">.PHONE</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.READ_CALL_LOG</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.READ_PHONE_STATE</span> </span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.CALL_PHONE</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.WRITE_CALL_LOG</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.USE_SIP</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.PROCESS_OUTGOING_CALLS</span></span><br><span class="line">  permission:com<span class="selector-class">.android</span><span class="selector-class">.voicemail</span><span class="selector-class">.permission</span><span class="selector-class">.ADD_VOICEMAIL</span></span><br><span class="line"></span><br><span class="line">group:android<span class="selector-class">.permission-group</span><span class="selector-class">.CALENDAR</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.READ_CALENDAR</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.WRITE_CALENDAR</span></span><br><span class="line"></span><br><span class="line">group:android<span class="selector-class">.permission-group</span><span class="selector-class">.CAMERA</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.CAMERA</span></span><br><span class="line"></span><br><span class="line">group:android<span class="selector-class">.permission-group</span><span class="selector-class">.SENSORS</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.BODY_SENSORS</span></span><br><span class="line"></span><br><span class="line">group:android<span class="selector-class">.permission-group</span><span class="selector-class">.LOCATION</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.ACCESS_FINE_LOCATION</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.ACCESS_COARSE_LOCATION</span></span><br><span class="line"></span><br><span class="line">group:android<span class="selector-class">.permission-group</span><span class="selector-class">.STORAGE</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.READ_EXTERNAL_STORAGE</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.WRITE_EXTERNAL_STORAGE</span></span><br><span class="line"></span><br><span class="line">group:android<span class="selector-class">.permission-group</span><span class="selector-class">.MICROPHONE</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.RECORD_AUDIO</span></span><br><span class="line"></span><br><span class="line">group:android<span class="selector-class">.permission-group</span><span class="selector-class">.SMS</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.READ_SMS</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.RECEIVE_WAP_PUSH</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.RECEIVE_MMS</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.RECEIVE_SMS</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.SEND_SMS</span></span><br><span class="line">  permission:android<span class="selector-class">.permission</span><span class="selector-class">.READ_CELL_BROADCASTS</span></span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x666E;&#x901A;&#x6743;&#x9650;&#xFF0C;&#x5728;AndroidManifest.xml&#x4E2D;&#x7533;&#x660E;&#x5373;&#x53EF;</p>  <figure class="highlight stylus"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.ACCESS_LOCATION_EXTRA_COMMANDS</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.ACCESS_NETWORK_STATE</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.ACCESS_NOTIFICATION_POLICY</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.ACCESS_WIFI_STATE</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.ACCESS_WIMAX_STATE</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.BLUETOOTH</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.BLUETOOTH_ADMIN</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.BROADCAST_STICKY</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.CHANGE_NETWORK_STATE</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.CHANGE_WIFI_MULTICAST_STATE</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.CHANGE_WIFI_STATE</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.CHANGE_WIMAX_STATE</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.DISABLE_KEYGUARD</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.EXPAND_STATUS_BAR</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.FLASHLIGHT</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.GET_ACCOUNTS</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.GET_PACKAGE_SIZE</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.INTERNET</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.KILL_BACKGROUND_PROCESSES</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.MODIFY_AUDIO_SETTINGS</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.NFC</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.READ_SYNC_SETTINGS</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.READ_SYNC_STATS</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.RECEIVE_BOOT_COMPLETED</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.REORDER_TASKS</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.REQUEST_INSTALL_PACKAGES</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.SET_TIME_ZONE</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.SET_WALLPAPER</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.SET_WALLPAPER_HINTS</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.SUBSCRIBED_FEEDS_READ</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.TRANSMIT_IR</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.USE_FINGERPRINT</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.VIBRATE</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.WAKE_LOCK</span></span><br><span class="line">android<span class="selector-class">.permission</span><span class="selector-class">.WRITE_SYNC_SETTINGS</span></span><br><span class="line">com<span class="selector-class">.android</span><span class="selector-class">.alarm</span><span class="selector-class">.permission</span><span class="selector-class">.SET_ALARM</span></span><br><span class="line">com<span class="selector-class">.android</span><span class="selector-class">.launcher</span><span class="selector-class">.permission</span><span class="selector-class">.INSTALL_SHORTCUT</span></span><br><span class="line">com<span class="selector-class">.android</span><span class="selector-class">.launcher</span><span class="selector-class">.permission</span><span class="selector-class">.UNINSTALL_SHORTCUT</span></span><br></pre></td></tr></tbody></table></figure></li></ul><h1 id="&#x52A8;&#x6001;&#x7533;&#x8BF7;"><a href="#&#x52A8;&#x6001;&#x7533;&#x8BF7;" class="headerlink" title="&#x52A8;&#x6001;&#x7533;&#x8BF7;"></a>&#x52A8;&#x6001;&#x7533;&#x8BF7;</h1><ul><li><p>&#x8BBE;&#x7F6E;targetSdkVersion&#x4E3A;23&#x4EE5;&#x4E0A;</p></li><li><p>&#x5728;AndroidManifest.xml&#x4E2D;&#x7533;&#x660E;&#x9700;&#x8981;&#x7684;&#x6743;&#x9650;&#xFF0C;&#x5305;&#x62EC;&#x666E;&#x901A;&#x6743;&#x9650;&#x548C;&#x9700;&#x8981;&#x7533;&#x8BF7;&#x7684;&#x6743;&#x9650;</p></li><li><p>&#x5BF9;&#x4E8E;&#x7533;&#x8BF7;&#x7684;&#x6743;&#x9650;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x4EE3;&#x7801;&#x4E2D;&#x7533;&#x8BF7;</p><ol><li><p>&#x68C0;&#x6D4B;&#x6743;&#x9650;&#xFF0C;&#x4F7F;&#x7528;ContextCompat&#x53EF;&#x4EE5;&#x5728;&#x4EFB;&#x610F;&#x5730;&#x65B9;&#x4F7F;&#x7528;&#x8BE5;&#x65B9;&#x5F0F;</p><figure class="highlight gauss"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// &#x68C0;&#x6D4B;&#x6743;&#x9650;&#x662F;&#x5426;&#x88AB;&#x6388;&#x6743;</span></span><br><span class="line"><span class="keyword">if</span> (ContextCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED)</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x5982;&#x679C;&#x672A;&#x6388;&#x6743;&#xFF0C;&#x5219;<strong>&#x5FC5;&#x987B;&#x5728;Activity&#x4E2D;&#x7533;&#x8BF7;</strong></p><figure class="highlight css"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">Activity</span><span class="selector-class">.requestPermissions</span>()</span><br></pre></td></tr></tbody></table></figure><p><img src="https://github.com/VeiZhang/Permission/blob/master/imags/%E7%94%B3%E8%AF%B7%E6%9D%83%E9%99%90-%E7%B3%BB%E7%BB%9F%E5%BC%B9%E6%A1%86.png?raw=true" alt="icon_permission_request" title="&#x7533;&#x8BF7;&#x6743;&#x9650;-&#x7CFB;&#x7EDF;&#x5F39;&#x6846;"></p></li><li><p>&#x5982;&#x679C;&#x7528;&#x6237;&#x62D2;&#x7EDD;&#xFF0C;&#x5E76;&#x4E14;&#x70B9;&#x51FB;&#x4E86;&#x201C;&#x4E0D;&#x518D;&#x8BE2;&#x95EE;&#x201D;&#xFF0C;&#x5F53;&#x518D;&#x6B21;&#x4F7F;&#x7528;&#x6B65;&#x9AA4;2&#x7533;&#x8BF7;&#x65F6;&#xFF0C;&#x754C;&#x9762;&#x4E0A;&#x4E0D;&#x4F1A;&#x6709;&#x4EFB;&#x4F55;&#x53CD;&#x5E94;&#xFF0C;&#x56E0;&#x6B64;&#x9700;&#x8981;&#x5224;&#x65AD;&#x7528;&#x6237;&#x662F;&#x5426;&#x70B9;&#x51FB;&#x201C;&#x4E0D;&#x518D;&#x8BE2;&#x95EE;&#x201D;&#xFF0C;<strong>&#x5728;Activity&#x4E2D;</strong>&#x4F7F;&#x7528;<code>shouldShowRequestPermissionRationale</code>&#x65B9;&#x6CD5;&#x5224;&#x65AD;&#x3002;&#x7136;&#x540E;&#x81EA;&#x5B9A;&#x4E49;&#x5F39;&#x6846;&#x7ED9;&#x7528;&#x6237;&#xFF0C;&#x8BA9;&#x7528;&#x6237;&#x8FDB;&#x5165;Setting&#x5E94;&#x7528;&#x53BB;&#x5F00;&#x542F;&#x6743;&#x9650;&#x3002;<br><img src="https://github.com/VeiZhang/Permission/blob/master/imags/%E6%8B%92%E7%BB%9D-%E4%B8%8D%E5%86%8D%E8%AF%A2%E9%97%AE.png?raw=true" alt="icon_permission_denied" title="&#x62D2;&#x7EDD;-&#x4E0D;&#x518D;&#x8BE2;&#x95EE;"></p><p><img src="https://github.com/VeiZhang/Permission/blob/master/imags/%E4%B8%8D%E5%9C%A8%E8%AF%A2%E9%97%AE%E6%97%B6%EF%BC%8C%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BC%B9%E6%A1%86%E8%BF%9B%E5%85%A5Setting%E5%BA%94%E7%94%A8.png?raw=true" alt="icon_permission_no_remind" title="&#x4E0D;&#x5728;&#x8BE2;&#x95EE;&#x65F6;&#xFF0C;&#x81EA;&#x5B9A;&#x4E49;&#x5F39;&#x6846;&#x8FDB;&#x5165;Setting&#x5E94;&#x7528;"></p><p><img src="https://github.com/VeiZhang/Permission/blob/master/imags/Setting%E5%BA%94%E7%94%A8%E6%8E%88%E6%9D%83%E6%9D%83%E9%99%90.png?raw=true" alt="icon_permission_setting" title="Setting&#x5E94;&#x7528;&#x6388;&#x6743;&#x6743;&#x9650;"></p><p>&#x6CE8;&#x610F;&#xFF1A;&#x5BF9;&#x4E8E;&#x201C;&#x4E0D;&#x518D;&#x8BE2;&#x95EE;&#x201D;&#x7684;&#x7406;&#x89E3;&#xFF1A;</p><figure class="highlight yaml"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&#x5728;6.0&#x65F6;&#x4EE3;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x7A0B;&#x5E8F;&#x8FD0;&#x884C;&#x65F6;&#x83B7;&#x53D6;&#x76F8;&#x5173;&#x6743;&#x9650;&#xFF0C;&#x5C55;&#x5F00;&#x4E00;&#x4E2A;&#x5BF9;&#x8BDD;&#x6846;&#x8BE2;&#x95EE;&#x662F;&#x5426;&#x6388;&#x4E88;&#x8BE5;&#x7A0B;&#x5E8F;&#x76F8;&#x5E94;&#x6743;&#x9650;&#x3002;</span></span><br><span class="line"><span class="string">&#x4ECE;&#x7B2C;&#x4E8C;&#x6B21;&#x5F00;&#x59CB;&#x8FD0;&#x884C;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x4F1A;&#x589E;&#x52A0;&#x4E00;&#x4E2A;&#x9009;&#x9879;&#x6846;&#xFF0C;&#x201C;&#x4EE5;&#x540E;&#x4E0D;&#x518D;&#x8BE2;&#x95EE;&#x201D;&#xFF0C;&#x5982;&#x679C;&#x9009;&#x62E9;&#x4E86;&#x8FD9;&#x4E2A;&#x9009;&#x9879;&#xFF0C;&#x90A3;&#x4E48;&#x4EE5;&#x540E;&#x7A0B;&#x5E8F;&#x4E0D;&#x4F1A;&#x518D;&#x8BE2;&#x95EE;&#x662F;&#x5426;&#x6388;&#x4E88;&#x6743;&#x9650;&#x4E86;&#x3002;</span></span><br><span class="line"><span class="string">&#x8FD9;&#x65F6;&#x5019;&#x9009;&#x62E9;&#x4E86;&#x786E;&#x8BA4;&#x5012;&#x8FD8;&#x597D;&#xFF0C;&#x4E4B;&#x540E;&#x5012;&#x65B9;&#x4FBF;&#x4E86;&#x3002;</span></span><br><span class="line"><span class="string">&#x5982;&#x679C;&#x9009;&#x62E9;&#x4E86;&#x62D2;&#x7EDD;&#xFF0C;&#x90A3;&#x4E4B;&#x540E;&#x4E5F;&#x4E0D;&#x4F1A;&#x663E;&#x793A;&#x5BF9;&#x8BDD;&#x6846;&#xFF0C;&#x4F46;&#x662F;&#x6743;&#x9650;&#x4E00;&#x76F4;&#x662F;&#x62D2;&#x7EDD;&#x7684;&#x3002;&#x8FD9;&#x6837;&#x662F;&#x975E;&#x5E38;&#x4E0D;&#x597D;&#x7684;&#x4F53;&#x9A8C;&#xFF0C;&#x4E0D;&#x77E5;&#x9053;&#x7684;&#x8FD8;&#x4EE5;&#x4E3A;&#x7A0B;&#x5E8F;&#x5D29;&#x6E83;&#x4E86;&#x3002;</span></span><br><span class="line"><span class="string">&#x6240;&#x4EE5;&#xFF0C;&#x6211;&#x4EEC;&#x9700;&#x8981;&#x5728;&#x8FD9;&#x4E2A;&#x65F6;&#x5019;&#x4E5F;&#x663E;&#x793A;&#x76F8;&#x5E94;&#x5BF9;&#x8BDD;&#x6846;[&#x81EA;&#x5B9A;&#x4E49;&#x7684;&#x5BF9;&#x8BDD;&#x6846;]&#x6765;&#x544A;&#x8BC9;&#x7528;&#x6237;</span></span><br><span class="line"></span><br><span class="line"><span class="string">&#x7B2C;&#x4E00;&#x6B21;&#x8BF7;&#x6C42;&#x65F6;&#xFF0C;&#x8FD4;&#x56DE;false</span></span><br><span class="line"><span class="string">&#x5982;&#x679C;&#x5E94;&#x7528;&#x4E4B;&#x524D;&#x8BF7;&#x6C42;&#x8FC7;&#x6B64;&#x6743;&#x9650;&#x4F46;&#x7528;&#x6237;&#x62D2;&#x7EDD;&#x4E86;&#x8BF7;&#x6C42;&#xFF0C;&#x6B64;&#x65B9;&#x6CD5;&#x5C06;&#x8FD4;&#x56DE;</span> <span class="literal">true</span><span class="string">&#x3002;</span></span><br><span class="line"><span class="string">&#x6CE8;&#xFF1A;&#x5982;&#x679C;&#x7528;&#x6237;&#x5728;&#x8FC7;&#x53BB;&#x62D2;&#x7EDD;&#x4E86;&#x6743;&#x9650;&#x8BF7;&#x6C42;&#xFF0C;&#x5E76;&#x5728;&#x6743;&#x9650;&#x8BF7;&#x6C42;&#x7CFB;&#x7EDF;&#x5BF9;&#x8BDD;&#x6846;&#x4E2D;&#x9009;&#x62E9;&#x4E86;</span> <span class="string">Don&#x2019;t</span> <span class="string">ask</span> <span class="string">again</span> <span class="string">&#x9009;&#x9879;&#xFF0C;&#x6B64;&#x65B9;&#x6CD5;&#x5C06;&#x8FD4;&#x56DE;</span> <span class="literal">false</span><span class="string">&#x3002;</span></span><br><span class="line"><span class="string">&#x5982;&#x679C;&#x8BBE;&#x5907;&#x89C4;&#x8303;&#x7981;&#x6B62;&#x5E94;&#x7528;&#x5177;&#x6709;&#x8BE5;&#x6743;&#x9650;&#xFF0C;&#x6B64;&#x65B9;&#x6CD5;&#x4E5F;&#x4F1A;&#x8FD4;&#x56DE;</span> <span class="literal">false</span><span class="string">&#x3002;</span></span><br><span class="line"></span><br><span class="line"><span class="string">&#x5982;&#x679C;&#x60F3;&#x5224;&#x65AD;&#x662F;&#x5426;&#x62D2;&#x7EDD;&#x6743;&#x9650;&#xFF0C;&#x9700;&#x8981;&#x5728;&#x8BF7;&#x6C42;&#x4E00;&#x6B21;&#x4E4B;&#x540E;&#x7684;Failure&#x56DE;&#x8C03;&#x91CC;&#xFF0C;&#x518D;&#x6B21;&#x6267;&#x884C;shouldShowRequestPermissionRationale&#x65B9;&#x6CD5;&#xFF0C;&#x8FD4;&#x56DE;</span> <span class="literal">false</span><span class="string">&#x4E3A;&#x62D2;&#x7EDD;</span></span><br></pre></td></tr></tbody></table></figure></li></ol></li></ul><h1 id="&#x6743;&#x9650;&#x7533;&#x8BF7;&#x5C01;&#x88C5;&#x4F9D;&#x8D56;&#x5E93;"><a href="#&#x6743;&#x9650;&#x7533;&#x8BF7;&#x5C01;&#x88C5;&#x4F9D;&#x8D56;&#x5E93;" class="headerlink" title="&#x6743;&#x9650;&#x7533;&#x8BF7;&#x5C01;&#x88C5;&#x4F9D;&#x8D56;&#x5E93;"></a>&#x6743;&#x9650;&#x7533;&#x8BF7;&#x5C01;&#x88C5;&#x4F9D;&#x8D56;&#x5E93;</h1><p><strong><a href="https://github.com/VeiZhang/Permission" target="_blank" rel="noopener">Permission</a>&#xFF0C;&#x6B22;&#x8FCE;start!!!</strong></p><p>&#x5C06;&#x52A8;&#x6001;&#x7533;&#x8BF7;&#x6743;&#x9650;&#x7684;&#x6B65;&#x9AA4;&#x5C01;&#x88C5;&#x8D77;&#x6765;&#xFF0C;&#x65B9;&#x4FBF;&#x4F7F;&#x7528;&#xFF1A;</p><ul><li>&#x94FE;&#x5F0F;&#x7533;&#x8BF7;&#x548C;&#x56DE;&#x8C03;</li><li>&#x53EF;&#x5728;&#x4EFB;&#x4F55;&#x5730;&#x65B9;&#x8C03;&#x7528;&#xFF0C;&#x4E0D;&#x9650;&#x4E8E;Activity</li><li>&#x81EA;&#x5B9A;&#x4E49;&#x8FDB;&#x5165;Setting&#x5E94;&#x7528;&#x7684;&#x63D0;&#x793A;</li></ul><h2 id="&#x5F15;&#x5165;"><a href="#&#x5F15;&#x5165;" class="headerlink" title="&#x5F15;&#x5165;"></a>&#x5F15;&#x5165;</h2><figure class="highlight gradle"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">compile</span> <span class="string">&apos;com.excellence:permission:1.0.0&apos;</span></span><br></pre></td></tr></tbody></table></figure><h2 id="&#x4F7F;&#x7528;&#x793A;&#x4F8B;"><a href="#&#x4F7F;&#x7528;&#x793A;&#x4F8B;" class="headerlink" title="&#x4F7F;&#x7528;&#x793A;&#x4F8B;"></a>&#x4F7F;&#x7528;&#x793A;&#x4F8B;</h2><figure class="highlight aspectj"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * &#x7533;&#x8BF7;&#x5355;&#x4E2A;&#x6743;&#x9650;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> singleRequest()</span><br><span class="line">{</span><br><span class="line">    PermissionRequest.with(<span class="keyword">this</span>).permission(WRITE_EXTERNAL_STORAGE).request(<span class="keyword">new</span> IPermissionListener()</span><br><span class="line">    {</span><br><span class="line"></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">void</span> onPermissionsGranted()</span><br><span class="line">        {</span><br><span class="line">            Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">&quot;&#x7533;&#x8BF7;&#x5355;&#x4E2A;&#x6743;&#x9650;&#x6210;&#x529F;&quot;</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">        }</span><br><span class="line"></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">void</span> onPermissionsDenied()</span><br><span class="line">        {</span><br><span class="line">            Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">&quot;&#x7533;&#x8BF7;&#x5355;&#x4E2A;&#x6743;&#x9650;&#x5931;&#x8D25;&quot;</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">        }</span><br><span class="line">    });</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * &#x9009;&#x4E2D;&#x201C;&#x4E0D;&#x5728;&#x8BE2;&#x95EE;&#x201D;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x62D2;&#x7EDD;&#x65F6;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x663E;&#x793A;SettingDialog&#x7684;&#x5F39;&#x6846;&#xFF1B;</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * &#x53EF;&#x4EE5;&#x81EA;&#x5B9A;&#x4E49;&#x5F39;&#x6846;&#xFF0C;&#x63D0;&#x793A;&#x7528;&#x6237;&#x8FDB;&#x5165;Setting&#x5E94;&#x7528;&#xFF0C;&#x5728;rationale&#x76D1;&#x542C;&#x4E2D;&#x63D0;&#x793A;</span></span><br><span class="line"><span class="comment"> * &#x6CE8;&#x610F;&#xFF1A;&#x8BF7;&#x4F7F;&#x7528;PermissionActivity&#x7684;&#x5F15;&#x7528;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x5C06;&#x56DE;&#x8C03;&#x5168;&#x90E8;&#x5728;PermissionActivity&#x5904;&#x7406;&#x4E86;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> singleRequest()</span><br><span class="line">{</span><br><span class="line">PermissionRequest.with(<span class="keyword">this</span>).rationale(<span class="keyword">new</span> IRationaleListener()</span><br><span class="line">{</span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> OnRationale(<span class="keyword">final</span> PermissionActivity activity)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">new</span> SettingDialog(activity).setTitle(<span class="string">&quot;Warning&quot;</span>).setOnCancelListener(<span class="keyword">new</span> SettingDialog.OnCancelListener()</span><br><span class="line">{</span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> onCancel()</span><br><span class="line">{</span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * &#x70B9;&#x51FB;&#x53D6;&#x6D88;&#x65F6;&#xFF0C;&#x8BA4;&#x4E3A;&#x8BF7;&#x6C42;&#x5931;&#x8D25;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">activity.permissionsDenied();</span><br><span class="line">}</span><br><span class="line">}).show();</span><br><span class="line">}</span><br><span class="line">}).permission(WRITE_EXTERNAL_STORAGE).request(<span class="keyword">new</span> IPermissionListener()</span><br><span class="line">{</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> onPermissionsGranted()</span><br><span class="line">{</span><br><span class="line">Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">&quot;&#x7533;&#x8BF7;&#x5355;&#x4E2A;&#x6743;&#x9650;&#x6210;&#x529F;&quot;</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> onPermissionsDenied()</span><br><span class="line">{</span><br><span class="line">Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">&quot;&#x7533;&#x8BF7;&#x5355;&#x4E2A;&#x6743;&#x9650;&#x5931;&#x8D25;&quot;</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">}</span><br><span class="line">});</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * &#x7533;&#x8BF7;&#x591A;&#x4E2A;&#x6743;&#x9650;</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> multiRequest()</span><br><span class="line">{</span><br><span class="line">    PermissionRequest.with(<span class="keyword">this</span>).permission(READ_CONTACTS, CAMERA).request(<span class="keyword">new</span> IPermissionListener()</span><br><span class="line">    {</span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">void</span> onPermissionsGranted()</span><br><span class="line">        {</span><br><span class="line">            Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">&quot;&#x7533;&#x8BF7;&#x591A;&#x4E2A;&#x6743;&#x9650;&#x6210;&#x529F;&quot;</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">        }</span><br><span class="line"></span><br><span class="line">        <span class="meta">@Override</span></span><br><span class="line">        <span class="keyword">public</span> <span class="keyword">void</span> onPermissionsDenied()</span><br><span class="line">        {</span><br><span class="line">            Toast.makeText(MainActivity.<span class="keyword">this</span>, <span class="string">&quot;&#x7533;&#x8BF7;&#x591A;&#x4E2A;&#x6743;&#x9650;&#x5931;&#x8D25;&quot;</span>, Toast.LENGTH_SHORT).show();</span><br><span class="line">        }</span><br><span class="line">    });</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h1 id="&#x611F;&#x8C22;"><a href="#&#x611F;&#x8C22;" class="headerlink" title="&#x611F;&#x8C22;"></a>&#x611F;&#x8C22;</h1><ul><li><a href="https://github.com/yanzhenjie/AndPermission" target="_blank" rel="noopener">yanzhenjie</a></li><li><a href="https://github.com/tbruyelle/RxPermissions" target="_blank" rel="noopener">tbruyelle</a></li><li><a href="https://github.com/googlesamples/easypermissions" target="_blank" rel="noopener">googlesamples</a></li></ul><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8Dlistener%20your%20heart.jpg&quot; alt=&quot;Android&quot; title=&quot;listener your heart&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;封装Android依赖库，方便Android6.0+环境下动态申请权限。&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="Android联盟" scheme="https://tiimor.cn/categories/Android%E8%81%94%E7%9B%9F/"/>
    
    
      <category term="Android6.0+" scheme="https://tiimor.cn/tags/Android6-0/"/>
    
      <category term="动态权限" scheme="https://tiimor.cn/tags/%E5%8A%A8%E6%80%81%E6%9D%83%E9%99%90/"/>
    
  </entry>
  
  <entry>
    <title>Android-DIY-ShimmerTextView</title>
    <link href="https://tiimor.cn/Android-DIY-ShimmerTextView/"/>
    <id>https://tiimor.cn/Android-DIY-ShimmerTextView/</id>
    <published>2017-09-24T05:46:44.000Z</published>
    <updated>2019-03-17T06:47:42.353Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8Dandroid%E6%98%9F%E7%B3%BB.jpg" alt="Android" title="android&#x661F;&#x7CFB;"></p><p><strong>Android&#x81EA;&#x5B9A;&#x4E49;&#x63A7;&#x4EF6;&#xFF1A;&#x95EA;&#x70C1;&#x6587;&#x5B57;&#x6548;&#x679C;</strong></p><a id="more"></a><hr><p><a href="https://github.com/VeiZhang/DIY-TextView/blob/master/ShimmerTextView/src/main/java/com/excellence/shimmer/Widget/GradientTextView.java" target="_blank" rel="noopener">&#x6E90;&#x7801;&#x4F20;&#x9001;&#x95E8;</a></p><hr><h2 id="&#x6548;&#x679C;&#x5C55;&#x793A;"><a href="#&#x6548;&#x679C;&#x5C55;&#x793A;" class="headerlink" title="&#x6548;&#x679C;&#x5C55;&#x793A;"></a>&#x6548;&#x679C;&#x5C55;&#x793A;</h2><p><img src="https://github.com/VeiZhang/MyTextView/blob/master/images/ShimmerTextView.gif?raw=true" alt="ShimmerTextView"></p><h2 id="&#x8BB2;&#x89E3;"><a href="#&#x8BB2;&#x89E3;" class="headerlink" title="&#x8BB2;&#x89E3;"></a>&#x8BB2;&#x89E3;</h2><p>&#x4F7F;&#x7528;&#x7EBF;&#x6027;&#x6E32;&#x67D3;LinearGradient&#x8BBE;&#x7F6E;&#x753B;&#x7B14;&#x7684;&#x7740;&#x8272;&#x5668;Shader&#xFF0C;Matrix&#x7528;&#x4E8E;&#x5BF9;&#x56FE;&#x50CF;&#x7684;&#x56FE;&#x5F62;&#x5904;&#x7406;&#xFF0C;&#x7136;&#x540E;&#x4E0D;&#x505C;&#x7ED8;&#x5236;&#x6587;&#x672C;&#x3002;</p><figure class="highlight aspectj"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">protected</span> <span class="keyword">void</span> onSizeChanged(<span class="keyword">int</span> w, <span class="keyword">int</span> h, <span class="keyword">int</span> oldw, <span class="keyword">int</span> oldh)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">super</span>.onSizeChanged(w, h, oldw, oldh);</span><br><span class="line"><span class="keyword">if</span> (mViewWidth == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">mViewWidth = getMeasuredWidth();</span><br><span class="line"><span class="keyword">if</span> (mViewWidth &gt; <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">mPaint = getPaint();</span><br><span class="line"><span class="comment">// &#x8BBE;&#x7F6E;&#x7EBF;&#x6027;&#x6E32;&#x67D3;</span></span><br><span class="line">mLinearGradient = <span class="keyword">new</span> LinearGradient(-mViewWidth, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="keyword">new</span> <span class="keyword">int</span>[] { <span class="number">0x59ffffff</span>, <span class="number">0xffffffff</span>, <span class="number">0x59ffffff</span> }, <span class="keyword">new</span> <span class="keyword">float</span>[] { <span class="number">0</span>, <span class="number">0.5</span>f, <span class="number">1</span> }, Shader.TileMode.CLAMP);</span><br><span class="line"><span class="comment">// &#x8BBE;&#x7F6E;Paint&#x7740;&#x8272;&#x5668;</span></span><br><span class="line">mPaint.setShader(mLinearGradient);</span><br><span class="line">mGradientMatrix = <span class="keyword">new</span> Matrix();</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">protected</span> <span class="keyword">void</span> onDraw(Canvas canvas)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">super</span>.onDraw(canvas);</span><br><span class="line"><span class="keyword">if</span> (mGradientMatrix != <span class="keyword">null</span>)</span><br><span class="line">{</span><br><span class="line">mTranslate += mViewWidth / <span class="number">10</span>;</span><br><span class="line"><span class="keyword">if</span> (mTranslate &gt; <span class="number">2</span> * mViewWidth)</span><br><span class="line">{</span><br><span class="line">mTranslate = -mViewWidth;</span><br><span class="line">}</span><br><span class="line">mGradientMatrix.setTranslate(mTranslate, <span class="number">0</span>);</span><br><span class="line">mLinearGradient.setLocalMatrix(mGradientMatrix);</span><br><span class="line">postInvalidateDelayed(<span class="number">50</span>);</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8Dandroid%E6%98%9F%E7%B3%BB.jpg&quot; alt=&quot;Android&quot; title=&quot;android星系&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Android自定义控件：闪烁文字效果&lt;/strong&gt;&lt;/p&gt;
    
    </summary>
    
      <category term="DIY" scheme="https://tiimor.cn/categories/DIY/"/>
    
    
      <category term="Android" scheme="https://tiimor.cn/tags/Android/"/>
    
      <category term="自定义控件" scheme="https://tiimor.cn/tags/%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8E%A7%E4%BB%B6/"/>
    
  </entry>
  
  <entry>
    <title>Android热修复-Sophix</title>
    <link href="https://tiimor.cn/Android%E7%83%AD%E4%BF%AE%E5%A4%8D-Sophix/"/>
    <id>https://tiimor.cn/Android热修复-Sophix/</id>
    <published>2017-09-17T03:52:10.000Z</published>
    <updated>2019-03-17T06:47:42.366Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E7%94%BB%E4%B8%AD%E7%9A%84android.jpg" alt="Android" title="&#x753B;&#x4E2D;&#x7684;android"></p><p>&#x4EE5;&#x5F80;&#x5F53;Android App&#x51FA;&#x73B0;bug&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x751A;&#x81F3;&#x4EC5;&#x4EC5;&#x662F;&#x4FEE;&#x6539;&#x4E00;&#x884C;&#x4EE3;&#x7801;&#xFF0C;&#x90FD;&#x8981;&#x91CD;&#x65B0;&#x53D1;&#x5E03;&#x65B0;&#x7248;&#x672C;&#x5BF9;bug&#x8FDB;&#x884C;&#x4FEE;&#x590D;&#xFF0C;&#x8FD9;&#x6837;&#x5E26;&#x6765;&#x7684;&#x7F3A;&#x70B9;&#x662F;&#x660E;&#x663E;&#x7684;&#xFF0C;&#x9700;&#x8981;&#x7528;&#x6237;&#x91CD;&#x65B0;&#x5347;&#x7EA7;app&#xFF0C;&#x8986;&#x76D6;&#x7387;&#x592A;&#x6162;&#xFF0C;&#x6210;&#x672C;&#x592A;&#x9AD8;&#x3002;&#x6240;&#x4EE5;&#x5C31;&#x51FA;&#x73B0;&#x4E86;&#x70ED;&#x4FEE;&#x590D;&#x6280;&#x672F;&#xFF0C;&#x901A;&#x8FC7;&#x6253;&#x8865;&#x4E01;&#x7684;&#x65B9;&#x5F0F;&#xFF0C;&#x901A;&#x8FC7;&#x4ECE;&#x670D;&#x52A1;&#x5668;&#x4E0B;&#x8F7D;&#x8865;&#x4E01;&#x5305;&#xFF0C;&#x7136;&#x540E;&#x5BF9;&#x6709;&#x95EE;&#x9898;&#x7684;&#x7C7B;&#x4E2D;&#x51FA;&#x95EE;&#x9898;&#x7684;&#x65B9;&#x6CD5;&#xFF0C;&#x8FDB;&#x884C;&#x66FF;&#x6362;&#xFF0C;&#x4F18;&#x70B9;&#x662F;&#x7528;&#x6237;&#x65E0;&#x611F;&#x77E5;&#x4FEE;&#x590D;&#xFF0C;&#x65E0;&#x9700;&#x4E0B;&#x8F7D;&#x65B0;&#x7684;&#x5E94;&#x7528;&#xFF0C;&#x4EE3;&#x4EF7;&#x5C0F;&#x3002;&#x5BF9;&#x6BD4;&#x5176;&#x4ED6;&#x7684;&#x70ED;&#x4FEE;&#x590D;&#x65B9;&#x6848;&#xFF0C;<strong>&#x6765;&#x800D;&#x4E00;&#x800D;&#x963F;&#x91CC;-Sophix</strong> &#x3002;</p><a id="more"></a><h2 id="&#x4ECB;&#x7ECD;"><a href="#&#x4ECB;&#x7ECD;" class="headerlink" title="&#x4ECB;&#x7ECD;"></a>&#x4ECB;&#x7ECD;</h2><h3 id="&#x201C;&#x51B7;&#x70ED;&#x201D;"><a href="#&#x201C;&#x51B7;&#x70ED;&#x201D;" class="headerlink" title="&#x201C;&#x51B7;&#x70ED;&#x201D;"></a>&#x201C;&#x51B7;&#x70ED;&#x201D;</h3><ul><li><strong>&#x63D2;&#x4EF6;&#x5316;</strong> - apk &#x5206;&#x4E3A;&#x5BBF;&#x4E3B;&#x548C;&#x63D2;&#x4EF6;&#x90E8;&#x5206;&#xFF0C;&#x63D2;&#x4EF6;&#x5728;&#x9700;&#x8981;&#x7684;&#x65F6;&#x5019;&#x624D;&#x52A0;&#x8F7D;&#x8FDB;&#x6765;</li><li><strong>&#x70ED;&#x4FEE;&#x590D;</strong> &#x2013; &#x66F4;&#x65B0;&#x7684;&#x7C7B;&#x6216;&#x8005;&#x63D2;&#x4EF6;&#x7C92;&#x5EA6;&#x8F83;&#x5C0F;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x6211;&#x4EEC;&#x4F1A;&#x79F0;&#x4E4B;&#x4E3A;&#x70ED;&#x4FEE;&#x590D;&#xFF0C;&#x4E00;&#x822C;&#x7528;&#x4E8E;&#x4FEE;&#x590D;bug</li><li><strong>&#x70ED;&#x66F4;&#x65B0;</strong> &#x2013; 2016 Google &#x7684; Android Studio &#x63A8;&#x51FA;&#x4E86;Instant Run &#x529F;&#x80FD; &#x540C;&#x65F6;&#x63D0;&#x51FA;&#x4E86;3&#x4E2A;&#x540D;&#x8BCD;</li><li><strong>&#x70ED;&#x90E8;&#x7F72;</strong> &#x2013; &#x65B9;&#x6CD5;&#x5185;&#x7684;&#x7B80;&#x5355;&#x4FEE;&#x6539;&#xFF0C;&#x65E0;&#x9700;&#x91CD;&#x542F;app&#x548C;Activity&#x3002; </li><li><strong>&#x6696;&#x90E8;&#x7F72;</strong> &#x2013; app&#x65E0;&#x9700;&#x91CD;&#x542F;&#xFF0C;&#x4F46;&#x662F;activity&#x9700;&#x8981;&#x91CD;&#x542F;&#xFF0C;&#x6BD4;&#x5982;&#x8D44;&#x6E90;&#x7684;&#x4FEE;&#x6539;&#x3002; </li><li><strong>&#x51B7;&#x90E8;&#x7F72;</strong> &#x2013; app&#x9700;&#x8981;&#x91CD;&#x542F;&#xFF0C;&#x6BD4;&#x5982;&#x7EE7;&#x627F;&#x5173;&#x7CFB;&#x7684;&#x6539;&#x53D8;&#x6216;&#x65B9;&#x6CD5;&#x7684;&#x7B7E;&#x540D;&#x53D8;&#x5316;&#x7B49;&#x3002;</li></ul><h3 id="&#x70ED;&#x4FEE;&#x590D;&#x7279;&#x70B9;"><a href="#&#x70ED;&#x4FEE;&#x590D;&#x7279;&#x70B9;" class="headerlink" title="&#x70ED;&#x4FEE;&#x590D;&#x7279;&#x70B9;"></a>&#x70ED;&#x4FEE;&#x590D;&#x7279;&#x70B9;</h3><ul><li>&#x65E0;&#x9700;&#x91CD;&#x65B0;&#x53D1;&#x7248;&#xFF0C;&#x5B9E;&#x65F6;&#x9AD8;&#x6548;&#x70ED;&#x4FEE;&#x590D;</li><li>&#x7528;&#x6237;&#x65E0;&#x611F;&#x77E5;&#x4FEE;&#x590D;&#xFF0C;&#x65E0;&#x9700;&#x4E0B;&#x8F7D;&#x65B0;&#x7684;&#x5E94;&#x7528;&#xFF0C;&#x65E0;&#x9700;&#x91CD;&#x88C5;App&#xFF0C;&#x4EE3;&#x4EF7;&#x5C0F;</li><li>&#x4FEE;&#x590D;&#x6210;&#x529F;&#x7387;&#x9AD8;&#xFF0C;&#x628A;&#x635F;&#x5931;&#x964D;&#x5230;&#x6700;&#x4F4E;</li></ul><h3 id="&#x963F;&#x91CC;&#x70ED;&#x4FEE;&#x590D;&#x65B9;&#x6848;&#x5BF9;&#x6BD4;"><a href="#&#x963F;&#x91CC;&#x70ED;&#x4FEE;&#x590D;&#x65B9;&#x6848;&#x5BF9;&#x6BD4;" class="headerlink" title="&#x963F;&#x91CC;&#x70ED;&#x4FEE;&#x590D;&#x65B9;&#x6848;&#x5BF9;&#x6BD4;"></a>&#x963F;&#x91CC;&#x70ED;&#x4FEE;&#x590D;&#x65B9;&#x6848;&#x5BF9;&#x6BD4;</h3><table><thead><tr><th>&#x65B9;&#x6848;&#x5BF9;&#x6BD4;</th><th><a href="https://github.com/alibaba/AndFix" target="_blank" rel="noopener">Andfix&#x5F00;&#x6E90;&#x7248;&#x672C;</a></th><th>&#x963F;&#x91CC;Hotfix 1.X</th><th><a href="https://github.com/aliyun/alicloud-android-demo/tree/master/hotfix_android_demo" target="_blank" rel="noopener">&#x963F;&#x91CC;Hotfix&#x6700;&#x65B0;&#x7248; (Sophix)</a></th></tr></thead><tbody><tr><td>&#x65B9;&#x6CD5;&#x66FF;&#x6362;</td><td>&#x652F;&#x6301;&#xFF0C;&#x9664;&#x90E8;&#x5206;&#x60C5;&#x51B5;[0]</td><td>&#x652F;&#x6301;&#xFF0C;&#x9664;&#x90E8;&#x5206;&#x60C5;&#x51B5;</td><td>&#x5168;&#x90E8;&#x652F;&#x6301;</td></tr><tr><td>&#x65B9;&#x6CD5;&#x589E;&#x52A0;&#x51CF;&#x5C11;</td><td>&#x4E0D;&#x652F;&#x6301;</td><td>&#x4E0D;&#x652F;&#x6301;</td><td>&#x4EE5;&#x51B7;&#x542F;&#x52A8;&#x65B9;&#x5F0F;&#x652F;&#x6301;[1]</td></tr><tr><td>&#x65B9;&#x6CD5;&#x53CD;&#x5C04;&#x8C03;&#x7528;</td><td>&#x53EA;&#x652F;&#x6301;&#x9759;&#x6001;&#x65B9;&#x6CD5;</td><td>&#x53EA;&#x652F;&#x6301;&#x9759;&#x6001;&#x65B9;&#x6CD5;</td><td>&#x4EE5;&#x51B7;&#x542F;&#x52A8;&#x65B9;&#x5F0F;&#x652F;&#x6301;</td></tr><tr><td>&#x5373;&#x65F6;&#x751F;&#x6548;</td><td>&#x652F;&#x6301;</td><td>&#x652F;&#x6301;</td><td>&#x89C6;&#x60C5;&#x51B5;&#x652F;&#x6301;[2]</td></tr><tr><td>&#x591A;DEX</td><td>&#x4E0D;&#x652F;&#x6301;</td><td>&#x652F;&#x6301;</td><td>&#x652F;&#x6301;</td></tr><tr><td>&#x8D44;&#x6E90;&#x66F4;&#x65B0;</td><td>&#x4E0D;&#x652F;&#x6301;</td><td>&#x4E0D;&#x652F;&#x6301;</td><td>&#x652F;&#x6301;</td></tr><tr><td>so&#x5E93;&#x66F4;&#x65B0;</td><td>&#x4E0D;&#x652F;&#x6301;</td><td>&#x4E0D;&#x652F;&#x6301;</td><td>&#x652F;&#x6301;</td></tr><tr><td>Android&#x7248;&#x672C;</td><td>&#x652F;&#x6301;2.3~7.0</td><td>&#x652F;&#x6301;2.3~6.0</td><td>&#x5168;&#x90E8;&#x652F;&#x6301;&#x5305;&#x542B;7.0&#x4EE5;&#x4E0A;</td></tr><tr><td>&#x5DF2;&#x6709;&#x673A;&#x578B;</td><td>&#x5927;&#x90E8;&#x5206;&#x652F;&#x6301;[3]</td><td>&#x5927;&#x90E8;&#x5206;&#x652F;&#x6301;</td><td>&#x5168;&#x90E8;&#x652F;&#x6301;</td></tr><tr><td>&#x5B89;&#x5168;&#x673A;&#x5236;</td><td>&#x65E0;</td><td>&#x52A0;&#x5BC6;&#x4F20;&#x8F93;&#x53CA;&#x7B7E;&#x540D;&#x6821;&#x9A8C;</td><td>&#x52A0;&#x5BC6;&#x4F20;&#x8F93;&#x53CA;&#x7B7E;&#x540D;&#x6821;&#x9A8C;</td></tr><tr><td>&#x6027;&#x80FD;&#x635F;&#x8017;</td><td>&#x4F4E;&#xFF0C;&#x51E0;&#x4E4E;&#x65E0;&#x635F;&#x8017;</td><td>&#x4F4E;&#xFF0C;&#x51E0;&#x4E4E;&#x65E0;&#x635F;&#x8017;</td><td>&#x4F4E;&#xFF0C;&#x4EC5;&#x51B7;&#x542F;&#x52A8;&#x60C5;&#x51B5;&#x4E0B;&#x6709;&#x4E9B;&#x635F;&#x8017;</td></tr><tr><td>&#x751F;&#x6210;&#x8865;&#x4E01;</td><td>&#x7E41;&#x7410;&#xFF0C;&#x547D;&#x4EE4;&#x884C;&#x64CD;&#x4F5C;</td><td>&#x7E41;&#x7410;&#xFF0C;&#x547D;&#x4EE4;&#x884C;&#x64CD;&#x4F5C;</td><td>&#x4FBF;&#x6377;&#xFF0C;&#x56FE;&#x5F62;&#x5316;&#x754C;&#x9762;</td></tr><tr><td>&#x8865;&#x4E01;&#x5927;&#x5C0F;</td><td>&#x4E0D;&#x5927;&#xFF0C;&#x4EC5;&#x53D8;&#x52A8;&#x7684;&#x7C7B;</td><td>&#x5C0F;&#xFF0C;&#x4EC5;&#x53D8;&#x52A8;&#x7684;&#x65B9;&#x6CD5;</td><td>&#x4E0D;&#x5927;&#xFF0C;&#x4EC5;&#x53D8;&#x52A8;&#x7684;&#x8D44;&#x6E90;&#x548C;&#x4EE3;&#x7801;[4]</td></tr><tr><td>&#x670D;&#x52A1;&#x7AEF;&#x652F;&#x6301;</td><td>&#x65E0;</td><td>&#x652F;&#x6301;&#x670D;&#x52A1;&#x7AEF;&#x63A7;&#x5236;[5]</td><td>&#x652F;&#x6301;&#x670D;&#x52A1;&#x7AEF;&#x63A7;&#x5236;</td></tr></tbody></table><p>&#x8BF4;&#x660E;&#xFF1A;</p><ul><li>[0] &#x90E8;&#x5206;&#x60C5;&#x51B5;&#x6307;&#x7684;&#x662F;&#x6784;&#x9020;&#x65B9;&#x6CD5;&#x3001;&#x53C2;&#x6570;&#x6570;&#x76EE;&#x5927;&#x4E8E;8&#x6216;&#x8005;&#x53C2;&#x6570;&#x5305;&#x62EC;long,double,float&#x57FA;&#x672C;&#x7C7B;&#x578B;&#x7684;&#x65B9;&#x6CD5;&#x3002;</li><li>[1] &#x51B7;&#x542F;&#x52A8;&#x65B9;&#x5F0F;&#xFF0C;&#x6307;&#x7684;&#x662F;&#x9700;&#x8981;&#x91CD;&#x542F;app&#x5728;&#x4E0B;&#x6B21;&#x542F;&#x52A8;&#x65F6;&#x624D;&#x80FD;&#x751F;&#x6548;&#x3002; </li><li>[2] &#x5BF9;&#x4E8E;Andfix&#x53CA;Hotfix 1.X&#x80FD;&#x591F;&#x652F;&#x6301;&#x7684;&#x4EE3;&#x7801;&#x53D8;&#x52A8;&#x60C5;&#x51B5;&#xFF0C;&#x90FD;&#x80FD;&#x505A;&#x5230;&#x5373;&#x65F6;&#x751F;&#x6548;&#x3002;&#x800C;&#x5BF9;&#x4E8E;&#x5176;&#x4ED6;&#x4EE3;&#x7801;&#x53D8;&#x52A8;&#x8F83;&#x5927;&#x7684;&#x60C5;&#x51B5;&#xFF0C;&#x4F1A;&#x8D70;&#x51B7;&#x542F;&#x52A8;&#x65B9;&#x5F0F;&#xFF0C;&#x6B64;&#x65F6;&#x5C31;&#x65E0;&#x6CD5;&#x505A;&#x5230;&#x5373;&#x65F6;&#x751F;&#x6548;&#x3002; </li><li>[3] Hotfix 1.X&#x5DF2;&#x7ECF;&#x652F;&#x6301;&#x7EDD;&#x5927;&#x90E8;&#x5206;&#x4E3B;&#x6D41;&#x624B;&#x673A;&#xFF0C;&#x53EA;&#x662F;&#x5728;X86&#x8BBE;&#x5907;&#x4EE5;&#x53CA;&#x4FEE;&#x6539;&#x4E86;&#x865A;&#x62DF;&#x673A;&#x5E95;&#x5C42;&#x7ED3;&#x6784;&#x7684;ROM&#x4E0A;&#x4E0D;&#x652F;&#x6301;&#x3002; </li><li>[4] &#x7531;&#x4E8E;&#x652F;&#x6301;&#x4E86;&#x8D44;&#x6E90;&#x548C;&#x5E93;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x8FD9;&#x4E9B;&#x65B9;&#x9762;&#x7684;&#x66F4;&#x65B0;&#xFF0C;&#x5C31;&#x4F1A;&#x5BFC;&#x81F4;&#x7684;&#x8865;&#x4E01;&#x53D8;&#x5927;&#x4E00;&#x4E9B;&#xFF0C;&#x8FD9;&#x4E2A;&#x662F;&#x5F88;&#x6B63;&#x5E38;&#x7684;&#x3002;&#x5E76;&#x4E14;&#x7531;&#x4E8E;&#x53EA;&#x5305;&#x542B;&#x5DEE;&#x5F02;&#x7684;&#x90E8;&#x5206;&#xFF0C;&#x6240;&#x4EE5;&#x8865;&#x4E01;&#x5DF2;&#x7ECF;&#x662F;&#x6700;&#x5927;&#x7A0B;&#x5EA6;&#x7684;&#x5C0F;&#x4E86;&#x3002; </li><li>[5] &#x63D0;&#x4F9B;&#x670D;&#x52A1;&#x7AEF;&#x7684;&#x8865;&#x4E01;&#x53D1;&#x5E03;&#x548C;&#x505C;&#x53D1;&#x3001;&#x7248;&#x672C;&#x63A7;&#x5236;&#x548C;&#x7070;&#x5EA6;&#x529F;&#x80FD;&#xFF0C;&#x5B58;&#x50A8;&#x5F00;&#x53D1;&#x8005;&#x4E0A;&#x4F20;&#x7684;&#x8865;&#x4E01;&#x5305;&#x3002;</li></ul><h3 id="&#x5176;&#x4ED6;&#x70ED;&#x4FEE;&#x590D;&#x65B9;&#x6848;"><a href="#&#x5176;&#x4ED6;&#x70ED;&#x4FEE;&#x590D;&#x65B9;&#x6848;" class="headerlink" title="&#x5176;&#x4ED6;&#x70ED;&#x4FEE;&#x590D;&#x65B9;&#x6848;"></a>&#x5176;&#x4ED6;&#x70ED;&#x4FEE;&#x590D;&#x65B9;&#x6848;</h3><table><thead><tr><th>&#x65B9;&#x6848;</th><th>&#x4F5C;&#x8005;</th></tr></thead><tbody><tr><td><a href="https://github.com/Tencent/tinker" target="_blank" rel="noopener">Tinker</a></td><td>&#x5FAE;&#x4FE1;(apk&#x8865;&#x4E01;)</td></tr><tr><td><a href="https://github.com/Meituan-Dianping/Robust" target="_blank" rel="noopener">Robust</a></td><td>&#x7F8E;&#x56E2;</td></tr><tr><td><a href="https://github.com/eleme/Amigo" target="_blank" rel="noopener">Amigo</a></td><td>&#x997F;&#x4E86;&#x4E48;&#xFF08;apk&#x8865;&#x4E01;&#xFF09;</td></tr><tr><td><a href="https://github.com/jasonross/Nuwa" target="_blank" rel="noopener">Nuwa</a></td><td>&#x4E2A;&#x4EBA;&#x5F00;&#x53D1;&#x8005;</td></tr><tr><td><a href="https://github.com/alibaba/dexposed" target="_blank" rel="noopener">Dexposed</a></td><td></td></tr><tr><td><a href="https://github.com/dodola/RocooFix" target="_blank" rel="noopener">RocooFix</a></td><td>&#x4E2A;&#x4EBA;&#x5F00;&#x53D1;&#x8005;</td></tr></tbody></table><h2 id="&#x96C6;&#x6210;Sophix"><a href="#&#x96C6;&#x6210;Sophix" class="headerlink" title="&#x96C6;&#x6210;Sophix"></a>&#x96C6;&#x6210;Sophix</h2><h3 id="&#x6CE8;&#x518C;&#x963F;&#x91CC;&#x4E91;&#x8D26;&#x53F7;"><a href="#&#x6CE8;&#x518C;&#x963F;&#x91CC;&#x4E91;&#x8D26;&#x53F7;" class="headerlink" title="&#x6CE8;&#x518C;&#x963F;&#x91CC;&#x4E91;&#x8D26;&#x53F7;"></a>&#x6CE8;&#x518C;<a href="https://www.aliyun.com" target="_blank" rel="noopener">&#x963F;&#x91CC;&#x4E91;</a>&#x8D26;&#x53F7;</h3><p><strong><a href="https://help.aliyun.com/document_detail/53238.html?spm=5176.doc53240.3.2.xk9U86" target="_blank" rel="noopener">&#x521B;&#x5EFA;App&#x6587;&#x6863;&#x4F20;&#x9001;&#x95E8;</a></strong></p><ul><li>&#x6CE8;&#x518C;&#x5B8C;&#x5F00;&#x53D1;&#x8005;&#x8D26;&#x53F7;&#xFF0C;&#x6210;&#x529F;&#x767B;&#x5F55;&#x540E;&#x8FDB;&#x5165;&#x63A7;&#x5236;&#x53F0;&#xFF0C;&#x6DFB;&#x52A0;&#x79FB;&#x52A8;&#x70ED;&#x4FEE;&#x590D;&#x670D;&#x52A1;&#x3002;<br><img src="http://cdn.tiimor.cn/images/%E6%B7%BB%E5%8A%A0%E7%A7%BB%E5%8A%A8%E7%83%AD%E4%BF%AE%E5%A4%8D.png" alt="&#x6DFB;&#x52A0;&#x79FB;&#x52A8;&#x70ED;&#x4FEE;&#x590D;"></li></ul><ul><li><p>&#x5F00;&#x901A;&#x70ED;&#x4FEE;&#x590D;&#x670D;&#x52A1;&#x540E;&#xFF0C;&#x8DF3;&#x8F6C;&#x5230;&#x70ED;&#x4FEE;&#x590D;&#x4EA7;&#x54C1;&#x754C;&#x9762;-<strong>App&#x7BA1;&#x7406;</strong>&#xFF0C;&#x521B;&#x5EFA;App &#x201C;Sophix&#x6D4B;&#x8BD5;&#x201D;&#xFF0C;&#x521B;&#x5EFA;&#x5B8C;&#x6210;&#x540E;&#x4F1A;&#x51FA;&#x73B0;&#x4E24;&#x4E2A;&#x5E73;&#x53F0;&#x7684;App&#x5217;&#x8868;&#xFF1A;iOS&#x548C;Android<br><img src="http://cdn.tiimor.cn/images/Sophix%E6%B5%8B%E8%AF%95.png" alt="Sophix&#x6D4B;&#x8BD5;"></p></li><li><p>&#x70B9;&#x51FB;&#x7BA1;&#x7406;&#x8FDB;&#x5165;Android&#x5E73;&#x53F0;&#xFF0C;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#x91CC;&#xFF0C;&#x9700;&#x8981;&#x4F7F;&#x7528;&#x5230;AppId&#x3001;APPSecret&#x3001;RSA&#x5BC6;&#x94A5;<br><img src="http://cdn.tiimor.cn/images/Sophix%E5%BF%85%E8%A6%81%E4%BF%A1%E6%81%AF.png" alt="Sophix&#x5FC5;&#x8981;&#x4FE1;&#x606F;"></p></li></ul><h3 id="&#x5BA2;&#x6237;&#x7AEF;&#x96C6;&#x6210;"><a href="#&#x5BA2;&#x6237;&#x7AEF;&#x96C6;&#x6210;" class="headerlink" title="&#x5BA2;&#x6237;&#x7AEF;&#x96C6;&#x6210;"></a>&#x5BA2;&#x6237;&#x7AEF;&#x96C6;&#x6210;</h3><p><strong><a href="https://help.aliyun.com/document_detail/53240.html?spm=5176.doc53287.2.1.xLNLZz#1.1%20Android%20SDK%E5%8F%8A%E5%B7%A5%E5%85%B7%E4%B8%8B%E8%BD%BD" target="_blank" rel="noopener">Sophix&#x6587;&#x6863;&#x4F20;&#x9001;&#x95E8;</a></strong></p><ul><li><p>&#x5F15;&#x5165;maven&#x4F9D;&#x8D56;&#x4ED3;&#x5E93;<br>&#x5728;&#x9879;&#x76EE;app&#x4E0B;&#x7684;build.gradle&#x4E2D;&#x6DFB;&#x52A0;maven&#x4ED3;&#x5E93;&#x5730;&#x5740;&#x548C;&#x7248;&#x672C;&#x4F9D;&#x8D56;</p><ul><li><p>&#x6DFB;&#x52A0;maven&#x4ED3;&#x5E93;&#x5730;&#x5740;&#xFF1A;</p><figure class="highlight nginx"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">repositories</span> {</span><br><span class="line">   <span class="section">maven</span> {</span><br><span class="line">       <span class="attribute">url</span> <span class="string">&quot;http://maven.aliyun.com/nexus/content/repositories/releases&quot;</span></span><br><span class="line">   }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x6DFB;&#x52A0;&#x4F9D;&#x8D56;&#xFF1A;</p><figure class="highlight gradle"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">compile</span> <span class="string">&apos;com.aliyun.ams:alicloud-android-hotfix:3.1.2&apos;</span></span><br></pre></td></tr></tbody></table></figure></li></ul></li></ul><p><img src="http://cdn.tiimor.cn/images/%E5%BC%95%E5%85%A5Sophix%E4%BB%93%E5%BA%93.png" alt="&#x5F15;&#x5165;Sophix&#x4F9D;&#x8D56;"></p><ul><li><p>&#x6DFB;&#x52A0;&#x4F7F;&#x7528;&#x6743;&#x9650;</p><figure class="highlight applescript"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&lt;! <span class="comment">-- &#x7F51;&#x7EDC;&#x6743;&#x9650; --&gt;</span></span><br><span class="line">&lt;uses-permission android:<span class="built_in">name</span>=<span class="string">&quot;android.permission.INTERNET&quot;</span> /&gt;</span><br><span class="line">&lt;uses-permission android:<span class="built_in">name</span>=<span class="string">&quot;android.permission.ACCESS_NETWORK_STATE&quot;</span> /&gt;</span><br><span class="line">&lt;uses-permission android:<span class="built_in">name</span>=<span class="string">&quot;android.permission.ACCESS_WIFI_STATE&quot;</span> /&gt;</span><br><span class="line">&lt;! <span class="comment">-- &#x5916;&#x90E8;&#x5B58;&#x50A8;&#x8BFB;&#x6743;&#x9650;&#xFF0C;&#x8C03;&#x8BD5;&#x5DE5;&#x5177;&#x52A0;&#x8F7D;&#x672C;&#x5730;&#x8865;&#x4E01;&#x9700;&#x8981; --&gt;</span></span><br><span class="line">&lt;uses-permission android:<span class="built_in">name</span>=<span class="string">&quot;android.permission.READ_EXTERNAL_STORAGE&quot;</span>/&gt;</span><br></pre></td></tr></tbody></table></figure></li><li><p>&#x914D;&#x7F6E;AndroidManifest&#x6587;&#x4EF6;<br>&#x5728;application&#x8282;&#x70B9;&#x91CC;&#x6DFB;&#x52A0;&#x914D;&#x7F6E;&#xFF0C;&#x7528;&#x4E4B;&#x524D;&#x5728;&#x963F;&#x91CC;&#x4E91;&#x4E0A;&#x521B;&#x5EFA;&#x7684;App&#x7684;&#x914D;&#x7F6E;&#x4FE1;&#x606F;AppId&#x3001;APPSecret&#x3001;RSA&#x5BC6;&#x94A5;&#x66FF;&#x6362;value&#x7684;&#x503C;&#xFF1A;</p><figure class="highlight haskell"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&lt;application&gt;</span><br><span class="line">&lt;meta-<span class="class"><span class="keyword">data</span></span></span><br><span class="line">android:name=<span class="string">&quot;com.taobao.android.hotfix.IDSECRET&quot;</span></span><br><span class="line">android:value=<span class="string">&quot;App ID&quot;</span> /&gt;</span><br><span class="line">&lt;meta-<span class="class"><span class="keyword">data</span></span></span><br><span class="line">android:name=<span class="string">&quot;com.taobao.android.hotfix.APPSECRET&quot;</span></span><br><span class="line">android:value=<span class="string">&quot;App Secret&quot;</span> /&gt;</span><br><span class="line">&lt;meta-<span class="class"><span class="keyword">data</span></span></span><br><span class="line">android:name=<span class="string">&quot;com.taobao.android.hotfix.RSASECRET&quot;</span></span><br><span class="line">android:value=<span class="string">&quot;RSA&#x5BC6;&#x94A5;&quot;</span> /&gt;</span><br><span class="line">&#xB7;&#xB7;&#xB7;</span><br><span class="line">&lt;/application&gt;</span><br></pre></td></tr></tbody></table></figure></li></ul><p>&#x53EF;&#x53C2;&#x8003;&#x5B98;&#x65B9;&#x7684;&#x52A8;&#x56FE;&#x793A;&#x4F8B;&#xFF1A;<br><img src="http://cdn.tiimor.cn/images/gif-Sophix.gif" alt="gif-Sophix"></p><ul><li>Application&#x63A5;&#x5165;SDK<br>&#x5176;&#x4ED6;&#x63A5;&#x53E3;&#x4F7F;&#x7528;&#x8BF7;&#x67E5;&#x770B;SDK&#x6587;&#x6863;<figure class="highlight processing"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * &#x521D;&#x59CB;&#x5316;Sophix</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">private</span> <span class="keyword">void</span> initSophix()</span><br><span class="line">{</span><br><span class="line"><span class="keyword">String</span> appVersion;</span><br><span class="line"><span class="keyword">try</span></span><br><span class="line">{</span><br><span class="line">appVersion = getPackageManager().getPackageInfo(getPackageName(), <span class="number">0</span>).versionName;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">catch</span> (Exception e)</span><br><span class="line">{</span><br><span class="line">e.printStackTrace();</span><br><span class="line">appVersion = <span class="string">&quot;1.0.0&quot;</span>;</span><br><span class="line">}</span><br><span class="line">SophixManager.getInstance().setContext(<span class="keyword">this</span>).setAppVersion(appVersion).setAesKey(<span class="keyword">null</span>).setEnableDebug(<span class="keyword">true</span>).setPatchLoadStatusStub(<span class="keyword">new</span> PatchLoadStatusListener()</span><br><span class="line">{</span><br><span class="line">@Override</span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> onLoad(<span class="keyword">final</span> <span class="built_in">int</span> mode, <span class="keyword">final</span> <span class="built_in">int</span> code, <span class="keyword">final</span> <span class="keyword">String</span> info, <span class="keyword">final</span> <span class="built_in">int</span> handlePatchVersion)</span><br><span class="line">{</span><br><span class="line"><span class="comment">// &#x8865;&#x4E01;&#x52A0;&#x8F7D;&#x56DE;&#x8C03;&#x4FE1;&#x606F;</span></span><br><span class="line">StringBuilder msg = <span class="keyword">new</span> StringBuilder();</span><br><span class="line">msg.<span class="built_in">append</span>(<span class="string">&quot;Mode:&quot;</span>).<span class="built_in">append</span>(mode).<span class="built_in">append</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">msg.<span class="built_in">append</span>(<span class="string">&quot;Code:&quot;</span>).<span class="built_in">append</span>(code).<span class="built_in">append</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">msg.<span class="built_in">append</span>(<span class="string">&quot;Info:&quot;</span>).<span class="built_in">append</span>(info).<span class="built_in">append</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line">msg.<span class="built_in">append</span>(<span class="string">&quot;HandlePatchVersion:&quot;</span>).<span class="built_in">append</span>(handlePatchVersion).<span class="built_in">append</span>(<span class="string">&quot;\n&quot;</span>);</span><br><span class="line"><span class="keyword">if</span> (mDisplayListener != <span class="keyword">null</span>)</span><br><span class="line">mDisplayListener.handle(msg.toString());</span><br><span class="line"></span><br><span class="line"><span class="comment">// &#x8865;&#x4E01;&#x52A0;&#x8F7D;&#x56DE;&#x8C03;&#x901A;&#x77E5;</span></span><br><span class="line"><span class="keyword">switch</span> (code)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">case</span> PatchStatus.CODE_LOAD_SUCCESS:</span><br><span class="line"><span class="comment">// &#x8868;&#x660E;&#x8865;&#x4E01;&#x52A0;&#x8F7D;&#x6210;&#x529F;</span></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> PatchStatus.CODE_LOAD_RELAUNCH:</span><br><span class="line"><span class="comment">// &#x8868;&#x660E;&#x65B0;&#x8865;&#x4E01;&#x751F;&#x6548;&#x9700;&#x8981;&#x91CD;&#x542F;. &#x5F00;&#x53D1;&#x8005;&#x53EF;&#x63D0;&#x793A;&#x7528;&#x6237;&#x6216;&#x8005;&#x5F3A;&#x5236;&#x91CD;&#x542F;;</span></span><br><span class="line"><span class="comment">// &#x5EFA;&#x8BAE;: &#x7528;&#x6237;&#x53EF;&#x4EE5;&#x76D1;&#x542C;&#x8FDB;&#x5165;&#x540E;&#x53F0;&#x4E8B;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x8C03;&#x7528;killProcessSafely&#x81EA;&#x6740;</span></span><br><span class="line"><span class="comment">// &#x6CE8;&#x610F;&#xFF1A;&#x4E0D;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;Process.killProcess(Process.myPid())&#x6765;&#x6740;&#x8FDB;&#x7A0B;&#xFF0C;&#x8FD9;&#x6837;&#x4F1A;&#x6270;&#x4E71;Sophix&#x7684;&#x5185;&#x90E8;&#x72B6;&#x6001;&#x3002;</span></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> PatchStatus.CODE_LOAD_FAIL:</span><br><span class="line"><span class="comment">// &#x5185;&#x90E8;&#x5F15;&#x64CE;&#x5F02;&#x5E38;&#xFF0C;&#x63A8;&#x8350;&#x6B64;&#x65F6;&#x6E05;&#x7A7A;&#x672C;&#x5730;&#x8865;&#x4E01;&#xFF0C;&#x9632;&#x6B62;&#x5931;&#x8D25;&#x8865;&#x4E01;&#x91CD;&#x590D;&#x52A0;&#x8F7D;</span></span><br><span class="line">SophixManager.getInstance().cleanPatches();</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">default</span>:</span><br><span class="line"><span class="comment">// &#x5176;&#x5B83;&#x9519;&#x8BEF;&#x4FE1;&#x606F;&#xFF0C;&#x67E5;&#x770B;PatchStatus&#x7C7B;&#x8BF4;&#x660E;</span></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}).initialize();</span><br><span class="line"><span class="comment">// &#x52A0;&#x8F7D;&#x65B0;&#x7684;&#x8865;&#x4E01;&#x5305;</span></span><br><span class="line">SophixManager.getInstance().queryAndLoadNewPatch();</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></li></ul><p>&#x81F3;&#x6B64;&#xFF0C;Sophix&#x914D;&#x7F6E;&#x5B8C;&#x6210;&#x3002;</p><h3 id="&#x6D4B;&#x8BD5;"><a href="#&#x6D4B;&#x8BD5;" class="headerlink" title="&#x6D4B;&#x8BD5;"></a>&#x6D4B;&#x8BD5;</h3><ul><li>&#x5BA2;&#x6237;&#x7AEF;&#x7B2C;&#x4E00;&#x7248;&#x672C;&#xFF0C;&#x5982;&#x56FE;&#xFF0C;&#x6253;&#x5305;&#x6210;Sophix_V1.apk<br><img src="http://cdn.tiimor.cn/images/Sophix_V1.png" alt="Sophix_V1"></li></ul><ul><li><p>&#x5BA2;&#x6237;&#x7AEF;&#x8865;&#x4E01;&#x7248;&#x672C;&#xFF0C;&#x5982;&#x56FE;&#xFF0C;&#x6253;&#x5305;&#x6210;Sophix_V2.apk<br><img src="http://cdn.tiimor.cn/images/Sophix_V2.png" alt="Sophix_V2"></p></li><li><p>&#x751F;&#x6210;&#x8865;&#x4E01;&#xFF0C;<a href="https://help.aliyun.com/document_detail/53247.html?spm=5176.2020520107.0.0.719a83830VCANh" target="_blank" rel="noopener">&#x751F;&#x6210;&#x8865;&#x4E01;&#x6587;&#x6863;&#x4F20;&#x9001;&#x95E8;</a><br>Windows&#x4E0B;&#x8F7D;&#x963F;&#x91CC;&#x8865;&#x4E01;&#x5DE5;&#x5177;<a href="http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/SophixPatchTool_windows.zip?spm=5176.doc53247.2.2.lz640u&amp;file=SophixPatchTool_windows.zip" target="_blank" rel="noopener">SophixPatchTool</a>&#xFF0C;&#x8FD0;&#x884C;SophixPatchTool.exe&#xFF0C;&#x6DFB;&#x52A0;&#x5305;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x7B7E;&#x540D;&#x7B49;&#x8BBE;&#x7F6E;&#xFF0C;&#x5219;&#x70B9;&#x51FB;&#x8BBE;&#x7F6E;&#xFF0C;&#x914D;&#x7F6E;&#x76F8;&#x5E94;&#x7684;&#x7B7E;&#x540D;&#x7B49;&#xFF0C;&#x7136;&#x540E;&#x70B9;&#x51FB;&#x201C;Go&#x201D;&#xFF0C;&#x751F;&#x6210;&#x8865;&#x4E01;&#xFF0C;&#x5373;<strong>sophix-patch.jar</strong>&#xFF1A;<br><img src="http://cdn.tiimor.cn/images/Sophix%E8%A1%A5%E4%B8%81%E7%94%9F%E6%88%90.png" alt="Sophix&#x8865;&#x4E01;&#x751F;&#x6210;" title="&#x751F;&#x6210;&#x8865;&#x4E01;"></p></li><li><p>&#x4E0A;&#x4F20;&#x8865;&#x4E01;<br>&#x8FDB;&#x5165;&#x963F;&#x91CC;&#x4E91;&#x70ED;&#x4FEE;&#x590D;App&#x7BA1;&#x7406;&#x7684;Android&#x5E73;&#x53F0;&#x91CC;&#xFF0C;&#x5373;&#x67E5;&#x770B;AppId&#x3001;APPSecret&#x3001;RSA&#x5BC6;&#x94A5;&#x90A3;&#x4E2A;&#x9875;&#x9762;&#xFF0C;&#x6DFB;&#x52A0;&#x65B0;&#x7248;&#x672C;&#xFF0C;&#x6210;&#x529F;&#x6DFB;&#x52A0;&#x7248;&#x672C;&#x540E;&#xFF0C;&#x70B9;&#x51FB;&#x67E5;&#x770B;&#x8BE6;&#x60C5;&#x8FDB;&#x5165;&#xFF0C;&#x4E0A;&#x4F20;&#x521A;&#x521A;&#x751F;&#x6210;&#x7684;sophix-patch.jar&#x8865;&#x4E01;&#x3002;<br><img src="http://cdn.tiimor.cn/images/Sophix%E6%B7%BB%E5%8A%A0%E8%A1%A5%E4%B8%81%E7%89%88%E6%9C%AC.png" alt="Sophix&#x6DFB;&#x52A0;&#x8865;&#x4E01;&#x7248;&#x672C;" title="&#x6DFB;&#x52A0;&#x8865;&#x4E01;&#x7248;&#x672C;"><br><img src="http://cdn.tiimor.cn/images/Sophix%E4%B8%8A%E4%BC%A0%E8%A1%A5%E4%B8%81.png" alt="Sophix&#x4E0A;&#x4F20;&#x8865;&#x4E01;" title="&#x4E0A;&#x4F20;&#x8865;&#x4E01;"></p></li><li><p>&#x672C;&#x5730;&#x6D4B;&#x8BD5;<br>&#x5B89;&#x88C5;Sophix_V1.apk&#xFF0C;&#x540C;&#x65F6;&#x5C06;&#x8865;&#x4E01;sophix-patch.jar&#x653E;&#x5230;Android&#x8BBE;&#x5907;&#x7684;&#x76EE;&#x5F55;&#x91CC;&#xFF1A;<code>/sdcard/sophix-patch.jar</code>&#xFF0C;&#x4E0B;&#x8F7D;<a href="http://ams-hotfix-repo.oss-cn-shanghai.aliyuncs.com/hotfix_debug_tool-release.apk?spm=5176.2020520107.0.0.719a8383MbMrkQ&amp;file=hotfix_debug_tool-release.apk" target="_blank" rel="noopener">hotfixdebug</a>&#x5DE5;&#x5177;&#xFF0C;&#x5B89;&#x88C5;&#x540E;&#xFF0C;&#x6253;&#x5F00;&#x8FDB;&#x5165;&#x8C03;&#x8BD5;apk&#xFF0C;&#x914D;&#x7F6E;&#x5982;&#x4E0B;&#xFF1A;<br><img src="http://cdn.tiimor.cn/images/Sophix%E6%9C%AC%E5%9C%B0%E6%B5%8B%E8%AF%95.png" alt="Sophix&#x672C;&#x5730;&#x6D4B;&#x8BD5;"></p></li></ul><p>&#x6D4B;&#x8BD5;&#x6210;&#x529F;<br><img src="http://cdn.tiimor.cn/images/Sophix%E6%9C%AC%E5%9C%B0%E6%B5%8B%E8%AF%95%E6%88%90%E5%8A%9F.png" alt="Sophix&#x672C;&#x5730;&#x6D4B;&#x8BD5;&#x6210;&#x529F;"></p><ul><li>&#x53D1;&#x5E03;<br>&#x8FDB;&#x5165;&#x963F;&#x91CC;&#x4E91;&#x7684;&#x8865;&#x4E01;&#x8BE6;&#x60C5;&#x9875;&#x9762;&#xFF0C;&#x70B9;&#x51FB;&#x53D1;&#x5E03;&#x3002;&#x518D;&#x6B21;&#x8FDB;&#x884C;&#x8C03;&#x8BD5;&#xFF0C;&#x8FD9;&#x6B21;&#x4E0D;&#x7528;Sophix&#x8C03;&#x8BD5;&#x5DE5;&#x5177;&#xFF1B;&#x5148;&#x5378;&#x8F7D;&#x5DF2;&#x5B89;&#x88C5;&#x7684;Sophix_V1&#xFF0C;&#x91CD;&#x65B0;&#x5B89;&#x88C5;&#xFF0C;&#x6253;&#x5F00;&#x540E;&#x518D;&#x6B21;&#x7B49;&#x5F85;&#x68C0;&#x6D4B;&#x8865;&#x4E01;&#x66F4;&#x65B0;&#xFF0C;&#x518D;&#x6B21;&#x51FA;&#x73B0;&#x63D0;&#x793A;ok&#x3002;<br><img src="http://cdn.tiimor.cn/images/Sophix%E5%8F%91%E5%B8%83.png" alt="Sophix&#x53D1;&#x5E03;"></li></ul><h2 id="&#x63A8;&#x5E7F;"><a href="#&#x63A8;&#x5E7F;" class="headerlink" title="&#x63A8;&#x5E7F;"></a>&#x63A8;&#x5E7F;</h2><p>&#x6709;&#x5174;&#x8DA3;&#x7684;&#x7AE5;&#x978B;&#x53EF;&#x4EE5;&#x770B;&#x770B;&#x963F;&#x91CC;&#x51FA;&#x54C1;&#x7684;<strong><a href="http://note.youdao.com/noteshare?id=1c2b949de5e966ecaf37b363500e6491&amp;sub=3CAAE8571EC74E4B99C841DD208C23CC" target="_blank" rel="noopener">&#x70ED;&#x4FEE;&#x590D;&#x539F;&#x7406;&#x5B9D;&#x5178;</a></strong></p><script src="//cdn.bootcss.com/jquery.lazyload/1.9.1/jquery.lazyload.min.js"></script><div class="hexo-img-readStream"><style type="text/css">.hexo-image-stream-lazy {display:block;}.hexo-img-readStream{width:100%;max-width:1100px;margin:3% auto}div.hexo-img-readStream readItems{ background: #fefefe;box-shadow: 0 1px 2px rgba(34, 25, 25, 0.2);margin: 0 1% 3%;padding: 3%;padding-bottom: 9px;display: inline-block;max-width: 25%;}div.hexo-img-readStream readItems img{padding-bottom:10px;margin-top: 0.7em;}div.hexo-img-readStream readItems figcaption{font-size:.8rem;color:#999;line-height:1.5;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align: center;}div.hexo-img-readStream small{font-size:1rem;float:right;text-transform:uppercase;color:#aaa}div.hexo-img-readStream small a{color:#666;text-decoration:none;transition:.4s color}@media screen and (max-width:750px){.hexo-img-readStream{column-gap:0}}</style><readitems><a href="http://cdn.tiimor.cn/images/%E9%98%BF%E9%87%8C%E7%83%AD%E4%BF%AE%E5%A4%8D%E5%8E%9F%E7%90%86%E5%AE%9D%E5%85%B8.png" target="_blank" rel="external"><img class="hexo-image-stream-lazy nofancy" src="//ww4.sinaimg.cn/large/e724cbefgw1etyppy7bgwg2001001017.gif" data-original="http://cdn.tiimor.cn/images/%E9%98%BF%E9%87%8C%E7%83%AD%E4%BF%AE%E5%A4%8D%E5%8E%9F%E7%90%86%E5%AE%9D%E5%85%B8.png"><noscript><img src="http://cdn.tiimor.cn/images/%E9%98%BF%E9%87%8C%E7%83%AD%E4%BF%AE%E5%A4%8D%E5%8E%9F%E7%90%86%E5%AE%9D%E5%85%B8.png"></noscript></a><figcaption><a href="http://note.youdao.com/noteshare?id=1c2b949de5e966ecaf37b363500e6491&amp;sub=3CAAE8571EC74E4B99C841DD208C23CC" target="_blank" rel="external" id="favorite">&#x963F;&#x91CC;&#x70ED;&#x4FEE;&#x590D;&#x539F;&#x7406;&#x5B9D;&#x5178;</a></figcaption></readitems> </div><script type="text/javascript">$('img.hexo-image-stream-lazy').lazyload({ effect:'fadeIn' });</script><script>        document.querySelectorAll('.github-emoji')          .forEach(el => {            if (!el.dataset.src) { return; }            const img = document.createElement('img');            img.style = 'display:none !important;';            img.src = el.dataset.src;            img.addEventListener('error', () => {              img.remove();              el.style.color = 'inherit';              el.style.backgroundImage = 'none';              el.style.background = 'none';            });            img.addEventListener('load', () => {              img.remove();            });            document.body.appendChild(img);          });      </script>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://cdn.tiimor.cn/images/%E5%94%AF%E7%BE%8E%E7%AF%87%EF%BC%8D%E7%94%BB%E4%B8%AD%E7%9A%84android.jpg&quot; alt=&quot;Android&quot; title=&quot;画中的android&quot;&gt;&lt;/p&gt;
&lt;p&gt;以往当Android App出现bug的时候，甚至仅仅是修改一行代码，都要重新发布新版本对bug进行修复，这样带来的缺点是明显的，需要用户重新升级app，覆盖率太慢，成本太高。所以就出现了热修复技术，通过打补丁的方式，通过从服务器下载补丁包，然后对有问题的类中出问题的方法，进行替换，优点是用户无感知修复，无需下载新的应用，代价小。对比其他的热修复方案，&lt;strong&gt;来耍一耍阿里-Sophix&lt;/strong&gt; 。&lt;/p&gt;
    
    </summary>
    
      <category term="好好学习" scheme="https://tiimor.cn/categories/%E5%A5%BD%E5%A5%BD%E5%AD%A6%E4%B9%A0/"/>
    
    
      <category term="Android" scheme="https://tiimor.cn/tags/Android/"/>
    
      <category term="热修复" scheme="https://tiimor.cn/tags/%E7%83%AD%E4%BF%AE%E5%A4%8D/"/>
    
      <category term="Sophix" scheme="https://tiimor.cn/tags/Sophix/"/>
    
  </entry>
  
</feed>
