近日,个推TechDay携手GDG广州,邀请了多位跨领域的Android开发专家,以“Kotlin Everywhere,演进Android开发生态”为主题,与在场来宾一同探索了Android开发领域的前沿技术及实践方法。


以下是广州站分享嘉宾的精华提炼:


李健民,个推Android研发工程师

《移动应用安全》


李健民阐述了移动安全中移动恶意攻击的四个主要方向:网络安全、数据安全、代码安全、设备安全。


网络安全

网络安全分为四个部分:数据防泄露、请求防重放、内容防篡改、身份防伪装。解决数据防泄露的关键在于一定要对数据进行加密处理。请求防重放则可以通过请求时在参数中携带时间戳、随机数、流水号、“时间戳+流水号”这四种方式措施来予以防护。


数据安全

针对存储的安全防护,我们在数据落地的时候一定要进行加密处理,防止他人拿到重要的敏感数据。其次,我们要创建私有类型数据,尽量用(private)的创建方式,而不是全局的创建方式。


代码安全

常见逆向工程套路主要分为三种:反编译、脱壳、动态分析。以下四种方式可以防止代码反编译:代码混淆、签名验证、利用反编译工具漏洞进行防护、加固。防动态分析则可以从反调试、反posed、反root三个维度进行入手。


设备安全

开发者可以通过检查设备所处的环境来判断设备是否处于异常的状态。如果设备状态异常,则很可能处于黑产工具的控制下。黑产的攻击场景主要有以下四种:渠道推广、登录注册、营销活动、社区互动。APP开发者可以通过检测设备上的相应的风控信息,通过多维度的风控检测模型标识高风险的用户,并将风险等级告知客户端,以此进行一些防护。


个推作为专业的数据智能服务商,拥有海量数据资源,在移动安全领域也推出了相应的数据解决方案-个验。个验是个推旗下的“一键认证”产品,可以帮助APP开发者实现高效、极速、安全稳定的认证登录过程,优化用户体验。此外,个验还为APP开发者提供风险识别与风险防护的系列方案。在风险识别方面,个验可以通过设备、网络、行为等多维度识别设备风险。准确识别出风险用户后,企业可在业务上对风险用户进行限制。在风险防护方面,个验在不影响正常用户使用的情况下,通过动画验证码阻止恶意自动化程序的进一步操作。


Nicky, 阿里巴巴创新事业部高级工程师、GDG 广州 组织者

《移动出海的困局与对策——开发者篇》


Nicky 主要从三方面解读“移动出海”:出海浪潮、出海的困局、出海的对策。手机厂商借助预装形式,为移动互联网出海带来了新的增长空间。Nicky 认为,中国移动互联网出海的发展历程可以分为五个阶段:开端、探索期、发展期、爆发期、升级期。


出海的困局可以归结为三点:一是无法判断设备的好坏;二是无法定义当前网络的好坏;三是无法找到其他工具利器来为APP提供良好的海外体验。针对这三大困局,Nicky一一提供了解决对策:


如何判断设备的好坏?

Facebook给出year维度来评估机器性能,但不够直观,无法解决开发者想要了解机器的高中低情况或者占比的问题。我们可以修改源码,定义某些参数维度是高端机,中端,低端,这样做性能交流也更直观了。


如何定义当前网络的好坏?

可以借助用Facebook的networkclass开源工具类来判断当前的网络状况。类似平常做的电信网络测速一样,networkclass通过多次测试,测出平均值,再给出一个标准,会根据当前一兆每秒,几百K等等,来定义出当前网络的好坏。


如何借助其他工具利器来为APP提供良好的海外体验?

Google 提供了Android One、Android Go、KaiOS三大工具。Android One的特点为价格亲民、系统易用。Android Go的优势在于会根据用户的机器性能情况来推荐相匹配的APP版本,让高端机、低端机都能有更好的使用体验。KiaOs作为世界第三大移动系统,通过低价的切入点打入低端用户,把更多的国际用户拉到互联网人群来做信息的传递。


