instant app入门和开发指南

2023-05-16

本文由玉刚说写作平台提供写作赞助,赞助金额:300元
原作者:AndroFarmer
版权声明:未经本公众号许可,不得转载

概述

instant app 是谷歌推出的类似于微信小程序(或者说小程序类似于instant app)的一项技术,用户无须安装应用,用完就走,同时兼备h5的便捷和原生应用的优质体验。

工作方式和应用场景

工作方式:

当用户点击链接时,通过applink去打开相应的instant app,如果之前没有打开过,则会从play store去下载并打开,整个过程一气呵成,跟浏览器打开网页,如果有缓存先读缓存,没有就去服务器loading一样

应用场景:

  • 通过直接点击链接进入(从社交网络或短信中点击链接)
  • 通过浏览器搜索,如搜索X电商的y商品,通过点击浏览器的搜索结果可直接进入instant app
  • 通过google play 可以先试用部分功能,觉得不错再安装完整功能
  • 在游戏中方面的应用,跟上面类似,更偏相向于试玩

如何创建模板Demo

  • 创建一个project
  • 当走到选择form和sdk版本时,勾选 “include android instant app support“
  • 如果没有安装相应support,去sdktools下安装
  • 填写apps link 相关的url 参数,这里作为创建演示用默认值就好
  • 项目创建完成后会生成4个模块

    至此一个模板instant app创建过程就完成了

项目结构

4个模块

  • app 类型:com.android.application
  • base 类型:com.android.feature
  • feature 类型:com.android.feature
  • instantapp 类型:com.android.instantapp

2个入口

  • app
  • instantapp

项目解析

传统方式创建一个项目,会生成一个app的模块,创建instant app 也会创建一个app模块,但功能跟传统的不太一样,传统的app模块基本上是整个项目的核心,所有的资源和代码实现都在这里,但instant app中app模块,充当的是传统app入口,具体代码实现交给base 和feature模块去完成同样的instantapp模块也是作为入口,它是作为instant app的入口。

  • 模块间的关系图
  • 模块间的关系总结
  1. 模块app 和instantapp 一般作为入口不负责具体的代码实现
  2. base模块和feature模块都可以做具体逻辑实现,base侧重公用部分的代码实现和公共资源的存放,feature则侧重于独立模块功能的实现
  3. base模块有且只有一个
  4. feature可以没有或有多个
  5. feature与base的gradle文件差异

    可以看到feature可以通过 声明 “ baseFeature true” 变成basefeature

写一个例子

我们来写一个例子,进一步介绍instant app
项目很简单,就是一个商品列表和商品详情

以instantapp方式运行看下运行效果(后面演示以app方式运行),多任务下显示一个闪电图标,代表这是一个instant app,并且在桌面找不到图标

在应用管理里面会多出 instant app的类别,在这里可以选择清除instant app 或者安装完整版app

打包过后,app模块下会生成app-debug.apk,instantapp模块下会生成 instantapp-debug.zip,并且 instantapp-debug.zip包含三个文件 :base-debug.apk,productlist-debug.apk,productdesc-debug.apk
我们可以根据需求在dependencies中配置让instantapp中打包一个或多个模块进去,但是base模块是必须的

 

多个feature间的数据交互

上面的例子我们用了两个feature:productlist,productdesc,他们之前是如何进行交互的呢。
先来看下他们俩的dependencies
productlist:

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation project(':base')
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

producdesc:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation project(':base')
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

可以看出,他们都依赖base模块,但相互之间没有关系。当然我们可以在productlist中去implementation project(‘:producdesc’) 这样可以可以访问producdesc模块了,但是这不符合instant app 模块化设计的思路了,这样就没法根据需求app和installapp 只打包各自需要的模块了,这里我们可以使用deep links,通过隐式的intent去打开productdesc,这样模块之间就可以解耦访问了
这里先看下我的例子中deep links的配置,后面会详细介绍

<activity android:name=".ProductDesc" android:label="商品详情">
    <intent-filter >
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data
            android:host="androfarmer.com"
            android:path="/productdesc"
            android:scheme="https" />
    </intent-filter>
</activity>

那么根据我们的deep links 去写intent如下

