AndroidStudio封装SDK的那些事

<div class="markdown_views"> <!-- flowchart 箭头图标 勿删 --> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg> <blockquote> <p>来自本身简书博客:原文地址:<a href="https://www.jianshu.com/p/4d092c915ef1" rel="nofollow" target="_blank">https://www.jianshu.com/p/4d092c915ef1</a></p> </blockquote>java

<p>首先SDK是提供给别人调用的工具。因此常见的SDK都是以jar包,so库,aar包等方式导入APP项目中。而后提供一些公开的API供接入方调用。因此在Androidstudio中若是须要生成jar或者aar,就须要将module变成library。</p>android

<h4 id="1androidstudio生成library">一、AndroidStudio生成library</h4>git

<p>在这里介绍AndroidStudio两种生成library的方式。</p>github

<h5 id="11两种生成library的方式">1.一、两种生成library的方式</h5>web

<h6 id="新建library-module">新建library module。</h6>api

<p><img src="https://upload-images.jianshu.io/upload_images/1930161-bba4e6334023588a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" title=""> <br> 这种会直接生成可编译成jar和aar的module。</p>bash

<h6 id="新建android项目而后修改app下的buildgradle">新建Android项目,而后修改app下的build.gradle</h6>markdown

<p><img src="https://upload-images.jianshu.io/upload_images/1930161-890e340522780980.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" title=""></p>app

<p>将 <code>apply plugin: 'com.android.application'</code>修改为<code>apply plugin: 'com.android.library'</code> <br> 而后去掉<code>applicationId "com.mg.axe.helloworld"</code>就把可运行的Android module变成了一个library module。 <br> <strong>注意:这种方式在编译前必定要作如下事情</strong> <br> * 删除自定义的Application和在AndroidManifest.xml的配置。 <br> * 去点入口的Activity,不然在Android Studio接入时会生成两个图标入口。</p>eclipse

<h5 id="11使用gradle所带的命令编译">1.一、使用gradle所带的命令编译</h5>

<p>这些命令能够本身在控制台使用,能够直接点开右上角的Gradle直接使用。 <br> <img src="https://upload-images.jianshu.io/upload_images/1930161-c1bb96df76855c35.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" title=""></p>

<ul> <li><strong>assembleRelease</strong>&amp;<strong>assembleDebug</strong> </li> </ul>

<p><img src="https://upload-images.jianshu.io/upload_images/1930161-0ba017df99ed59d9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" title=""> <br> 在build下的assembleRelease和assembleDebug均可以生成aar包。这边和APP开发很类似,能够在buildTypes下对release包作混淆等等操做。</p>

<p>若是编译的命令执行完毕,能够在当前module下的build文件下找到编译好的.aar文件。 <br> <img src="https://upload-images.jianshu.io/upload_images/1930161-ae5355ade2502e4c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" title=""> <br> 若是须要jar包,则只需将这个aar文件解压便可。 <br> <img src="https://upload-images.jianshu.io/upload_images/1930161-91e77aff157042f2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" title=""> <br> classes.jar就是编译成jar的class文件。</p>

<h5 id="12aar和jar">1.二、aar和jar</h5>

<ul> <li><p>.aar是适用于AndroidStudio的接入方式,不须要过多的考虑当SDK存在界面,图片等资源文件的状况。解压aar也能够看到,aar是一个将源码(jar)和资源文件都打包好的文件。固然也能够在eclipse中使用,前提是eclipse须要安装gradle编译环境。</p></li> <li><p>jar只包含编译好的源代码,若是SDK包含资源文件,则须要额外导入,适用于eclipse导入;AndroidStudio也一样适用,不过当SDK包含资源文件时,导入aar将会更方便。</p></li> </ul>

<h4 id="2两种接入方式">二、两种接入方式</h4>

<p>通常状况接入方式为AndroidStudio和Eclipse。其余的接入方式就不考虑了,可能大同小异,最主要的是其余的接入方式我也不会。 <br> <img src="https://upload-images.jianshu.io/upload_images/1930161-aee57be922bc3c13.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="手动滑稽" title=""></p>

<h5 id="21androidstudio接入方式">2.一、AndroidStudio接入方式</h5>

<p>这里只介绍.aar的接入方式,AndroidStudio接入jar方式就不作介绍。 <br> * 将.aar文件复制到项目的libs中。 <br> * 并在app下的build.gradle中的android中添加以下代码 </p>

<pre class="prettyprint" name="code"><code class="hljs bash has-numbering">repositories{ flatDir { <span class="hljs-built_in">dirs</span> <span class="hljs-string">'libs'</span> } }</code></pre>

<ul> <li>在dependencies中添加依赖的代码</li> </ul>

<pre class="prettyprint" name="code"><code class="hljs bash has-numbering"> // implementation(name: <span class="hljs-string">'aar包的名字'</span>, ext: <span class="hljs-string">'aar'</span>) implementation(name: <span class="hljs-string">'game_sdk'</span>, ext: <span class="hljs-string">'aar'</span>)</code></pre>

<p>而后点击同步(Sync Now),就成功的将.arr导入项目了。</p>

<p>能够在External Libraries中找到导入的aar依赖。 <br> <img src="https://upload-images.jianshu.io/upload_images/1930161-9014cf4f859fa5a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" title=""></p>

<p><img src="https://upload-images.jianshu.io/upload_images/1930161-2224b0905f66ad49.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="image.png" title=""> <br> 点开aar,能够看(源代码)jar和(资源文件)res。</p>

