安卓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&#…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...