当前位置:首页 » 安卓系统 » android分包原理

android分包原理

发布时间: 2025-04-02 21:01:28

⑴ 求问大神现在做android的hotfix用哪个框架比较好

一.基础知识1.阿里的热更新框架已经开源了。但已经很久没有更新过新版本了。当前的版本只支持到了Android4.4。由于5.0起新的ART虚拟机、更严格的SELinux策略以及对64位的支持之类的事,使得Xposed都在开发上做了很多调整。我不知道Dexposed现在是否支持,但至少阿里没有开源。2.在本地动态执行远端下发的代码是极度危险的行为。利用此方法执行非法代码等或用于绕过GooglePlay等市场的审查是违反相关协议的,也是对用户极度不负责任的行为。3.在一些访问非常密集的地方使用热更新可能会对效率产生相对比较大的影响,应该避免使用.4.我们可以对Java的ScriptEngine进行一些封装成为一个HotPatch类使得它更适合做热更新的工作。5.首先,检查热更新补丁的管道一定要建立在https上,因为下发代码是极其危险的,如果被劫持,后果是无法想象的。其次,请求时最好自动带上Android版本、手机型号、地区、版本号等信息,以方便更精确地下发,千万不能下发错。6.Java在运行时加载对应的类是通过ClassLoader来实现的,ClassLoader本身是一个抽象来,Android中使用PathClassLoader类作为Android的默认的类加载器7.我们的如果想做hotpatch,一定要保证我们的hotpacthdex文件出现在dexElements列表的前面。二.常用的热更新技术框架:基于 空间的HotFix→→要使用到androiddex分包方案→拆分dex的项目的话,可以参考一下谷歌的multidex方案实现.大众点评的NuWa←项目补丁自动化做的很完整alibaba/AndFix阿里巴巴的DexPoseddalvik_patch实现multidex使用React-Native实现app热部署的一次实践alibaba/AndFix三、常用的热更新技术框架比较AdvantagedisadavantageNuWa1,可以新增类和字段,2,兼容到6.0系统1,基本原理是classloader,类加载器2,不能修改资源文件,如图片布局等(可通过动态布局实现)AndFix1,支持Android2.3到6.0版本2,支持arm与x86系统架构3,支持dalvik和ART的runtime4,不需要重启App即可应用补丁1,不能新增类和字段,2,不能修改资源文件,3,不能修改manifest文件4,不能新增成员变量5,不能使用加固后的apk制作pacth文件四、github地址网络的同学的实现HotFix点评的同学的实现Nuwa阿里的同学的实现AndFix另:AndFix对static的支持不太好,下面是试验的Demo:添加了一个静态的字段addString:通过AndFix来制作patch会直接报错:

⑵ android studio怎么分包

这里只做Android Studio分包配置简单的介绍。
第一步:
在Gradle build文件中做如下配置:
android {
compileSdkVersion 21
buildToolsVersion "21.1.0"

defaultConfig {
...
minSdkVersion 14
targetSdkVersion 21
...

// Enabling multidex support.
multiDexEnabled true
}
...
}

dependencies {
compile 'com.android.support:multidex:1.0.0'
}

添加两句代码:
(1)multiDexEnable true
(2)compile 'com.android.support:multidex:1.0.0'
第二步:
在AndroidManifest.xml文件中做如下配置:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.android.multidex.myapplication">
<application
...
android:name="android.support.multidex.MultiDexApplication">
...
</application>
</manifest>123456789123456789

如果你要定义自己的Application,或者已经有了自定义Application,那么不需要在application节点中用android.support.multidex.MultiDexApplication,而是用自己的Application类的全名即可,而且自定义的Application也不需要继承MultiDexApplicatoin。
第三步:
如果有自定义的Application,那么在自定义的Application类中,重写attachBaseContext(),并且在其中调用super.attachBaseContext(),然后调用MultiDex.install(this) ,然后在该方法上加上@Override注解,既然是重写方法,最好加上这个注解,不过Android Studio会自动加上。
有两点可以注意:
attachBaseContext()是在ContextWrapper类中的。而MultiDexApplication继承Application,就是如第二步一样重写了attachBaseContext()方法。
不需要另外在libs中添加android-support-multidex.jar,否则会报异常。

