当前位置: 首页 > news >正文

安卓SDK开发的一些疑问

目前,公司需要开发一套iOS和安卓的sdk,主要包含蓝牙管理、网络请求、倒计时等方案执行、蓝牙数据交互等功能。之前没有过开发安卓sdk的经历,写个笔记用以记录。

现在iOS sdk已经写了一部分,安卓开发我也习惯从iOS的角度类比来开发,节省时间。在开始具体开发之前,先将几个问题具体弄清楚,然后再一步步具体进行。

问题1: 与iOS的类比,是否可以生成类似iOS的静态库.a或者动态库.dylib来给第三方使用?

在安卓开发中,并没有.a静态库和.dylib这种动态库,但是有另外类似的两种形式:JARAAR

  1. JAR(Java ARchive):这种库的形式主要用来封装java类(当然kotlin也是没有问题的),类似于iOS的.a静态库,但是只能包含java代码,不能包含资源文件(例如XML布局,Android的Manifest.xml,本地库(.so文件等))。
  2. AAR(Android ARchive):这是Android特有的一种库,它包含了JAR库以及其他资源(例如XML布局,AndroidManifest.xml,本地库(.so文件)等),类似iOS的.framewrk。

一般情况下,我们会将Android库打包成AAR文件,然后在需要的项目中添加对应的依赖。在Android Studio中,可以使用Gradle构建工具来生成AAR文件,然后在需要使用SDK的项目中,在build.gradle文件中添加对应的依赖。

例如:

dependencies {implementation fileTree(dir: 'libs', include: ['*.jar'])implementation 'com.example:my-sdk:1.0.0'
}

需要注意的是,使用AAR文件并不能完全隐藏SDK的实现细节。在Android中,所有的Java代码都可以被反编译。如果想保护代码,需要使用混淆工具(例如ProGuard)对代码进行混淆,使得反编译后的代码难以阅读和理解。

问题2: 使用gradle安装的sdk,这个aar也像iOS一样有类似cocoapods的仓库吗?

是的,像iOS常用的cocoapods库一样,在安卓中可以将sdk发布到Maven仓库,如JCenterMaven CentralJitPack,然后在build.gradle文件中添加远程库依赖。这种方式最为常见,它也允许其他开发者很容易地使用和更新你的sdk

当然,也可以不发布到这些仓库。让开发者直接下载aar,然后放在libs目录下,然后在项目的build.gradle文件中添加本地库依赖。这种方式适用于SDK尚未发布,或只在少数项目中使用的情况。

第3中方式,也可以通过自己服务器分发或者私有Maven仓库来分发。

问题3:安卓封装成AAR的sdk,是否像sdk的动态库或者静态库那样,能看到对应的头文件及具体可以调用的方法?

两个平台还是有蛮大的差异。在iOS使用的.a静态库时,一般会将header头文件暴露给三方使用者,而具体实现则在.a里面变为二进制文件无法查看。但在安卓中,AAR中包含的实际上是Java的.classkotlin编译后的字节码。不考虑通过工具反编译等因素的话,直接是不能查看其源代码的。给第三方使用时,更加依赖于文档说明、示例代码等。

问题4:sdk如何设置具体开发?是否像iOS按照cocoapods库开发一样麻烦呢?

安卓开发在这种场景下反而比iOS要简单不少。在Android Studio中,直接创建一个Library模块,然后按照自己规模的模式进行封装和开发即可。本身这个模块也可以很方便地配置自己所依赖的三方库等。而在iOS的SDK开发中,需要依赖CocoaPods或者Carthage等工具。

在整个SDK开发完成后,也可以用如下简单的命令来生成AAR文件。

./gradlew :my-sdk:assembleRelease

这个命令则会在my-sdk/build/outputs/aar/目录下生成一个名为my-sdk-release.aar的文件(假设模块的名字是my-sdk)。然后,便可以将这个AAR文件分发给其他的开发者,或者上传到Maven仓库中供其他人使用。

也可以通过Android Studio的界面来执行这个构建任务。具体在Gradle窗口中找到你的模块,展开Tasks->build,然后双击assembleRelease任务。

问题5:Android sdk开发,语言如何选择?java还是kotlin?