<h5 id="22eclipse接入方式">2.二、Eclipse接入方式</h5>

<p>eclipse通常是接入jar包的方式接入SDK,当SDK存在界面、资源文件时,接入方式比AndroidStudio接入aar稍微麻烦点,须要将jar包和资源文件分开导入。 <br> * 解压aar文件。 <br> * 将jar包复制到libs文件加下,并添加依赖(add to path) 。 <br> * 若是有资源文件,则须要将res下的资源文件复制到项目对应的位置。 <br> * 若是SDK用到了Activity等组件,还需去注册等,这些都应在SDK接入文档中指明清楚。</p>

<h5 id="23两种接入方式都须要注意的问题">2.三、两种接入方式都须要注意的问题</h5>

<p>在SDK中声明的权限,制定的Android版本范围等都要在SDK接入文档中指明清楚。</p>

<h4 id="3可能踩的坑">三、可能踩的坑</h4>

<h5 id="31资源文件没法获取的问题">3.一、资源文件没法获取的问题。</h5>

<p>若是编译好的jar中使用了资源文件,而后使用了R.xx.xx这样的代码,可能会出现这样的异常。</p>

<pre class="prettyprint" name="code"><code class="hljs http has-numbering"><span class="hljs-attribute">java.lang.NoClassDefFoundError</span>: <span class="hljs-string">Failed resolution of: Lcom/ysyc/axechen/R$id</span></code></pre>

<p>找不到id。最后是参照开源的TypeSDK才解决了这个问题。经过以下的方法去寻找id。</p>

<pre class="prettyprint" name="code"><code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> GetResId { <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">int</span> <span class="hljs-title">getId</span>(Context context, String paramString1, String paramString2) { <span class="hljs-keyword">return</span> context.getResources().getIdentifier(paramString2, paramString1, context.getPackageName()); } }</code></pre>

<p>加载布局和控件的方法:</p>

<pre class="prettyprint" name="code"><code class="hljs cs has-numbering"><span class="hljs-comment">// 获取布局id</span> GetResId.getId(<span class="hljs-keyword">this</span>, <span class="hljs-string">"layout"</span>, <span class="hljs-string">"activity_main"</span>) <span class="hljs-comment">// 获取控件id</span> GetResId.getId(<span class="hljs-keyword">this</span>, <span class="hljs-string">"id"</span>, <span class="hljs-string">"login"</span>)</code></pre>

<h5 id="32三方包冲突问题">3.二、三方包冲突问题</h5>

<p>若是SDK用到了三方库,而后接入方的项目中也用到了一样的三方库,那么当编译的时候就会出现类冲突,没法编译经过。这个时候就要求在编译SDK时不要将三方的依赖编译到SDK的jar中。那么在添加依赖时须要使用compileOnly关键字。</p>

<pre class="prettyprint" name="code"><code class="hljs livecodeserver has-numbering">compileOnly <span class="hljs-built_in">files</span>(<span class="hljs-string">'libs/gson-2.8.5.jar'</span>)</code></pre>

<p>或者</p>

<pre class="prettyprint" name="code"><code class="hljs bash has-numbering">compileOnly <span class="hljs-string">'com.google.code.gson:gson:2.8.5'</span></code></pre>

<p>这样才不会将引入的依赖编译到SDK的jar中,这个时候须要接入方导入这些依赖,固然SDK的接入文档要详细说明。</p>

<h5 id="33请使用最日常的api和习惯">3.三、请使用最日常的api和习惯</h5>

<p>最好不去使用一些新的特性。若是接入方没有使用到这些特性,可能编译没法经过,尤为是eclipse接入时会出现更多问题。我遇到的问题:我在编译SDK时就是由于使用了lamada表达式致使eclipse没法编译经过。</p>

<h4 id="4混淆">四、混淆</h4>

<p>SDK的混淆和作app的混淆是同样的。</p>

<pre class="prettyprint" name="code"><code class="hljs bash has-numbering"> buildTypes { release { minifyEnabled <span class="hljs-literal">true</span> proguardFiles getDefaultProguardFile(<span class="hljs-string">'proguard-android.txt'</span>), <span class="hljs-string">'proguard-rules.pro'</span> } }</code></pre>

<p>在混淆的时候,若是使用了三方库,三方库混淆的要求一样须要加上混淆。 <br> <strong>若是接入方须要作混淆,请记住加上SDK的混淆要求和三方库的混淆要求。省得SDK的代码混淆以后又被接入方混淆致使出错。</strong></p>

<h4 id="5关于sdk的其余解决方案">五、关于SDK的其余解决方案</h4>

<p>实际上,用原生的界面作SDK并非很是好的解决方案,主要是不利于SDK的更新和跨平台。最好的方式是加载H5,更新起来更方便,SDK实现起来更简单。</p>

<h4 id="6一些开源的sdk">六、一些开源的SDK</h4>

<p><a href="https://github.com/typesdk/TypeSDK" rel="nofollow" target="_blank">https://github.com/typesdk/TypeSDK</a> <br> <a href="https://github.com/zuowutan/ShareGameSdk" rel="nofollow" target="_blank">https://github.com/zuowutan/ShareGameSdk</a></p>

<p><strong>若是这篇文章对你有帮助,还请点个赞再走吧:)</strong></p> </div>

相关文章
相关标签/搜索