Intent it=new Intent();
it.setAction(Intent.ACTION_VIEW);
it.addCategory("android.intent.category.BROWSABLE");
it.addCategory("android.intent.category.DEFAULT");
it.setData(Uri.parse("https://androfarmer.com/productdesc"));
it.putExtra("data",datas.get(position));
ActivityCompat.startActivity(ProductList.this,it,null);

看下运行效果

这样是可以打开,但是会弹出选择框让我们选择用哪个应用打开。要解决这个问题 我们可以在上面代码中加入这一句

it.setPackage(getPackageName());

这样就可以不出先弹窗直接进入productdesc页面了

前面我们说过instant app是可以通过链接直接打开app,没有弹窗,但是我们从外部链接打开的话不可能知道我们的app的包名,所以一旦我们的intent无法从系统中所有的app找到唯一值的化,系统就会弹出框让我们选择哪一个app打开,要做到从外部无弹窗打开就需要用到app links。
以下是用adb 命令模拟从外部打开应用的情况

 adb shell am start -W -a android.intent.action.VIEW -d https://androfarmer.com/productlist

App Links

关于deep links 这里就不做详细介绍了,大家可以搜索下资料还是挺多的,简单点来说,app links也属于 deep links,app links做了更严格的限制条件,以保证链接是安全可靠的

下面先看一张官方的两者之间的对比图

可以看到,app links对比deep links 做了更为严格的要求

  • scheme只能是http 或https
  • action必须android.intent.action.VIEW
  • category必须包含 android.intent.category.BROWSABLE 和 android.intent.category.DEFAULT
  • 系统版本有最低6.0的要求
  • 需要数字资产链接文件完成链接的验证(下面介绍)

看下我们例子中配置的app links

<activity android:name=".ProductList"  android:label="商品列表">
    <intent-filter
        android:autoVerify="true" >
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.BROWSABLE" />
        <category android:name="android.intent.category.DEFAULT" />
        <data
            android:host="androfarmer.com"
            android:path="/productlist"
            android:scheme="https" />
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

android:autoVerify=”true” 这个标明,它是自动验证的, 把这个去掉就符合deep link的规则了

Link Verfication(数字资产链接验证)

要完成链接的验证我们有个需要有个站点,并且要在站点根目录配置一个”.well-known” 文件夹,文件夹中需要配置一个名为”assetlinks.json“数字资产链接文件,
文件内容的格式如下:

[{
  "relation": ["delegate_permission/common.handle_all_urls"],
  "target" : { "namespace": "android_app", "package_name": "com.androfarmer.instant.app",
               "sha256_cert_fingerprints": ["0E:2E:C0:8B:99:AA:F3:51:4C:EF:A5:14:A6:B9:0E:EA:85:FD:A6:F6:AB:A2:40:DB:27:C9:45:2E:8F:4E:97:D6"] }
}]

最终要保证在浏览器上测试 https://domain.name/.well-known/assetlinks.json 这个数字资产链接文件可以正常访问
domain.name替换成你的站点域名,并且要与我们app中配置的app links域名一致
assetlinks.json文件通过 https://developers.google.com/digital-asset-links/tools/generator 官方站点去生成和验证,一定要通过验证才能使用。

也可以直接在上面的基础上修改 package_name 和 sha256_cert_fingerprints的值,这两个值 也就是我们app的application id和签名文件的sha256值
经过这个步骤以后,我们再通过链接去打开我们的app就不会出现选择弹窗直接打开我们的app了。由于条件不允许(没有个人站点),这里就不演示了
如果要体验完整的instant app流程的话 还需要将app 和instant app的包都上传到google的play store才可以。

Tips & Suggestion

  • 要使用模拟器测试instant app,最好使用 Android 8.1以上系统,并且必须硬件架构选择x86 不能是x86_64
  • App Links Assistant 可以帮助我们生成app links 工具在as菜单栏tools下找到
  • assetlinks.json 可配置一个站点关联一个或多个app,或者一个app关联多个站点,具体详见官方链接https://developer.android.com/training/app-links/verify-site-associations
  • instant app 可以使用的权限:
  • ACCESS_COARSE_LOCATION
  • ACCESS_FINE_LOCATION
  • ACCESS_NETWORK_STATE
  • BILLING
  • CAMERA
  • INSTANT_APP_FOREGROUND_SERVICE (API level 26 or higher)
  • INTERNET
  • READ_PHONE_NUMBERS (API level 26 or higher)
  • RECORD_AUDIO
  • VIBRATE
  • 对于已经发布应用市场的instant app 可以通过调用 showInstallPrompt() 去引导用户安装完整版的app
  • 可以调用 isInstantApp()查看是否是instant app 这对于权限判断比较重要,比如你的app和instant app共用feature的情况
  • instant app 不能脱离完整版的app 必须先上传app 才能上传instant app
  • instant app 单个feature的大小限制是4MB,但没有总大小的显示,所以如果项目体积比较大可以通过多feature方案解决