在iOS的sdk开发上,我选择了Objective-C。主要出于两个原因:

  1. 我个人感觉,Objective-C这种将声明和实现分分别在两个文件中来写的语言,天然地更加适合sdk开发。私有的属性和方法,可以直接写在.m文件中,给三方调用的,直接写在.h中,更加清晰。虽然调试过程中,私有的属性和方法等,不可避免地也会暴露,但是在正常情况下,它更加简单和容易。
  2. Swift苹果也推了好多年了,但是,在互操作性方面,在Swift里面调用oc代码,基本上没有什么问题。但是反过来可能就有些问题。毕竟Swift与OC相差年代太多了,两者不是一个代际的语言,Swift上面有许多特性,OC并不支持。比如泛型枚举的关联值结构体协议扩展某些类型的方法重载,这些在OC中都无法使用。在设计SDK时,需要注意公开API要遵循Objective-C的特性和约束。与其各种注意,不如直接用OC来开发。在兼容和稳定性方面应该问题更小。

而在Android SDK的开发上,同样是Google推出的新语言kotlin,它与Java之间的互相调用却更加无缝,虽然它们之间也有着一些细微的差异和限制。并且,kotlin和java都是一个类为一个单文件的代码,并没有oc和kotlin那种巨大的差异。所以,我个人感觉,可以直接使用kotlin,还可以利用kotlin中的协程等更加强大的特性。

相关文章:

安卓SDK开发的一些疑问

目前,公司需要开发一套iOS和安卓的sdk,主要包含蓝牙管理、网络请求、倒计时等方案执行、蓝牙数据交互等功能。之前没有过开发安卓sdk的经历,写个笔记用以记录。 现在iOS sdk已经写了一部分,安卓开发我也习惯从iOS的角度类比来开发…...

【基础类】—三栏页面布局的方案和优缺点

一、假设高度已知&#xff0c;中间宽度自适应&#xff0c;三栏&#xff08;列&#xff09;布局的方案有哪些&#xff1f; float浮动、absolute绝对定位、flex弹性盒子、table表格布局、grid网格布局 浮动 float <style>* {margin: 0;padding: 0;}.container {width: 1…...

OPENCV C++(四)形态学操作+连通域统计

形态学操作 先得到一个卷积核 Mat kernel getStructuringElement(MORPH_RECT,Size(5,5)); 第一个是形状 第二个是卷积核大小 依次为腐蚀 膨胀 开运算 闭运算 Mat erodemat,dilatemat,openmat,closemat;morphologyEx(result1, erodemat, MORPH_ERODE, kernel);morphologyEx…...

tomcat上部署jpress

一.确保有jdk&#xff0c;tomcat和mysql环境 二.新建jpress数据库&#xff0c;新建jpress用户并赋予所有权限 三.将jpress的war上传到tomcat/apache-tomcat-8.5.70/webapps&#xff0c;具体根据你的实际tomcat安装路径为准&#xff0c;上传完成后他会自己解包 四.到浏览器完…...

篇十:外观模式:简化复杂系统

篇十&#xff1a;“外观模式&#xff1a;简化复杂系统” 开始本篇文章之前先推荐一个好用的学习工具&#xff0c;AIRIght&#xff0c;借助于AI助手工具&#xff0c;学习事半功倍。欢迎访问&#xff1a;http://airight.fun/。 另外有2本不错的关于设计模式的资料&#xff0c;分…...

linux gcc __attribute__

__attribute__ 1. 函数属性1.1 __attribute__((noreturn))1.2 __attribute__((format))1.3 __attribute__((const)) 2. 变量属性2.1. __attribute__((aligned))2.2. __attribute__((packed)) 3. 类型属性 __attribute__ 是 GCC 编译器提供的一种特殊语法&#xff0c;它可以用于…...

【SpringCloud】RabbitMQ基础

1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式&#xff1a; 同步通讯&#xff1a;就像打电话&#xff0c;需要实时响应。 异步通讯&#xff1a;就像发邮件&#xff0c;不需要马上回复。 两种方式各有优劣&#xff0c;打电话可以立即得到响应&#xff0c;…...

css, resize 拖拉宽度

效果如下&#xff1a; 可直接复制预览查看属性值: 关键样式属性&#xff1a; resize: horizontal; overflow-x: auto; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content…...

Python识别抖音Tiktok、巨量引擎滑块验证码识别

由于最近比较忙&#xff0c;所以本周搞了一个相对简单的验证码&#xff0c;就是抖音Tiktok的滑块验证码&#xff0c;这也是接到客户的一个需求。这种验证码通常在电脑端登录抖音、巨量引擎的的时候出现。 首先看一下最终的效果&#xff1a; 验证码识别过程 1、利用爬虫采集图…...

EvilBox One靶场笔记