⑶ 如何将android源码生成eclipse可用的jar包

eclipse和Myeclispe的导出功能 都是可以支持在同一个项目内 分包打成jar的 由于程序本身是有依赖关系的 所以分包的jar也是要相互支持才行。至于想复用可以做一些公共的功能包打成jar,反复使用也是可以做到的。

⑷ 【腾讯Bugly干货分享】Android Patch 方案与持续交付

腾讯Bugly开发者社区分享了一篇文章,探讨了Android应用的版本更新问题,尤其是在面对多样的系统版本和市场审核差异时,Android应用升级速度较慢,影响了迭代效率和用户体验。文章提出,借鉴Chrome浏览器的patch升级方案,通过在用户无感知下提供补丁更新,来加速bug处理和版本迭代。

近年来,Android热补丁框架如AndFix、Dexposed和nuwa等兴起,但各有局限。作者团队经过评估,发现AndFix与现网版本匹配但存在代码修改限制和维护难度问题,nuwa仅支持Java代码更新,无法满足全部需求。因此,他们决定自研patch方案,将应用视为加载器,仅负责启动和资源定位,新功能或修复通过下发补丁文件实现。

该方案设计巧妙,通过代理Application的创建过程和生命周期管理,支持所有代码和资源的更新。尽管存在反射Application的复杂性,但通过精心设计,成功解决了加载问题。同时,通过将dex文件分包,解决了类引用变更引发的兼容性问题。然而,Multidex方案在某些特定设备上表现不佳,团队最终转向HackClassLoader,解决了多线程加载问题。

文章最后强调,团队的patch方案旨在提供无缝的开发流程,开发者只需正常打包,patch包生成和应用不会影响正向开发。通过与微信读书的试行,这种持续交付方式有望加速版本迭代,减少线上问题,并收集用户反馈,进一步优化产品。

⑸ Android ble (蓝牙低功耗) 中的坑和技巧

new ScanFilter.Builder().setServiceUuid(ParcelUuid.fromString("00007777-0000-1000-8000-00805f9b34fb");

此时可以根据manfacturerData来匹配自己设定的外围设备

在BluetoothGattCallback中的关于此问题有三步回调
1、 public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState)

2、 public void onServicesDiscovered(BluetoothGatt gatt, int status)
mBluetoothGatt.discoverServices()执行后得到的callback,如果状态为GATT_SUCCESS,则可以获取ble旁支发起广播的service和descriptor,把广播设为enable

3、 public void onDescriptorWrite(BluetoothGatt gatt, BluetoothGattDescriptor descriptor, int status)
只有这一步status == BluetoothGatt.GATT_SUCCESS,才可以真正的传输数据,如果在第一步或者第二步就开始传输数据,会在某些特定的case下导致未知的bug或者空指针错误

所以,在中心设备跟外围开始连接后,你可以设定一个超时时间,在超时时间过后,依然没能回调onDescriptorWrite并获得BluetoothGatt.GATT_SUCCESS,则此次过程失败,你可以根据实际情况进行重连或者提示错误

如果要传输大于20字节的数据怎么办?

1、 系统mtu可以支持修改到512字节,完成大数据量的传输。但是由于涉及到中心和旁支都需要修改,会造成很大的局限性和底层修改量,而且会触发比如某些设备第一次修改不生效,另一个设备一次连接中只能修改一次等bug,非常不可取,十分不建议。

2、分包传输,自己设计协议分包传输是最可取的方案,需要注意的是在分包后,每一个包之间写入数据需要设置间隔,比如100ms。

在做好5和6的基础上,依然会在一些设备上出现,由于系统原因,ble刚开始的发送第一个数据出现丢包,请对此做出特殊处理。

⑹ Android-Ble蓝牙开发Demo示例–扫描,连接,发送和接收数据,分包解包(附源码)

