使用 KMM,具备灵活性的同时也保留了原生编程的优势。...在写这篇博客的同时,KMM 仍然处于 Alpha,你可以开始尝试在你的应用中共享业务逻辑代码。 在移动开发领域,KMM 目前没有为大众所熟知。...实现 iosMain 下存储 iOS 的特定代码,包括 actual 实现 每一个源集都有自己的依赖,Kotlin 标准库依赖会自动添加到所有源集,你不需要在编译脚本中声明。...首先,在 common 模块中使用 expect 关键字声明一个空的类或函数,就像创建接口或者抽象类一样。然后,在所有的其他模块中编写平台特定代码来实现对应的类或函数,并用 actual 修饰。...甚至放飞一下自我,未来的某一天是不是可以用 Flutter 做 UI 上的通用,用 Kotlin 做业务逻辑上的通用? 不管怎样,最终还是得开发者买账才行。
一、用KMM写Flutter插件 Google官方有一个写Flutter例子How to write a Flutter plugin,这里把Google plugin_codelab 例子改成用KMM.../gradlew releaseIOSFramework or use new version Android Studio sync 2、run shared/plugin_codelab/example...三、设计思路 Android/iOS插件PluginCodelabPlugin只需要实现KMM Module的接口,不写任何逻辑,把逻辑通过接口放在KMM Module中。...fun notImplemented() } } 2、在KMM中的commonMain实现CommonCodelabPlugin插件的公共逻辑 CommonCodelabPlugin需要初始化并启动...使用KMM开发插件的好处是公共逻辑都使用kotlin写,一般公共逻辑比较简单适合使用kotlin写,便于维护。而且,实现了KMM写插件,Flutter写UI。
Compose Multiplatform 与 KMM的关系 要Compose Multiplatform 与 KMM的关系,我们只要来分别了解Compose Multiplatform 与 KMM分别是什么就行了...KMM是什么 KMM的全称是Kotlin Multiplatform Mobile,与之对应的是KMP—Kotlin Multiplatform Project,其实就是一个是Kotlin移动端跨平台,...那么Compose Multiplatform又是什么呢?...好在Kotlin在1.8.20版本中推出了Kotlin/Wasm,最新的Compose for Web 是基于Kotlin/Wasm的,当前处于试验阶段。...很多人告诉我的理由都是Java也能用啊、老板不让用啊、公司项目陈旧啊,其实这些放到现在都是借口了。
Android Studio创建一个KMM项目,如果你不知道如何创建一个KMM项目,可以参照之前的这篇文章KMM的初次尝试~ ,项目目录结构如下所示。...开始iOS之旅 我们替换掉iOSApp.swift中的原有代码,替换后的代码如下所示: import UIKit import shared @UIApplicationMain class AppDelegate...添加网络请求配置 首先在shared模块下的build文件中添加网络请求相关的配置,这里网络请求我们使用Ktor,具体的可参照之前的文章:KMM的初次尝试~ 配置代码如下所示: val commonMain...一个尴尬的问题 我一直认为存在一个比较尴尬的问题,那就是像上面实现一个完整的双端网络请求功能需要用到KMM + Compose-jb,但是KMM与Compose-jb并不是一个东西,但是用的时候呢基本上都是一起用...Compose-jb很久之前已经发了稳定版本只是Compose-iOS目前还没有开放出来,而KMM当前还处于试验阶段,不过在2023年Kotlin的RoadMap中,Kotlin已经表示将会在23年中发布第一个稳定版本的
前言 Pod库是很重要的组成部分,大部分第三方库都是通过CocoaPod的方式引入和管理,同时项目中的部分功能也可以用Pod库来做模块化。 本文是对CocoaPod的一些探究。...正文 CocoaPods是为iOS工程提供第三方依赖库管理的工具,用CocoaPods可以更方便地管理第三方库:把依赖库统一放在Pods工程中,同时让主工程依赖Pods工程。...1、普通的写法; pod 'AFNetworking' 或者 pod 'AFNetworking', '3.2.1',前者是下载最新版本,后者是下载指定版本。...而在CocoaPod依赖解析中,可以把每个Pod库都看成一个节点,Pod库的依赖是它的子节点; 依赖解析的过程,就是在一个有向图中找到一个拓扑序列。...(LearnPod是target的名字,下面的示例图都是用LearnPod作为target名) ? 那么Pod库中的target编译顺序是如何决定? 打开workspace,选择Pods工程。
在终端输入以下命令进行安装或者升级 旧版本cocoapods需升级最新的,之前在这遇到坑 $ sudo gem install cocoapods 安装详细方法 制作cocoaPods库详细 1、终端...cd到自定义文件夹 2、pod lib create xxx(把它换成你的库的名字),回车 ?...5D78B8D5-5E69-4EFC-96B0-5302103FFA7E.png 3、结束后会自动打开创建的工程 替换需制作的cocoapod文件、修改 .podspec 文件 ?...51A983E3-95D0-4D54-87A4-C0FC817D0E3D.png 上方demo需要运行 pods中自己添加的文件 cd到Example目录下,完成demo编写后把需要被pod的文件放入下方替换...6、回到终端 cd到项目目录执行 将自己的 spec 文件上传到 cocoapods 的 trunk 服务器 pod lib lint xxx xxx 为自己项目名称,库中后缀名为 .
主要负责基础业务、搜索、首页、用增相关等内容,会经常遇到多个 App 部分业务需要复用的情况。...在下文中,我会多次提到 KMM 这个简称,这里先简单讲一下 KMM 是什么: 基于 KMP(Kotlin Multiplatform)派生,全称 Kotlin Multiplatform Mobile。...对于 KMM 工程来说,通过 Android Studio KMM 插件生成的结构是这样的: 如何扩展原生能力 先举一个最简单的例子,实现一个双端的 Log 工具。...cinterop 是 Kotlin Native 支持的能力,KMM 工程的编译使用了 gradle 工具链,其中对 iOS 来说,我们使用了 Kotlin CocoaPods 插件。...如果有多端业务开发的场景(常见于 B 端业务),逻辑层可以用 Kotlin 跨更多的平台,饿了么商家端和美团商家端就有在这个场景下使用。
Gradle 是什么 是构建工具,不是语言 它用了 Groovy 这个语言,创造了一种 DSL,但它本身不是语⾔ Gradle常用命令 ..../gradlew build --info --debug --stacktrace # 强制更新最新依赖,清除构建并构建 ....在项目根目录的build.gradle文件中添加以下代码和android{}同级 ext { //全局变量控制,可在module中的build.gradle文件通过rootProject.ext.xxx...然后在Proguard 配置文件中过滤被这个注解修饰的元素,表示不混淆被 NotProguard 修饰的类、属性和方法。...版本直接用的是正式签名。
简介 gradle的最新版本是6.7,从2009年的第一个版本,到2020年的6.7,已经发展了11年了。...第二个原因就是gradle中需要自己编写构建脚本,相对于纯配置的脚本来说,比较复杂。...替换之后,重新执行brew install gradle即可安装完成。...gradlew, gradlew.bat :使用wrapper执行build的执行文件。也就是说我们可以使用wrapper来执行gradle的build任务。...默认情况下gradle有自己的本地仓库,一般在~/.gradle目录下面,如果我们之前用的是maven仓库,那么在本地的maven仓库中已经存在了很多依赖包了,如何重用呢?
---- 1.先在.gradle的目录中新建一个文件(init.gradle) Windows:放在 "C:\Users\(替换为你的)Administrator\.gradle" 目录下 ?...init.gradle位置 Ubuntu:放在 "/home/(替换为你的)用户名/.gradle" 目录下 ?...代理 在Android Studio中验证gradle版本, Windows:gradlew -v 或 gradle -v Ubuntu:gradle -v (为什么今天运行....gradle版本.png ****以后开启软件,如果gradle自动构建失败,你可以在界面右下角手动停止,然后在终端中输入 (windows) "gradlew"; (ubuntu) "....gradle设置 按我的理解,其实gradlew不是真正在操作系统环境下运行gradle命令,而仅仅是基于Android Studio环境来运行的。
app文件夹就是一个module,如果在当前工程中添加了一个新的module — lib,就需要在settings.gralde文件中包含这个新的module。...,一个是release 下用的,看个人需求使用,这里我们用的是release 版本的 .aar 文件。...,这里是获取服务器上的最新版本。...,执行之前记得加上x属性 - chomod +x gradlew gradle脚本中包含了很多 task,可以通过task名来指定需要执行的task。.../gradlew build./gradlew assemble.
所以从网盘下载下来后,记得一定要把~/.rncache文件夹里的文件全替换成自己下载的。 之后init的项目就没问题了。 run-android问题 环境和SDK问题 按官网教程配置好环境。 ?...下载完成后将其放入某个文件夹下,再取出文件路径,用其替换项目中 android/gradle/wrapper/gradle-wrapper.properties 的 distributionUrl。...mac中调用本地文件时可能会出现权限问题,这时选中你的项目文件夹,右键选择显示简介,拉到最下面,如下图: ? 先点击小锁,输入密码解锁,然后点击设置图标按钮,选择应用到包含的项目,确定,点击小锁锁定。...如果出现这个问题就需要先打开你的模拟器,如果您是用的Genymotion,报错的话有可能是adb设置问题,解决如下图,路径选择您自己的sdk目录。 ?...刚遇到这个问题时一脸懵比,没有有效的报错信息可供参考。 于是,去检查了adb是可以用的,sdk路径也没有问题。 ? 检查模拟器也是连接上了。
帐号,也可以用其他镜像仓库如阿里云; 关于java项目 用于本次实战的项目,是个典型的父子结构的gradle工程,有一个模块是springboot工程,咱们今天要做的就是将此工程编译构建制作成docker...,这些信息自然不能写在GithHub仓库的代码中,如下图,在页面上按照下面红框的顺序新增两个secret类型的环境变量,稍后在GitHub Actions脚本中用变量名就能使用具体的帐号和密码了: 编写...,如下图,选择红框中的Gradle模板: 如下图,此时出现在线编辑脚本的页面,可见GitHub已在线生成了一些脚本: 将脚本内容替换为以下内容,已添加了详细的注释,就不多赘述了,唯一要提醒的是镜像的...- name: Grant execute permission for gradlew # 给gradlew可执行权限 run: chmod +x gradlew -...中就会有最新的镜像产生; 验证 接下来验证一下刚才构建的镜像是否可用 首先,掏出我最值钱的家当:树莓派3B(可想而知,欣宸有多么贫穷): 树莓派中有ARM架构的64位Linux操作系统,已经装好了docker
快直播除电商带货和在线教育外,还能满足体育直播、游戏直播等各种能融合实时互动的直播场景需求。 现在直播行业大多数用的是标准直播,它的直播协议主要是FLV、HLS、RTMP。...旧版本IOS快速升级指引 1、选择pod 的方式的话,进入项目所在路径,项目之前已经已经创建过Podfile文件的话,直接打开Podfile文件,使用CocoaPod官方源,pod install 更新本地库文件...SDK 目录下的 aar 文件拷贝到工程的 app/libs 目录下,替换掉你之前版本的aar文件; 3、再次检查工程根目录下的 build.gradle中,添加 flatDir,是否指定的本地仓库路径...; 4、在 app/build.gradle 中,修改引用 aar 包的代码,修改为你下载最新版的SDK; implementation(name:'LiteAVSDK_Professional_8.7.10102...、arm64-v8a 文件夹拷贝到 app/libs 目录下,替换掉之前的文件夹; 3、在 app/build.gradle 中,检查一下jar库的引用代码; 4、点击Sync Now按钮同步 SDK,
iOS工程大多采用CocoaPod进行组件化管理,一些大型的项目需要打包平台来执行组件打bundle包和APP打测试包的任务,在开发方面会采用二进制与源码切换的方式来提高编译速度。...二、现状 携程火车票APP一直以来采用的也是组件化管理,在去年改用CocoaPod进行组件化管理,随着业务的迭代和基础建设不断的完善,pod组件也越来越精细化,目前pod组件数量已超60+。...我们找了各种资料,找到了美团有款zsource的CocoaPod插件可以进行二进制调试,虽未开源,但大致逻辑文章里已经罗列的很清晰,大致原理: 以libXXXX.a二进制文件为例,用 MachOView...问题2:在美团的文章中可以了解到,使用dwarfdump 命令可以获取静态库中存储的编译静态库时源码文件所在的路径。...四、总结 无论是架构演进、流程优化还是制作工具,工程师们总是希望用技术手段去减少重复工作,提高人效。篇幅原因,做这些优化的过程中遇到的很多问题及解决方案都没罗列出来。
日常开发中AS与Gradle架构使用技巧的高频面试问题。...2、Gradle是什么 Gradle是一个自动化构建工具 兼容Maven等仓库 基于Groovy的特定领域语言来声明名目设置 3、Gradle常用命令 gradlew clean: 清除app目录下的build...provided:编译时提供但不打包进apk 在gradlew 3.0 中complie过期了,用implementation和api替代,api = compile implemention:将该依赖隐藏在内部...设置为false排除所有的传递依赖 force:强制设置某个模块的版本 6、Gradle打包时的混淆 通过在buildTypes中配置minifyEnable来开启和关闭proguard 通过proguardFiles...打开项目根目录下的build.gradle, 在最顶上依赖我们刚刚创建的配置文件apply from: "xxx.gradle" 在app模块下的build.gradle中引用即可:compile
其完整项目目录结构如下所示: 只有war工程才有webapp目录,对于普通的jar工程并没有webapp目录 gradlew与gradlew.bat执行的指定wrapper版本中的gradle指令,不是本地安装的...jcenter():JCenter中央仓库,实际也是是用的maven搭建的,但相比Maven仓库更友好,通过CDN分发,并且支持https访 问,在新版本中已经废弃了,替换为了mavenCentral(...项目中的gradlew、gradlew.cmd脚本用的就是wrapper中规定的gradle版本。...而我们上面提到的gradle指令用的是本地gradle,所以gradle指令和gradlew指令所使用的gradle版本有可能是不一样的。...下载别人的项目或者使用操作以前自己写的不同版本的gradle项目时:用Gradle wrapper,也即:gradlew 什么时候使用本地gradle?新建一个项目时: 使用gradle指令即可。
领取专属 10元无门槛券
手把手带您无忧上云