安卓SDK开发的一些疑问
目前,公司需要开发一套iOS和安卓的sdk,主要包含蓝牙管理、网络请求、倒计时等方案执行、蓝牙数据交互等功能。之前没有过开发安卓sdk的经历,写个笔记用以记录。
现在iOS sdk已经写了一部分,安卓开发我也习惯从iOS的角度类比来开发,节省时间。在开始具体开发之前,先将几个问题具体弄清楚,然后再一步步具体进行。
问题1: 与iOS的类比,是否可以生成类似iOS的静态库.a
或者动态库.dylib
来给第三方使用?
在安卓开发中,并没有.a
静态库和.dylib
这种动态库,但是有另外类似的两种形式:JAR
和AAR
。
- JAR(Java ARchive):这种库的形式主要用来封装java类(当然kotlin也是没有问题的),类似于iOS的
.a
静态库,但是只能包含java代码,不能包含资源文件(例如XML布局,Android的Manifest.xml,本地库(.so文件等))。 - 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
仓库,如JCenter
、Maven Central
或JitPack
,然后在build.gradle
文件中添加远程库依赖。这种方式最为常见,它也允许其他开发者很容易地使用和更新你的sdk
。
当然,也可以不发布到这些仓库。让开发者直接下载aar,然后放在libs
目录下,然后在项目的build.gradle
文件中添加本地库依赖。这种方式适用于SDK
尚未发布,或只在少数项目中使用的情况。
第3中方式,也可以通过自己服务器分发或者私有Maven仓库
来分发。
问题3:安卓封装成AAR的sdk,是否像sdk的动态库或者静态库那样,能看到对应的头文件及具体可以调用的方法?
两个平台还是有蛮大的差异。在iOS使用的.a
静态库时,一般会将header
头文件暴露给三方使用者,而具体实现则在.a
里面变为二进制文件无法查看。但在安卓中,AAR
中包含的实际上是Java的.class
和kotlin
编译后的字节码。不考虑通过工具反编译等因素的话,直接是不能查看其源代码的。给第三方使用时,更加依赖于文档说明、示例代码等。
问题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
。主要出于两个原因:
- 我个人感觉,
Objective-C
这种将声明和实现分分别在两个文件中来写的语言,天然地更加适合sdk开发。私有的属性和方法,可以直接写在.m
文件中,给三方调用的,直接写在.h
中,更加清晰。虽然调试过程中,私有的属性和方法等,不可避免地也会暴露,但是在正常情况下,它更加简单和容易。 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的角度类比来开发…...

【基础类】—三栏页面布局的方案和优缺点
一、假设高度已知,中间宽度自适应,三栏(列)布局的方案有哪些? 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,tomcat和mysql环境 二.新建jpress数据库,新建jpress用户并赋予所有权限 三.将jpress的war上传到tomcat/apache-tomcat-8.5.70/webapps,具体根据你的实际tomcat安装路径为准,上传完成后他会自己解包 四.到浏览器完…...
篇十:外观模式:简化复杂系统
篇十:“外观模式:简化复杂系统” 开始本篇文章之前先推荐一个好用的学习工具,AIRIght,借助于AI助手工具,学习事半功倍。欢迎访问:http://airight.fun/。 另外有2本不错的关于设计模式的资料,分…...

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 编译器提供的一种特殊语法,它可以用于…...

【SpringCloud】RabbitMQ基础
1.初识MQ 1.1.同步和异步通讯 微服务间通讯有同步和异步两种方式: 同步通讯:就像打电话,需要实时响应。 异步通讯:就像发邮件,不需要马上回复。 两种方式各有优劣,打电话可以立即得到响应,…...

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

Python识别抖音Tiktok、巨量引擎滑块验证码识别
由于最近比较忙,所以本周搞了一个相对简单的验证码,就是抖音Tiktok的滑块验证码,这也是接到客户的一个需求。这种验证码通常在电脑端登录抖音、巨量引擎的的时候出现。 首先看一下最终的效果: 验证码识别过程 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目录,找…...
shell脚本中的export无效
写了一段shell脚本: #!/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…...

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

摄像机终端IP地址白名单配置流程
海康摄像头配置白名单流程 1.登录海康摄像机前端 2.进入配置-系统-安全管理-IP地址过滤 3.IP地址过滤方式选择“允许” 4.点击添加按钮输入对应的IP地址或者IP网段 5.最后勾选启用IP地址过滤,然后保存 大华摄像头配置白名单流程 1.登录大华摄像机前端 2.进入设…...
Glibc—查看版本
方式1:直接查看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容器介绍 作为关联式容器的一种,map 容器存储的都是 pair 对象,也就是用 pair 类模板创建的键值对。其中,各个键值对的键和值可以是任意数据类型,包括 C 基本数据类型(int、double 等)、使用结构体…...

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

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地址,我们每一台主机都有一个唯一的地址标识(固定的ip地址),区分用户和计算机通信。 ip地址:32位二进制数组成的,不方便记忆 192.168.…...

Gson 添加数据默认值问题记录
问题:在用Gson add(key(string类型),value(必须是JsonElement子类))时发现,value 传了 "" 空字符串(非null),默认解析后返回null&#…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

Docker 运行 Kafka 带 SASL 认证教程
Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明:server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...