我家有只加菲 發表於 2019-8-7 11:17:00

关于Flutter和Android混合开发maven方式打包引用调用-有更新,见底部

<p>&nbsp;</p>
<p>参考Flutter:https://www.jianshu.com/p/cf7cf1b640ee,https://blog.csdn.net/u010479969/article/details/90671463</p>
<p>参考Nexus:https://blog.csdn.net/Michael_HM/article/details/78207279,https://www.cnblogs.com/yjmyzz/p/auto-upload-artifact-to-nexus.html</p>
<p>Flutter 工程通常有以下 4 种类型:</p>
<p><strong>1. Flutter Application</strong></p>
<p>标准的 Flutter App 工程,包含标准的 Dart 层与 Native 平台层,如果新项目基于flutter开发的话使用</p>
<p><strong>2. Flutter Module</strong></p>
<p>Flutter 组件工程,仅包含 Dart 层实现,Native 平台层子工程为通过 Flutter 自动生成的隐藏工程(.ios&nbsp; / .android),可以集成到Native中</p>
<p><strong>3. Flutter Plugin</strong></p>
<p>Flutter 平台插件工程,包含 Dart 层与 Native 平台层的实现,一些公共插件</p>
<p><strong>4. Flutter Package</strong></p>
<p>Flutter 纯 Dart 插件工程,仅包含 Dart 层的实现,往往定义一些公共 Widget。</p>
<p>官方提供的一种混编方案(https://github.com/flutter/flutter/wiki/Add-Flutter-to-existing-apps&nbsp;),即在现有Native工程下创建&nbsp;Flutter Module 工程,以本地依赖的方式集成到现有的 Native 工程中。</p>
<p>但是这种方式Flutter和Native耦合性太高,需要解耦,应该是阿里咸鱼团队最初提出的方案,将Flutter工程Native的依赖抽取出来在Native中引用。</p>
<p>看了一下阿里、美团还有马蜂窝的抽取文章要么比较早要么一些细节没注明,最后参考https://blog.csdn.net/u010479969/article/details/90671463完成了Flutter Module工程Android包的抽取</p>
<p>先声明一下名词:</p>
<p>Flutter Module工程:自己新建的Flutter Module工程</p>
<p>Android Native工程:已有的Android Native项目或者新建一个</p>
<p>Flutter Module工程下的Android工程:Flutter Module工程下的Native平台子工程目录为根目录下的.android</p>
<p>1、需要一个Android Native工程,可以使已有的Android Native工程,或者新建一个</p>
<p>2、新建Flutter Module工程(我觉得这里新建Flutter Module工程或者Flutter Application工程都可以,我是用的Flutter Module工程,有用Flutter Application工程成功集成的话可以反馈下),和Android Native工程是独立的,两者没有关联,最后build的Flutter aar包才会依赖到Android Native工程。(官方提供的混编方案是推荐放到Android Native同级目录)</p>
<p>flutter create -t <span class="hljs-class"><span class="hljs-keyword">module&nbsp;&nbsp;-a kotlin flutter_module 因为Android Native工程是kotlin写的这里加上了kotlin支持,如下project视图</span></span></p>
<p><span class="hljs-class"><span class="hljs-keyword"><img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190807102257852-1264569392.png"></span></span></p>
<p>&nbsp;</p>
<p><span class="hljs-class"><span class="hljs-keyword">3、在Flutter Module项目根目录的.android/app/build.gradle文件加入编译配置,不然Flutter Module项目起不来</span></span></p>
<pre>compileOptions {<br>    sourceCompatibility 1.8<br>    targetCompatibility 1.8<br>}</pre>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190807102942761-1059307985.png"></p>
<p>4、接下来需要将Flutter Module工程下的Android工程打包aar上传到Maven供Android Native工程使用,用Nexus在本地建了一个Maven库并将aar上传,有Maven库的话这步就不用了</p>
<p>参考https://blog.csdn.net/Michael_HM/article/details/78207279,https://www.cnblogs.com/yjmyzz/p/auto-upload-artifact-to-nexus.html</p>
<p>一个需要注意的问题就是admin默认密码不是admin123了,默认会在nexus同级资源目录sonatype-work\nexus3\admin.password 文件,登录修改admin密码后文件会消失</p>
<p>5、将https://blog.csdn.net/u010479969/article/details/90671463博主提供的两个文件cp到Flutter Module根目录下的.android/Flutter中,在这个目录下的build.gradle文件中引入flutter_maven.gradle</p>
<p><img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190807104425358-964467556.png"></p>
<p>apply from: "flutter_maven.gradle"</p>
<p><img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190807104645852-835001340.png"></p>
<p>upload_maven.gradle里有一些变量需要配置,可以放到Flutter Module根目录下的gradle.properties中,或者gradle用户配置文件/Users/xxx/.gradle/gradle.properties中</p>
<p>我直接放到工程文件里了</p>
<pre>MAVEN_USERNAME=maven库账号<br>MAVEN_PASSWORD=maven库密码<br>RELEASE_REPOSITORY_URL=maven库release url<br>SNAPSHOT_REPOSITORY_URL=maven库snapshot url<br>GROUP=工程group<br>ARTIFACT_ID=flutter<br>VERSION_NAME=工程版本号,这里如果带SNAPSHOT的话flutter_maven.gradle里会有一些逻辑</pre>
<p><img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190807105445378-507796847.png"></p>
<p>&nbsp;</p>
<p>6、Flutter Module根目录下的.android目录执行编译命令,上传工程,至此Flutter Module这边的工作已经完成了,在maven库里能看到生成的aar包</p>
<p>gradlew clean assembleRelease</p>
<p>gradlew uploadArchives</p>
<p>&nbsp;</p>
<p>7、到Android Native工程引入,先需要修改下Android Native工程根目录下的app/build.gradle文件,不然flutter引入进去也会build失败</p>
<p>1)、增加编译选项</p>
<pre>compileOptions {<br>    sourceCompatibility 1.8<br>    targetCompatibility 1.8<br>}</pre>
<p><img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190807110317207-1235387341.png"></p>
<p>2)、修改minSdkVersion为16</p>
<p><img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190807110432211-1957972439.png"></p>
<p>3)、解决debug包 Failure 问题,增加splits配置</p>
<pre>splits {<br>    abi {<br>      enable true<br>      reset()<br>      include 'armeabi-v7a', "x86"<br>      universalApk true<br>    }<br>}</pre>
<p><img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190807110532518-1815957776.png"></p>
<p>4)增加maven库配置</p>
<pre>repositories {<br>    maven {<br>      url "maven库url"<br>      credentials {<br>            username 'maven库用户名'<br>            password 'maven库密码'<br>      }<br>    }<br>}</pre>
<p><img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190807110632192-478564874.png"></p>
<p>5)引入aar,dependencies增加implementation GROUP,ARTIFACT_ID,VERSION_NAME是你自己打包时gradle.properties里的配置</p>
<pre>dependencies {<br><br>    // 引入flutter maven依赖包<br>    implementation 'GROUP:ARTIFACT_ID:VERSION_NAME@aar'</pre>
<pre><em id="__mceDel">}</em></pre>
<p>&nbsp;8、build下工程没问题的话就可以参考https://www.jianshu.com/p/cf7cf1b640ee写原生和Flutter的胶水代码了,在原生的首页写了一个jumpButton,点击后跳转的Flutter首页,</p>
<p>这里是kotlin的代码,java代码也差不多的调用。还有个问题就是build的出来的x86包没有libflutter.so库在模拟器运行失败,直接在真机运行没问题,这个谁解决了告我下</p>
<p>9、问题:.android 和 .ios目录是Flutter Module工程的临时目录,随时都有可能重新生成,参考https://github.com/flutter/flutter/issues/32989,https://github.com/flutter/flutter/issues/28135。怎么才能不重新生成呢?因为build.gradle和gradle.properties修改了东西,flutter_maven.gradle和upload_maven.gradle是新增的文件,每次重新build或者增加插件执行flutter pub get的时候.android目录都会重新生成被覆盖掉。</p>
<p>找到了一个解决方案https://github.com/flutter/flutter/issues/23123,但他这个只是把Android代码抽取出去了,只适合修改原生代码的情况,Flutter还是在.andorid下,这样的话只能每次build upload的时候重新把这四个文件复制到.android下了。。</p>
<p><img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190812163152115-368135327.png"></p>
<p>&nbsp;手动复制也比较麻烦,直接把四个文件放到properties目录下,写个cmd批处理复制然后build upload</p>
<p><img src="https://img2018.cnblogs.com/blog/1053344/201908/1053344-20190812165453658-162120768.png"></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 128, 0, 1)">::</span><span style="color: rgba(0, 128, 0, 1)">copy file</span>
<span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 255, 1)">copy</span> /y properties\gradle.properties .<span style="color: rgba(0, 0, 0, 1)">android
</span><span style="color: rgba(0, 128, 128, 1)">3</span> <span style="color: rgba(0, 0, 255, 1)">copy</span> /y properties\build.gradle .android\<span style="color: rgba(0, 0, 0, 1)">Flutter
</span><span style="color: rgba(0, 128, 128, 1)">4</span> <span style="color: rgba(0, 0, 255, 1)">copy</span> /y properties\flutter_maven.gradle .android\<span style="color: rgba(0, 0, 0, 1)">Flutter
</span><span style="color: rgba(0, 128, 128, 1)">5</span> <span style="color: rgba(0, 0, 255, 1)">copy</span> /y properties\upload_maven.gradle .android\<span style="color: rgba(0, 0, 0, 1)">Flutter
</span><span style="color: rgba(0, 128, 128, 1)">6</span>
<span style="color: rgba(0, 128, 128, 1)">7</span> <span style="color: rgba(0, 0, 255, 1)">cd</span> .<span style="color: rgba(0, 0, 0, 1)">android
</span><span style="color: rgba(0, 128, 128, 1)">8</span> <span style="color: rgba(0, 128, 0, 1)">::</span><span style="color: rgba(0, 128, 0, 1)">build and upload</span>
<span style="color: rgba(0, 128, 128, 1)">9</span> gradlew clean assembleRelease &amp;&amp; gradlew uploadArchives</pre>
</div>
<p>&nbsp;10、果然还是要改gradle配置文件了,上面博主提供的两个gradle文件用起来都有些问题,一个是build时task不能overwrite问题‘Cannot add task 'flutterSourcesJar' as a task with that name already exists’,一个是windows下'\f'这样的路径识别成表情符号导致plugin打包失败,改了下两个配置文件</p>
<p>flutter_maven.gradle</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> <span style="color: rgba(0, 0, 0, 1)">apply plugin: MavenPlugin
</span><span style="color: rgba(0, 128, 128, 1)"> 2</span> apply <span style="color: rgba(0, 0, 255, 1)">from</span>:<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">upload_maven.gradle</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 255, 1)">class</span> MavenPlugin implements Plugin&lt;Project&gt;<span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span>
<span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">    @Override
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> apply(Project target) {
</span><span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">      target.afterEvaluate {
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span>             def scriptFile =<span style="color: rgba(0, 0, 0, 1)"> target.rootDir
</span><span style="color: rgba(0, 128, 128, 1)">10</span>             def FlutterFile = <span style="color: rgba(0, 0, 255, 1)">new</span> File(target.rootDir,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Flutter</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">11</span>             def uploadFile = <span style="color: rgba(0, 0, 255, 1)">new</span> File(FlutterFile,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">upload_maven.gradle</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">12</span>             def flutterProjectRoot =<span style="color: rgba(0, 0, 0, 1)"> scriptFile.parentFile
</span><span style="color: rgba(0, 128, 128, 1)">13</span>             def plugins = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Properties()
</span><span style="color: rgba(0, 128, 128, 1)">14</span>             def pluginsFile = <span style="color: rgba(0, 0, 255, 1)">new</span> File(flutterProjectRoot, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">.flutter-plugins</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">15</span>             <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (pluginsFile.exists()) {
</span><span style="color: rgba(0, 128, 128, 1)">16</span>               pluginsFile.withReader(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">UTF-8</span><span style="color: rgba(128, 0, 0, 1)">'</span>) { reader -&gt;<span style="color: rgba(0, 0, 0, 1)"> plugins.load(reader) }
</span><span style="color: rgba(0, 128, 128, 1)">17</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">18</span>
<span style="color: rgba(0, 128, 128, 1)">19</span>             plugins.each { name, path -&gt;
<span style="color: rgba(0, 128, 128, 1)">20</span>
<span style="color: rgba(0, 128, 128, 1)">21</span>               def version = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1.0-SNAPSHOT</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 128, 1)">22</span>               def folderName = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> File(path).getName()
</span><span style="color: rgba(0, 128, 128, 1)">23</span>               <span style="color: rgba(0, 0, 255, 1)">if</span>(folderName.contains(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)){
</span><span style="color: rgba(0, 128, 128, 1)">24</span>                     version = folderName.split(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-</span><span style="color: rgba(128, 0, 0, 1)">"</span>)[<span style="color: rgba(128, 0, 128, 1)">1</span>]+<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-SNAPSHOT</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">每次更新flutter 插件都更新snapshot版本
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">                  version = folderName.split("-")</span>
<span style="color: rgba(0, 128, 128, 1)">26</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">27</span>
<span style="color: rgba(0, 128, 128, 1)">28</span>               def properties = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Properties()
</span><span style="color: rgba(0, 128, 128, 1)">29</span>
<span style="color: rgba(0, 128, 128, 1)">30</span>               def pluginDirectory = flutterProjectRoot.toPath().resolve(path).resolve(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">android</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">).toFile()
</span><span style="color: rgba(0, 128, 128, 1)">31</span>               def propertiesFile = <span style="color: rgba(0, 0, 255, 1)">new</span> File(pluginDirectory,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">gradle.properties</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">32</span>               def buildFile = <span style="color: rgba(0, 0, 255, 1)">new</span> File(pluginDirectory,<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">build.gradle</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">33</span>
<span style="color: rgba(0, 128, 128, 1)">34</span>               def list =<span style="color: rgba(0, 0, 0, 1)"> []
</span><span style="color: rgba(0, 128, 128, 1)">35</span>               buildFile.withReader(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">UTF-8</span><span style="color: rgba(128, 0, 0, 1)">'</span>) { reader -&gt;
<span style="color: rgba(0, 128, 128, 1)">36</span> <span style="color: rgba(0, 0, 0, 1)">                  reader.eachLine {
</span><span style="color: rgba(0, 128, 128, 1)">37</span>                         <span style="color: rgba(0, 0, 255, 1)">if</span> (it.contains(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">group </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(0, 128, 128, 1)">38</span>                           it = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">group \'com.flutter.plugin\'</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 128, 1)">39</span>                         } <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (it.contains(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">version </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(0, 128, 128, 1)">40</span>                           it = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">version </span><span style="color: rgba(128, 0, 0, 1)">"</span>+<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\'</span><span style="color: rgba(128, 0, 0, 1)">"</span>+version+<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\'</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 128, 1)">41</span>                         } <span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span> (it.contains(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">apply plugin: \'com.android.library\'</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)) {
</span><span style="color: rgba(255, 0, 0, 1)">42                           list.add('apply from:' + '\''+uploadFile.getPath().replace('\\','\\\\') + '\'' + "\n")
43                         } else if(it.contains('apply from:' + '\''+uploadFile.getPath().replace('\\','\\\\')+ '\'')){
</span><span style="color: rgba(0, 128, 128, 1)">44</span>                           it = <span style="color: rgba(128, 0, 0, 1)">""</span>
<span style="color: rgba(0, 128, 128, 1)">45</span> <span style="color: rgba(0, 0, 0, 1)">                        }
</span><span style="color: rgba(0, 128, 128, 1)">46</span>                         list.add(it + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">\n</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">47</span> <span style="color: rgba(0, 0, 0, 1)">                  }
</span><span style="color: rgba(0, 128, 128, 1)">48</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">49</span>
<span style="color: rgba(0, 128, 128, 1)">50</span>               buildFile.withWriter(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">UTF-8</span><span style="color: rgba(128, 0, 0, 1)">'</span>) { writer -&gt;
<span style="color: rgba(0, 128, 128, 1)">51</span> <span style="color: rgba(0, 0, 0, 1)">                  list.each {
</span><span style="color: rgba(0, 128, 128, 1)">52</span> <span style="color: rgba(0, 0, 0, 1)">                        writer.write(it)
</span><span style="color: rgba(0, 128, 128, 1)">53</span> <span style="color: rgba(0, 0, 0, 1)">                  }
</span><span style="color: rgba(0, 128, 128, 1)">54</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">55</span>
<span style="color: rgba(0, 128, 128, 1)">56</span>               <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (propertiesFile.exists()) {
</span><span style="color: rgba(0, 128, 128, 1)">57</span>                     propertiesFile.withReader(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">UTF-8</span><span style="color: rgba(128, 0, 0, 1)">'</span>) { reader -&gt;<span style="color: rgba(0, 0, 0, 1)"> properties.load(reader) }
</span><span style="color: rgba(0, 128, 128, 1)">58</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">59</span>
<span style="color: rgba(0, 128, 128, 1)">60</span>
<span style="color: rgba(0, 128, 128, 1)">61</span>               properties.setProperty(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">GROUP</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">com.flutter.plugin</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">62</span>               properties.setProperty(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ARTIFACT_ID</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,name)
</span><span style="color: rgba(0, 128, 128, 1)">63</span>               properties.setProperty(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">VERSION_NAME</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,version)
</span><span style="color: rgba(0, 128, 128, 1)">64</span>               properties.store(<span style="color: rgba(0, 0, 255, 1)">new</span> FileOutputStream(propertiesFile),<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">maven configuration</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 128, 128, 1)">65</span>
<span style="color: rgba(0, 128, 128, 1)">66</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">67</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">68</span>
<span style="color: rgba(0, 128, 128, 1)">69</span>
<span style="color: rgba(0, 128, 128, 1)">70</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">71</span> }</pre>
</div>
<p>upload_maven.gradle</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)"> 1</span> apply plugin: <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">maven</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)"> 2</span>
<span style="color: rgba(0, 128, 128, 1)"> 3</span> <span style="color: rgba(0, 0, 0, 1)">def getRepositoryUsername() {
</span><span style="color: rgba(0, 128, 128, 1)"> 4</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> hasProperty(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">MAVEN_USERNAME</span><span style="color: rgba(128, 0, 0, 1)">'</span>) ? MAVEN_USERNAME : <span style="color: rgba(128, 0, 0, 1)">""</span>
<span style="color: rgba(0, 128, 128, 1)"> 5</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 6</span> <span style="color: rgba(0, 0, 0, 1)">def getRepositoryPassword() {
</span><span style="color: rgba(0, 128, 128, 1)"> 7</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> hasProperty(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">MAVEN_PASSWORD</span><span style="color: rgba(128, 0, 0, 1)">'</span>) ? MAVEN_PASSWORD : <span style="color: rgba(128, 0, 0, 1)">""</span>
<span style="color: rgba(0, 128, 128, 1)"> 8</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)"> 9</span> <span style="color: rgba(0, 0, 0, 1)">def getRepositoryUrl() {
</span><span style="color: rgba(0, 128, 128, 1)">10</span>   <span style="color: rgba(0, 0, 255, 1)">return</span> !VERSION_NAME.toUpperCase().contains(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">SNAPSHOT</span><span style="color: rgba(128, 0, 0, 1)">"</span>) ?<span style="color: rgba(0, 0, 0, 1)"> RELEASE_REPOSITORY_URL : SNAPSHOT_REPOSITORY_URL
</span><span style="color: rgba(0, 128, 128, 1)">11</span> <span style="color: rgba(0, 0, 0, 1)">}
</span><span style="color: rgba(0, 128, 128, 1)">12</span>
<span style="color: rgba(0, 128, 128, 1)">13</span> afterEvaluate { project -&gt;
<span style="color: rgba(0, 128, 128, 1)">14</span> <span style="color: rgba(0, 0, 0, 1)">    uploadArchives {
</span><span style="color: rgba(0, 128, 128, 1)">15</span> <span style="color: rgba(0, 0, 0, 1)">      repositories {
</span><span style="color: rgba(0, 128, 128, 1)">16</span> <span style="color: rgba(0, 0, 0, 1)">            mavenDeployer {
</span><span style="color: rgba(0, 128, 128, 1)">17</span>               pom.groupId =<span style="color: rgba(0, 0, 0, 1)"> GROUP
</span><span style="color: rgba(0, 128, 128, 1)">18</span>               pom.artifactId =<span style="color: rgba(0, 0, 0, 1)"> ARTIFACT_ID
</span><span style="color: rgba(0, 128, 128, 1)">19</span>               pom.version =<span style="color: rgba(0, 0, 0, 1)"> VERSION_NAME
</span><span style="color: rgba(0, 128, 128, 1)">20</span> <span style="color: rgba(0, 0, 0, 1)">                repository(url: getRepositoryUrl()) {
</span><span style="color: rgba(0, 128, 128, 1)">21</span> <span style="color: rgba(0, 0, 0, 1)">                  authentication(userName: getRepositoryUsername(), password: getRepositoryPassword())
</span><span style="color: rgba(0, 128, 128, 1)">22</span> <span style="color: rgba(0, 0, 0, 1)">                }
</span><span style="color: rgba(0, 128, 128, 1)">23</span> <span style="color: rgba(0, 0, 0, 1)">            }
</span><span style="color: rgba(0, 128, 128, 1)">24</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">25</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">26</span>
<span style="color: rgba(0, 128, 128, 1)">27</span>   <span style="color: rgba(0, 0, 255, 1)">if</span> (project.hasProperty(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">android</span><span style="color: rgba(128, 0, 0, 1)">"</span>)) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Android libraries</span>
<span style="color: rgba(255, 0, 0, 1)">28         task flutterSourcesJar(type: Jar, overwrite: true) {
</span><span style="color: rgba(0, 128, 128, 1)">29</span>             classifier = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">sources</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">30</span>             <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> android.sourceSets.main.java.srcDirs
</span><span style="color: rgba(0, 128, 128, 1)">31</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">32</span>
<span style="color: rgba(0, 128, 128, 1)">33</span>   } <span style="color: rgba(0, 0, 255, 1)">else</span> { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> Java libraries</span>
<span style="color: rgba(255, 0, 0, 1)">34         task flutterSourcesJar(type: Jar, dependsOn: classes, overwrite: true) {
</span><span style="color: rgba(0, 128, 128, 1)">35</span>             classifier = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">sources</span><span style="color: rgba(128, 0, 0, 1)">'</span>
<span style="color: rgba(0, 128, 128, 1)">36</span>             <span style="color: rgba(0, 0, 255, 1)">from</span><span style="color: rgba(0, 0, 0, 1)"> sourceSets.main.allSource
</span><span style="color: rgba(0, 128, 128, 1)">37</span> <span style="color: rgba(0, 0, 0, 1)">      }
</span><span style="color: rgba(0, 128, 128, 1)">38</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">39</span>
<span style="color: rgba(0, 128, 128, 1)">40</span>
<span style="color: rgba(0, 128, 128, 1)">41</span> <span style="color: rgba(0, 0, 0, 1)">    artifacts {
</span><span style="color: rgba(0, 128, 128, 1)">42</span> <span style="color: rgba(0, 0, 0, 1)">      archives flutterSourcesJar
</span><span style="color: rgba(0, 128, 128, 1)">43</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">44</span>
<span style="color: rgba(0, 128, 128, 1)">45</span>   <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">解决 JavaDoc 中文注释生成失败的问题</span>
<span style="color: rgba(0, 128, 128, 1)">46</span> <span style="color: rgba(0, 0, 0, 1)">    tasks.withType(Javadoc) {
</span><span style="color: rgba(0, 128, 128, 1)">47</span>         options.addStringOption(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">Xdoclint:none</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">-quiet</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">48</span>         options.addStringOption(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">encoding</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">UTF-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">49</span>         options.addStringOption(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">charSet</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">UTF-8</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 128, 128, 1)">50</span> <span style="color: rgba(0, 0, 0, 1)">    }
</span><span style="color: rgba(0, 128, 128, 1)">51</span> }</pre>
</div>
<p>&nbsp;------------------------------------更新线---------------------------------</p>
<p>真正合到native项目的时候发现问题了,这个博主的文章还是有问题的,只是初步实现了整合,而且对每个插件的build.gradle侵入也比较厉害,打包的配置文件还是有些问题。不过还是有所帮助。评论里提了问题也一直没回。当插件增多的时候,每个插件都单独打了aar包,显然是不行的,然后找到一篇blog 见https://www.jianshu.com/p/2258760e9540,最终将所有插件打成一个fat-aar包导入到native工程中,不过坑依旧很多,踩吧</p><br><br>
来源:https://www.cnblogs.com/nightfallsad/p/11314181.html
頁: [1]
查看完整版本: 关于Flutter和Android混合开发maven方式打包引用调用-有更新,见底部