好了最后附上一张 google trips 在应用市场的截图,install 右边有个 try now 这个就是instant app在应用商场上的入口

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

instant app入门和开发指南 的相关文章

  • blob excel文件导出

    vue 项目中excel文件导出 xff1a exportData 点击方法名称 jjrExport this years then res 61 gt this years为请求参数 console log res const type
  • 知识管理——学习篇

    你的知识需要管理 田志刚 2009年11月 现在 xff0c 根据本书的理念 xff0c 你的使命不仅仅是获取该书的知识 xff08 获取什么 xff1f 他的前瞻性思考判断 xff0c 人家10年前有这种知识管理预见和意识 xff01 作
  • dependencyManagement_前进的火车_新浪博客

    dependencyManagement使用简介 Maven中的dependencyManagement元素提供了一种管理依赖版本号的方式 在dependencyManagement元素中声明所依赖的jar包的版本号等信息 xff0c 那么
  • 【Redis】Redis简介与基本特性

    简介 Redis 全称为 Remote DIctionary Server xff0c 本质上是一个 key value 存储系统 xff0c 属于跨平台的非关系型数据库 Redis 官方对它的定义是 xff1a Redis is an o
  • 【Java 集合类】Collections 类源码分析

    Collections 类源码分析 包路径 xff1a jdk1 8 0 111 rt jar java util Collections java Collections是JDK提供的工具类 xff0c 同样位于java util包中 它
  • 首个Adobe XD教程丨如何用Adobe Experience Design (XD)快速设计图标

    提示 xff1a 阅读本文前建议先从 码农与产品经理看过来 教你用Adobe Xd轻松做原型设计 文章入手 xff0c 会更加学度的掌握此建模神器的精髓http www zoomla cn blog techs 3080 shtml 逐浪小
  • 关于ubuntu下终端打开一闪就退出的一种情况

    终端ctrl 43 alt 43 t后终端一闪即过 首先你换一下访客进入ubuntu查看是否可以打开终端 可以 xff0c 请接着往下看 xff0c 否则抱歉 xff01 首先请你回想一下 xff0c 在这之前你对系统有没有做过什么更改 x
  • 如何转行游戏行业及我眼中的理想游戏开发团队

    前置内容 xff1a 很久没有写文章啦 xff0c 今天就来继续和大家聊一聊关于游戏制作的一些东西 今天主要聊两个方面 xff0c 一个是其他行业转游戏行业的一些注意事项以及需要具备的东西 xff1b 第二是和大家聊一聊我心目中理想的游戏开
  • 浅谈重载new操作符

    new是C 43 43 里非常重要的一个关键词 xff0c 用于申请内存 初始化对象 俗话说 有借有还再借不难 xff0c 通过new向操作系统 借 到的内存用完后必然要 还 回去 xff0c 所以对应地还有一个delete操作符与new共
  • SettingProvider工作原理

    1 基本介绍 SettingsProvider是一个提供设置数据共享的Provider xff0c 可以简单理解为数据库 xff0c 它包含全局性 系统级别的用户编好设置 xff0c 例如在手机中的Settings应用 xff0c 用户可以
  • 多普勒失真信号重采样的Matlab仿真分析

    多普勒失真信号重采样的Matlab仿真分析 应用场景 水声通信指的是使用声信号在水中传输数据 相对而言 xff0c 电磁信号在水中吸收严重衰减过快 xff0c 光信号受水中悬浮颗粒的影响 xff0c 也无法完成远距离传输 这两种信号的传播距
  • 1——Qt安装(ubuntu16.04 + Qt 5.14.2)

    下载Qt http download qt io archive qt 注 xff1a 下载Qt 5 14 2文件夹下的 run 文件 安装Qt 进入下载文件所在位置 xff0c 打开命令行终端 chmod 777 qt opensourc
  • git设置单个仓库用户名以及密码

    有些时候我们的服务器可能要部署多个git仓库 xff0c 不同git仓库的用户名以及密码都是不一样的 xff0c 此时需要我们设置单个仓库的用户名以及密码 1 git设置用户名以及邮箱 命令如下 xff1a git config user
  • php 多版本切换

    项目开发中实际会存在 xff0c php版本不同的情况 下面看具体实现方法 以下均是在 windows 下操作完成 1 先看一下我本地的 php 版本 我这里默认版本是php7 1 xff0c 下面看一下环境变量配置 默认版本不需要改 ph
  • apt-get 安装某个包时出现各种依赖包没有安装、版本不对互相套娃的一种解决方法

    错误信息 Depends 某某包 but it is not going to be installed 或者 Depends 某某包 61 某某版本 but 某某版本 is to be installed 本人是用的树莓派raspbian
  • Python 中更优雅的日志记录方案

    在 Python 中 xff0c 一般情况下我们可能直接用自带的 logging 模块来记录日志 xff0c 包括我之前的时候也是一样 在使用时我们需要配置一些 Handler Formatter 来进行一些处理 xff0c 比如把日志输出
  • 用Python抓包工具查看周边拼车情况

    说起Python爬虫 xff0c 很多人第一个反应可能会是Scrapy或者Pyspider xff0c 但是今天文章里用到是Python下一个叫Mitmproxy的抓包工具 xff0c 对付一些非常规的数据获取还是很有效的 不过凡事都是有利
  • Origin(教育版)无法更改语言是灰色的办法

    用edu后缀的邮箱可以申请正版Origin pro xff0c 但是本人下载下来后是英文版 xff0c 绘图的时候里面很多的专有名词真的一头雾水 xff0c 查看网上的教程说修改注册表 xff0c 试了后发生错误 xff0c 再次打开还是原
  • centos虚拟机切换为命令行模式

    打开命令终端Terminal 输入以下 systemctl set default multi user target 设置成命令模式 或 systemctl set default graphical target 设置成图形模式 最后
  • ubuntu操作不当,桌面图标和菜单栏消失怎么办

    最近配置一些文件没有成功 xff0c 重启后 xff0c 桌面只剩下文件和回收站 xff0c 我们可以通过终端输入指令来解决这个问题 xff0c 亲测有效 先用apt get install指令重装桌面 xff1a 快捷键或者右键打开终端