万物互联的物联网时代的已经来临,ble蓝牙开发在其中扮演着举重若轻的角色。最近刚好闲一点,抽时间梳理下这块的知识点。

涉及ble蓝牙通讯的客户端(开启、扫描、连接、发送和接收数据、分包解包)和服务端(初始化广播数据、开始广播、配置Services、Server回调操作)整个环节以及一些常见的问题即踩过的一些坑。

比如
1、在Android不同版本或不同手机的适配问题,扫描不到蓝牙设备
2、如何避免ble蓝牙连接出现133错误?
3、单次写的数据大小有20字节限制,如何发送长数据

蓝牙有传统(经典)蓝牙和低功耗蓝牙BLE(Bluetooth Low Energy)之分,两者的开发的API不一样,本文主讲Ble蓝牙开发,传统蓝牙不展开,有需要的可以自行了解。

相对传统蓝牙,BLE低功耗蓝牙,主要特点是快速搜索,快速连接,超低功耗保持连接和数据传输。

客户端

服务端

Android4.3(API Level 18)开始引入BLE的核心功能并提供了相应的 API。应用程序通过这些 API 扫描蓝牙设备、查询 services、读写设备的 characteristics(属性特征)等操作。

BLE蓝牙协议是GATT协议, BLE相关类不多, 全都位于android.bluetooth包和android.bluetooth.le包的几个类:
android.bluetooth.
.BluetoothGattService 包含多个Characteristic(属性特征值), 含有唯一的UUID作为标识
.BluetoothGattCharacteristic 包含单个值和多个Descriptor, 含有唯一的UUID作为标识
.BluetoothGattDescriptor 对Characteristic进行描述, 含有唯一的UUID作为标识

.BluetoothGatt 客户端相关
.BluetoothGattCallback 客户端连接回调
.BluetoothGattServer 服务端相关
.BluetoothGattServerCallback 服务端连接回调

android.bluetooth.le.
.AdvertiseCallback 服务端的广播回调
.AdvertiseData 服务端的广播数据
.AdvertiseSettings 服务端的广播设置
.BluetoothLeAdvertiser 服务端的广播

.BluetoothLeScanner 客户端扫描相关(Android5.0新增)
.ScanCallback 客户端扫描回调
.ScanFilter 客户端扫描过滤
.ScanRecord 客户端扫描结果的广播数据
.ScanResult 客户端扫描结果
.ScanSettings 客户端扫描设置

BLE设备分为两种设备: 客户端(也叫主机/中心设备/Central), 服务端(也叫从机/外围设备/peripheral)
客户端的核心类是 BluetoothGatt
服务端的核心类是 BluetoothGattServer 和 BluetoothLeAdvertiser
BLE数据的核心类是 BluetoothGattCharacteristic 和 BluetoothGattDescriptor

下面详细讲解下客户端和服务端的开发步骤流程

安卓手机涉及蓝牙权限问题,蓝牙开发需要在AndroidManifest.xml文件中添加权限声明:

在搜索设备之前需要询问打开手机蓝牙:

注意: BLE设备地址是动态变化(每隔一段时间都会变化),而经典蓝牙设备是出厂就固定不变了!

通过扫描BLE设备,根据设备名称区分出目标设备targetDevice,下一步实现与目标设备的连接,在连接设备之前要停止搜索蓝牙;停止搜索一般需要一定的时间来完成,最好调用停止搜索函数之后加以100ms的延时,保证系统能够完全停止搜索蓝牙设备。停止搜索之后启动连接过程;

BLE蓝牙的连接方法相对简单只需调用connectGatt方法;

参数说明

与设备建立连接之后与设备通信,整个通信过程都是在BluetoothGattCallback的异步回调函数中完成;

BluetoothGattCallback中主要回调函数如下:

上述几个回调函数是BLE开发中不可缺少的;

当调用targetdDevice.connectGatt(context, false, gattCallback)后系统会主动发起与BLE蓝牙设备的连接,若成功连接到设备将回调onConnectionStateChange方法,其处理过程如下:

判断newState == BluetoothGatt.STATE_CONNECTED表明此时已经成功连接到设备;

mBluetoothGatt.discoverServices();

扫描BLE设备服务是安卓系统中关于BLE蓝牙开发的重要一步,一般在设备连接成功后调用,扫描到设备服务后回调onServicesDiscovered()函数,函数原型如下:

BLE蓝牙开发主要有负责通信的BluetoothGattService完成的。当且称为通信服务。通信服务通过硬件工程师提供的UUID获取。获取方式如下:

具体操作方式如下:

开启监听,即建立与设备的通信的首发数据通道,BLE开发中只有当客户端成功开启监听后才能与服务端收发数据。开启监听的方式如下:

BLE单次写的数据量大小是有限制的, 通常是20字节 ,可以尝试通过requestMTU增大,但不保证能成功。分包写是一种解决方案,需要定义分包协议,假设每个包大小20字节,分两种包,数据包和非数据包。对于数据包,头两个字节表示包的序号,剩下的都填充数据。对于非数据包,主要是发送一些控制信息。
监听成功后通过向 writeCharacteristic写入数据实现与服务端的通信。写入方式如下:

其中:value一般为Hex格式指令,其内容由设备通信的蓝牙通信协议规定;

若写入指令成功则回调BluetoothGattCallback中的onCharacteristicWrite()方法,说明将数据已经发送给下位机;

若发送的数据符合通信协议,则服务端会向客户端回复相应的数据。发送的数据通过回调onCharacteristicChanged()方法获取,其处理方式如下:

通过向服务端发送指令获取服务端的回复数据,即可完成与设备的通信过程;

当与设备完成通信之后之后一定要断开与设备的连接。调用以下方法断开与设备的连接:

源码上传在CSDN上了,有需要的可以借鉴。

=====> Android蓝牙Ble通讯Demo示例源码–扫描,连接,发送和接收数据,分包解包

BLE单次写的数据量大小是有限制的,通常是20字节,可以尝试通过requestMTU增大,但不保证能成功。分包写是一种解决方案,需要定义分包协议,假设每个包大小20字节,分两种包,数据包和非数据包。对于数据包,头两个字节表示包的序号,剩下的都填充数据。对于非数据包,主要是发送一些控制信息。
总体流程如下:
1、定义通讯协议,如下(这里只是个举例,可以根据项目需求扩展)

2、封装通用发送数据接口(拆包)
该接口根据会发送数据内容按最大字节数拆分(一般20字节)放入队列,拆分完后,依次从队列里取出发送

3、封装通用接收数据接口(组包)
该接口根据从接收的数据按协议里的定义解析数据长度判读是否完整包,不是的话把每条消息累加起来

4、解析完整的数据包,进行业务逻辑处理

5、协议还可以引入加密解密,需要注意的选算法参数的时候,加密后的长度最好跟原数据长度一致,这样不会影响拆包组包

一般都是Android版本适配以及不同ROM机型(小米/红米、华为/荣耀等)(EMUI、MIUI、ColorOS等)的权限问题

蓝牙开发中有很多问题,要静下心分析问题,肯定可以解决的,一起加油;

热点内容
我的世界如何在服务器搞挖掘榜 发布:2025-04-03 19:48:56 浏览:463
联通缴费充值卡密码是什么 发布:2025-04-03 19:41:02 浏览:759
Android大图片上传 发布:2025-04-03 19:30:29 浏览:378
存储空间和实际不一样怎么办 发布:2025-04-03 19:27:17 浏览:889
linux怎么打开zip文件怎么打开 发布:2025-04-03 19:11:40 浏览:54
安卓手机你女朋友都去过哪里 发布:2025-04-03 19:02:47 浏览:110
流媒体服务器搭建公司 发布:2025-04-03 18:54:15 浏览:812
抓屏源码 发布:2025-04-03 18:35:59 浏览:943
聚集索引sqlserver 发布:2025-04-03 18:25:13 浏览:496
凑十算法 发布:2025-04-03 18:25:13 浏览:521