Nicky总结道,开发者在移动出海过程中应不断强化三点:一是借助平台进行本地环境测试;二是借助平台进行设备分析和网络分析;三是在性能优化同时,兼顾业务数据与ROI。


伍裕平,汇丰软件工程师、FCC广州负责人

《Kotlin Multi-platform开发踩坑记》


伍裕平的演讲主要围绕“如何入‘Kotlin Multi-platform’坑”、“如何踩坑和填坑”进行展开。

他说道,选择Kotlin Multi-Platform是因为该项目可以将一份 Kotlin 代码同时编译成

JVM 的 class 文件和 JavaScript 文件,从而减少开发中的重复劳作。


伍裕平为大家梳理了他在开始一个Kotlin Multi-Platform项目种所踩过的各种坑,并为大家提供了对应的填坑方案。在Kotlin 编译成 JavaScript过程中,他指出首先要避免“plugin 1.3.31 及以前默认不模块化”这个坑,要在build.gradle的kotlin闭包里加一句指定模块化方式。用模块化(如AMD、CommonJS方式)的话,在JavaScript中使用Kotlin中的类是要用“导入对象+包+类名”。其次,由于JavaScript 不支持泛型和函数重载,Kotlin在编译过程中会默认在函数名后加一个哈希串,而这会导致调用的时候不够便利,所以他提出了用JsName指定变成相应的函数名称的解决方案。


在Kotlin 编译成 Java过程中,Kotlin默认丢掉默认参数,可以通过就加“JvmOverloads”的方式把默认值予以保留。


将 Java API 迁移到 Kotlin过程中,坑主要有以下几种:

一、 Kotlin 编译成 Java class 时,默认把非 private 属性变为 private 属性 + getter & setter。开发者通过“把属性改为 private,把非 private 访问修饰符放在 getter / setter 上”的方法进行填坑。

二、 Kotlin 本身没有 static。要解决这个问题,开发者可以在Static上加一个“JvmStatic”。

三、 其他平台不一定有 transient、volatile、synchronized,解决方式是添加“kotlin.jvm.Transient”、“kotlin.jvm.Volatile”、“kotlin.Synchronized”。


林起钊,软通动力安卓工程师

《跨平台演进之路》


林起钊的演讲围绕三方面展开:C和Java实现跨平台原理简析、热门跨平台技术简介、安卓系统中使用的跨平台技术。林起钊认为C语言实现跨平台主要是靠各个平台上的编译器,但系统调用(进程、线程、文件操作、内存管理等)需要单独适配。而Java跨平台是建立在“虚拟机”的基础上的,它通过JVM在程序运行时将.class文件解释执行,其字节码文件只能在装有JVM的系统上运行。


林起钊认为目前热门跨平台技术主要包括Hybrid、React-Native、Flutter、Kotlin四种,并对Flutter、和Kotlin进行了详细解读。基于dart语言,Flutter直接通过Skia图像处理引擎渲染界面,而平台适配及硬件对接等功能可以通过Plugin来完成。Flutter平台适配工作量大,技术生态有限。Kotlin的出现是为了能够通过编译直接转换为Java或JavaScript、Objective-C代码,以及简化代码及提高代码安全性。Google随后推出了Kotlin Multiplatform实现了跨平台功能。


安卓系统中使用的跨平台技术主要为:AndroidRuntime、Project Treble。AndroidRuntime虚拟机基于寄存器(cpu上的一块高速缓存),在APK运行之前,就对其包含的Dex字节码进行翻译,得到对应的本地机器指令。Treble架构是8.0版本推出的新元素,旨在让供应商实现(由芯片制造商编写的设备专属底层软件),与 Android 操作系统框架分离开来。新的架构之下,framework和hal运行于不同的进程,所有的HAL采用新的HIDL技术来对接。