随机推荐

  • 应用宝-ysdk-米大师 对接道具直购服务器端下单模式 java服务端开发日志

    用于接收回调请求的linux服务器证书配置 xff1a 回调服务器配置分三种 xff0c 前两种是当服务部署在腾讯云上时的配置方式 xff0c 第三种为服务部署在自己服务器上是的配置方式 xff1a hosting应用on CVM xff0
  • 使用python开发json、csv数据格式转换工具

    使用python开发json csv数据格式转换工具 json和xml是业界常用的数据格式 xff0c 而游戏行业经常使用csv配表 xff0c 包括本地化文本和数值 本文介绍csv和json序列化 逆序列化相关的python库 xff0c
  • 【笔记】Ubuntu字体报错

    Warning Cannotconvertstring 34 adobe helvetica medium r normal 120 75 75 p iso8859 1 34 to type FontStruct ENVI 43 IDL o
  • python3-端口扫描(TCP connect扫描,SYN扫描,FIN扫描)

    利用python3进行端口扫描 xff0c TCP的方式有connect扫描 xff0c SYN扫描 xff0c FIN扫描 xff0c NULL扫描 xff0c ACK扫描 xff0c Xmas xff0c windows扫描 本次展示前
  • DirectX(dll)修复软件推荐4.2增强版

    我们经常会遇到在重装完系统后 xff0c 软件或者游戏无法正常运行 xff0c 提示缺少dll文件 xff0c 这时候要么去百度搜索相应dll文件 xff0c 不仅费事还不好找 xff0c 要么就是用DirectX Repair自动扫描安装
  • 未封装的扩展程序

    查看插件 程序展示未封装的扩展程序 如下图 没显示调试工具的原因是用了生产环境的版本或是压缩的vue版本 xff0c 或是没有勾选 xff1a 允许访问文件网址 https span class token punctuation span
  • 2019小结

    2019已经过去 xff0c 回想这过去的一年 xff0c 是近几年来最忙碌的一年 年初 xff0c 参加了一场读书会 xff0c 和公司同事一起读书 一本优秀的书是作者思想的精华 xff0c 通过读书可以认识和了解自己思维以外的世界 虽然
  • 继续前行

    很久没有更新日志了 xff0c 很久没有写博客了 xff1b 我知道我有的时候很忙 xff0c 我知道当前还有更重要的事情 xff0c 我知道事情是做不完的 但不管怎么样 xff0c 我该停下脚步想一想 xff0c 怎么去走好下一步 202
  • 《即兴演讲》读书笔记

    这是一本我一直在寻找的书 xff1b 因为我从事技术工作 xff0c 十多年来每天都和计算机打交道 xff0c 很少有机会站在台上讲话 xff1b 我对演讲是敬畏的 xff0c 想上台表现自己但心里又充满了恐惧 xff1b 偶尔的上台机会只
  • 读“赵4老师”言论

    在查看CSDN论坛时 xff0c 发现 赵4老师 无处不在 xff0c 赵4老师 通常不会直接给出答案 xff0c 而是直接复制言论 赵4老师的语言虽然很 犀利 xff0c 但仔细想想 xff0c 有些还是有道理的 xff0c 至少帮助我从
  • *.map文件

    关于linux程序的map文件 xff0c 网络上资料很少 xff0c 大概看了下map文件 xff0c 虽然理解的不是很透彻 xff0c 但是还是对程序的编译 运行 内存分配有了一点新的认识 1 map文件是程序的全局符号 源文件和代码行
  • python开发环境管理:pip和virtualenv

    python开发环境管理 xff1a pip和virtualenv 不同的python软件需要不同的开发环境 xff0c 互相之间甚至可能有冲突 xff0c 怎么处理 xff1f 使用pip virtualenv和virtualenvwra
  • “异常处理”学习小结

    在我经历过的项目中 xff0c 很少使用异常处理 xff1b 对于问题的调试与追踪 xff0c 基本上都是基于错误码和日志信息 这里的学习总结来自于 lt lt C 43 43 编程思想 第2卷 gt gt 和网络 xff0c 有很多问题的
  • 重载new和delete检测内存泄漏

    内存泄漏就是new出来的内存没有通过delete合理的释放 重载new和delete检测内存泄漏原理是 xff1a 在重载的new中记录内存分配情况 xff0c 在重载的delete中删除内存分配记录 xff0c 从而跟踪所有内存分配信息
  • 《Effective C++》读后感

    几天前 xff0c 我曾在微信朋友圈中发了一条消息 xff1a 和大牛之间的差距就是这一个书架 图片来自于微信公众号 二爷鉴书 的分享 我时常纠结于自己的技术为什么进步的这么慢 xff0c 大概就是书读的太少 思考的太少 Effective
  • 《模仿游戏》观后感

    xfeff xfeff 几天前 xff0c 一个朋友让我给他推荐一部电影 xff0c 我思来想去 xff0c 推荐了 模仿游戏 这部电影讲述的是 计算机科学之父 艾伦 图灵在二战期间与其团队一起发明机器 英格玛 破译德国密码系统的故事 关于
  • 对项目的理解

    xfeff xfeff 又有好久没有更新博客了 xff0c 虽然我一直告诫自己 xff0c 不管有多忙都要找点时间来写博客 最近主要的精力都投入到项目中 xff0c 我就说说自己的一些想法吧 1 项目的前期是最忙的 xff0c 投入最大 当
  • 对项目的理解(2)

    xfeff xfeff 项目是做不完的 xff0c 把近期的一些想法写出来 xff1a 1 项目初期做好每一个功能的方案 项目初期 xff0c 有一个辅助功能被我忽略了 xff0c 以为 很容易实现 xff0c 就没有花时间去研究 xff0
  • 人工智能的过去

    人工智能的起源 xff1a 人工智能在五六十年代时正式提出 xff0c 1950年 xff0c 一位名叫马文 明斯基 后被人称为 人工智能之父 的大四学生与他的同学邓恩 埃德蒙一起 xff0c 建造了世界上第一台神经网络计算机 这也被看做是
  • instant app入门和开发指南

    本文由 a href http renyugang io 2018 05 17 writing 玉刚说写作平台 a 提供写作赞助 xff0c 赞助金额 xff1a 300元 原作者 xff1a AndroFarmer 版权声明 xff1a