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> <p>首先SDK是提供给别人调用的工具。所以常见的SDK都是以jar包,so库,aar包等方式导入APP项目中。然后提供一些公开的API供接入方调用。所以在Androidstudio中如果需要生成jar或者aar,就需要将module变成library。</p> <h4 id="1androidstudio生成library">1、AndroidStudio生成library</h4> <p>在这里介绍AndroidStudio两种生成library的方式。</p> <h5 id="11两种生成library的方式">1.1、两种生成library的方式</h5> <h6 id="新建library-module">新建library module。</h6> <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> <h6 id="新建android项目然后修改app下的buildgradle">新建Android项目,然后修改app下的build.gradle</h6> <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> <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> <h5 id="11使用gradle所带的命令编译">1.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.2、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两种接入方式">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.1、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.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.3、两种接入方式都需要注意的问题</h5> <p>在SDK中声明的权限,制定的Android版本范围等都要在SDK接入文档中指明清楚。</p> <h4 id="3可能踩的坑">3、可能踩的坑</h4> <h5 id="31资源文件无法获取的问题">3.1、资源文件无法获取的问题。</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.2、三方包冲突问题</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.3、请使用最平常的api和习惯</h5> <p>最好不去使用一些新的特性。如果接入方没有使用到这些特性,可能编译无法通过,尤其是eclipse接入时会出现更多问题。我遇到的问题:我在编译SDK时就是因为使用了lamada表达式导致eclipse无法编译通过。</p> <h4 id="4混淆">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的其他解决方案">5、关于SDK的其他解决方案</h4> <p>实际上,用原生的界面做SDK并不是非常好的解决方案,主要是不利于SDK的更新和跨平台。最好的方式是加载H5,更新起来更方便,SDK实现起来更简单。</p> <h4 id="6一些开源的sdk">6、一些开源的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>
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java反射, 不看你可别后悔

<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,

Native memory allocation (mmap) failed to map xxx bytes for committing reserved memory

<divid"content\_views"class"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,

AndroidStudio封装SDK的那些事 - HelloWorld