EvilBox: One靶场笔记 信息收集 先fscan找主机192.168.1.102 namp扫端口 开放80,22端口 然后扫目录 └─$ gobuster dir -r -u http://192.168.1.102/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x php,txt,bak,html在扫secret目录&#xff0c;找…...

shell脚本中的export无效

写了一段shell脚本&#xff1a; #!/bin/bash source Tools/simulation/gazebo-classic/setup_gazebo.bash $(pwd) $(pwd)/build/px4_sitl_default export ROS_PACKAGE_PATH$ROS_PACKAGE_PATH:$(pwd) export ROS_PACKAGE_PATH$ROS_PACKAGE_PATH:$(pwd)/Tools/simulation/gazebo…...

前沿分享-鱼形机器人

可能并不太前沿了&#xff0c;是21年底的新闻了&#xff0c;但是看见了就顺便发一下吧。 大概就是&#xff0c;通过在pH响应型水凝胶中编码不同的膨胀速率而构建了一种环境适应型变形微机器人,让微型机器人直接向癌细胞输送药物从而减轻药物带来副作用。 技术原理是&#xff0c…...

摄像机终端IP地址白名单配置流程

海康摄像头配置白名单流程 1.登录海康摄像机前端 2.进入配置-系统-安全管理-IP地址过滤 3.IP地址过滤方式选择“允许” 4.点击添加按钮输入对应的IP地址或者IP网段 5.最后勾选启用IP地址过滤&#xff0c;然后保存 大华摄像头配置白名单流程 1.登录大华摄像机前端 2.进入设…...

Glibc—查看版本

方式1&#xff1a;直接查看ldd版本 ldd --versionldd (Buildroot) 2.30 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICU…...

C++物理引擎Box2D的下载,编译,VS2013配置环境

文章目录 网站和下载地址编译工具:编译box2dhelloworld测试网站和下载地址 https://box2d.org/ 下载地址 https://hub.nuaa.cf/erincatto/box2d/tags 编译工具: 1.VS2013 2.cmake 下载地址 https://cmake.org/ 编译box2d 下载box2d源码2.4.0,解压。在box2d-2.4.0目录下…...

STL容器详解——map容器

一、map容器介绍 作为关联式容器的一种&#xff0c;map 容器存储的都是 pair 对象&#xff0c;也就是用 pair 类模板创建的键值对。其中&#xff0c;各个键值对的键和值可以是任意数据类型&#xff0c;包括 C 基本数据类型&#xff08;int、double 等&#xff09;、使用结构体…...

VR全景在建筑工程行业能起到哪些作用?

在建筑工程领域&#xff0c;数字化技术为行业的发展起到巨大的推动作用&#xff0c;虽然建筑施工行业主要是依赖于工人劳动力和施工设备&#xff0c;但是VR全景在该行业中方方面面都能应用&#xff0c;从设计建模到项目交付&#xff0c;帮助建筑师以及项目方更好的理解每个环节…...

P1257 平面上的最接近点对

题目 思路 详见加强加强版 代码 #include<bits/stdc.h> using namespace std; #define int long long const int maxn4e510; pair<int,int> a[maxn]; int n; double d1e16; pair<int,int> vl[maxn],vr[maxn]; void read() { cin>>n;for(int i1;i<…...

8月1日上课内容 第一章web基础与http协议

dns与域名 网络是基于tcp/ip协议进行通信和连接的 应用层--传输层---网络层----数据链路层-----物理层 ip地址&#xff0c;我们每一台主机都有一个唯一的地址标识(固定的ip地址)&#xff0c;区分用户和计算机通信。 ip地址:32位二进制数组成的&#xff0c;不方便记忆 192.168.…...

Gson 添加数据默认值问题记录

问题&#xff1a;在用Gson add(key&#xff08;string类型&#xff09;&#xff0c;value&#xff08;必须是JsonElement子类&#xff09;&#xff09;时发现&#xff0c;value 传了 "" 空字符串&#xff08;非null&#xff09;&#xff0c;默认解析后返回null&#…...

网络编程(Modbus进阶)

思维导图 Modbus RTU&#xff08;先学一点理论&#xff09; 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议&#xff0c;由 Modicon 公司&#xff08;现施耐德电气&#xff09;于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python&#xff5c;GIF 解析与构建&#xff08;5&#xff09;&#xff1a;手搓截屏和帧率控制 一、引言 二、技术实现&#xff1a;手搓截屏模块 2.1 核心原理 2.2 代码解析&#xff1a;ScreenshotData类 2.2.1 截图函数&#xff1a;capture_screen 三、技术实现&…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...