[Android]创建Google Play内购aab白包
开发时需要调试Google内购,需要先往Google商店传一个白包上去。确定包名,然后进行内购产品创建。
1.创建一个空项目,填写正式名称和正式包名。
如果你只是为一个测试开发账号打白包,然后进行内购测试,这时包名随便写肯定不能填正式包名。包名一旦随着包传到Google Play Console后,就会被这个账号占用。
选择Kotlin DSL
2.在应用级build.gradle.kts中添加com.android.billingclient:billing依赖然后同步
dependencies {...// 以前的写法// implementation 'com.android.billingclient:billing:6.1.0'// 现在写法implementation(libs.billingclient.billing)
}
com.android.billingclient:billing 是一个Google提供的Android库,用于在Android应用中实现应用内购买(In-App Purchases,简称IAP)功能。这个库是Google Play Billing Library的一部分,它提供了一个简单的API来帮助开发者轻松地集成IAP服务。
通过使用Google Play Billing Library,开发者可以实现以下功能:
-
查询可售商品:可以查询Google Play上定义的商品,包括一次性商品(如游戏中的虚拟货币)和订阅(如内容服务的月度或年度订阅)。
-
进行购买:可以启动购买流程以供用户购买商品,并处理购买交易。
-
确认购买:在商品被购买后,可以确认交易,以确保用户的购买得到处理,并且商品被正确地交付。
-
检查购买历史记录:可以检查用户过去的购买记录,以确定用户是否已购买特定商品,特别是对于恢复购买或实现非消耗品的逻辑非常有用。
-
管理订阅:可以为用户提供订阅管理的接口,包括订阅升级、降级和取消。
使用Google Play Billing Library的一个重要好处是它处理了很多复杂的底层交互和安全性问题,例如验证购买和加密通信,这样开发者就可以专注于创建更好的用户体验而不必担心底层的交易安全问题。
3.报错Unresolved reference: billingclient
在 Kotlin 项目中,如果你想使用 implementation(libs.billingclient.billing) 这种格式来添加依赖项,通常意味着你的项目配置了版本目录(Version Catalogs)特性。这是在 Gradle 7.0 中引入的一种新的依赖管理方式,允许在一个单独的文件中集中管理所有的依赖项和它们的版本。
如果你遇到了 Unresolved reference: billingclient 的错误,这通常表明在你的版本目录配置中没有名为 billingclient.billing 的条目。为了解决这个问题,你需要在版本目录文件中添加正确的条目。
版本目录通常在 gradle/libs.versions.toml 文件中定义,但也可能是在其他位置,取决于你的项目配置。
gradle/libs.versions.toml格式如下:
[versions]
agp = "8.3.0"
billingVersion = "6.1.0"
kotlin = "1.9.0"
coreKtx = "1.10.1"
junit = "4.13.2"
junitVersion = "1.1.5"
espressoCore = "3.5.1"
lifecycleRuntimeKtx = "2.6.1"
activityCompose = "1.7.0"
composeBom = "2023.08.00"[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
billingclient-billing = { module = "com.android.billingclient:billing", version.ref = "billingVersion" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "junitVersion" }
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntimeKtx" }
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
androidx-ui = { group = "androidx.compose.ui", name = "ui" }
androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
可以看到,已经有了正确的条目来表示 Google Play Billing Library,它是用以下方式定义的:
billingclient-billing = { module = "com.android.billingclient:billing", version.ref = "billingVersion" }
这个条目引用了版本键 billingVersion,它被定义为 "6.1.0"。
所以在 build.gradle.kts 或 build.gradle 配置文件中,注意不要输入错误,应该使用 libs.billingclient.billing 来添加依赖项,如下所示:
dependencies {implementation(libs.billingclient.billing)// ... 其他依赖项
}
4.前往Build > Generate Signed Bundle / APK打包aab或apk
官方文档:https://developer.android.com/studio/publish/app-signing
创建秘钥后保存好,下次更新时直接选择这次创建的秘钥。
官方文件:https://developer.android.com/studio/publish/app-signing
在Android应用打包过程中,如果选择了“Export encrypted key for enrolling published apps in Google Play App Signing”,这将导出一个名为 private_key.pepk
的文件。此文件包含用于Google Play App Signing的加密后的私钥。
Google Play App Signing是一项在Google Play Console中提供的服务,它允许Google帮助你管理你的应用签名密钥。使用这项服务的优势包括:
- 安全性增强:你的签名密钥存储在Google的安全服务器上,降低了密钥被泄露或丢失的风险。
- 键管理灵活性:如果你的签名密钥丢失或被盗,Google Play App Signing可以帮助你更换新的密钥。
- 大小优化:Google可以为不同的设备生成优化过的APK,减少应用的下载体积。
- 未来证明:如果将来需要使用新的签名算法,Google可以帮助转换到新的签名方案。
当你第一次上传你的应用到Google Play时,如果你选择了Google Play App Signing,你需要提供你的应用签名密钥。这就是为什么你需要导出 private_key.pepk
文件。你需要在Google Play Console的“应用签名”部分上传这个文件,以便Google可以使用你的私钥(现在由Google安全地管理)来签署你的APK或App Bundle。
操作步骤如下:
- 在Android Studio中生成签名的APK或者Android App Bundle时选择导出和上传PEPK文件。
- 在生成的向导中,勾选“Export encrypted key for enrolling published apps in Google Play App Signing”。
- 按照指示完成导出流程,你会得到一个
private_key.pepk
文件。 - 登录到Google Play Console,并找到你的应用。
- 在"Release"管理或类似的区域找到"App Signing"部分。
- 按照Google Play Console的指示上传
private_key.pepk
文件。
一旦你上传了这个文件,Google Play App Signing服务就会接管你的应用的签名过程。在这之后,每次你上传一个新的APK或者App Bundle到Google Play时,Google将会使用存储在它们服务器上的签名密钥来签署你的应用。
相关文章:

[Android]创建Google Play内购aab白包
开发时需要调试Google内购,需要先往Google商店传一个白包上去。确定包名,然后进行内购产品创建。 1.创建一个空项目,填写正式名称和正式包名。 如果你只是为一个测试开发账号打白包,然后进行内购测试,这时包名随便写…...

大数据基础:Linux基础详解
课程介绍 本课程主要通过对linux基础课程的详细讲解,让大家熟练虚拟机的安装使用,Linux系统的安装配置,学习掌握linux系统常用命令的使用,常用的软件安装方法,制作快照,克隆,完成免密登录&…...
unity中 鼠标按下移动端与pc端的位置
if (Input.GetMouseButtonDown(0)) { Vector2 V Input.touchCount > 0 ? Input.GetTouch(0).position : new Vector2(Input.mousePosition.x, Input.mousePosition.y); } 射线检测 if (Input.GetMouseButtonDown(0)) { …...

增强现实(AR)在广告中的力量
The Power of AR in Advertising 写在前面 增强现实(AR -Augmented Reality)是指借助软件、应用程序和智能手机、平板电脑或耳机等设备,为日常生活添加视觉和音频元素的技术。如今,品牌和广告商可以在营销活动中使用AR࿰…...
日志收集监控告警平台的选型思考
目前市面上比较常见的日志收集系统有:ELK,Grafana Loki,OpenObserve,SigNoz,Graylog ,Syslog-ng,Highlight,接下来我会对这几个一一做分析。 1. ELK ELK 是 Elasticsearch、Logsta…...

苹果Find My产品需求增长迅速,伦茨科技ST17H6x芯片供货充足
苹果的Find My功能使得用户可以轻松查找iPhone、Mac、AirPods以及Apple Watch等设备。如今Find My还进入了耳机、充电宝、箱包、电动车、保温杯等多个行业。苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、Ai…...

题目:忐忑楼梯Ⅱ
问题描述: 解题思路: 利用差分,当第一个以后的差分元素都为零时就代表楼梯高度等于第一个楼梯的高度。为什么是第一个呢,因为以第一个为标准的区间操作数最少。 注意点:每次都只能加一或减一,ans开ll 题解&…...

TS函数类型
函数类型表达式 function hello(x: string) {console.log(x) } //greeter函数的参数是一个函数fn,fn也有一个string类型参数,无返回值。 function greeter(fn: (a: string) > void) {fn(hello) } greeter(hello)也可以把定义参数类型的语句单独提取出…...
数据链路层(四):数据链路层协议
目录 1 数据链路层协议1.1 异步协议1.2 同步协议1.3 局域网数据链路层协议1.4 广域网数据链路层协议 1 数据链路层协议 数据链路层“协议”也称为“规程”,数据链路控制协议也称数据链路控制规程。 数据链路控制协议主要分为异步协议和同步协议两大类。 1.1 异步协…...

#Linux系统编程(孤儿进程及僵尸进程以及wait函数)
(一)发行版:Ubuntu16.04.7 (二)记录: (1)概述 在 Unix/Linux 系统中,正常情况下,子进程是通过父进程创建的,且两者的运行是相互独立的ÿ…...

苍穹外卖项目-01(开发流程,介绍,开发环境搭建,nginx反向代理,Swagger)
目录 一、软件开发整体介绍 1. 软件开发流程 1 第1阶段: 需求分析 2 第2阶段: 设计 3 第3阶段: 编码 4 第4阶段: 测试 5 第5阶段: 上线运维 2. 角色分工 3. 软件环境 1 开发环境(development) 2 测试环境(testing) 3 生产环境(production) 二、苍穹外卖项目介绍 …...
学习笔记(16)函数防抖和节流
JavaScript 中的函数防抖(Debounce)和函数节流(Throttle)是两种优化频繁触发事件回调函数执行的技术,它们主要用于限制函数调用的频率,尤其是在处理高频率触发且响应开销较大的用户交互场景时。 函数防抖 …...

【揭秘】空号检测平台挑选秘籍:让每一分钱都花在“刀刃”上
在数字化营销时代,精准的数据是企业制胜的关键。而空号检测平台作为数据清洗的重要工具,其选择的正确与否直接影响到营销效果与成本效益。如何在众多平台中慧眼识珠,找到最适合自己的“黄金搭档”?今天,就跟着企讯通一…...

Linux源码包安装
目录 一、transmission源码包安装 二、 nginx源码包安装 一、transmission源码包安装 1、下载编译环境所需的软件包依赖 2、下载transmision源码包到用户主目录下 https://github.com/transmission/transmission/releases/download/4.0.5/transmission-4.0.5.tar.xz 3、解压…...

【P1328】[NOIP2014 提高组] 生活大爆炸版石头剪刀布
[NOIP2014 提高组] 生活大爆炸版石头剪刀布 题目背景 NOIP2014 提高组 D1T1 题目描述 石头剪刀布是常见的猜拳游戏:石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。在《生活大爆炸》第二季第 8 集中出现了一种…...
查看k8s中的secret
kubectl get secret xxx -o yaml -n xxxx参考: Managing Secrets using kubectl...

[深度学习]yolov8+pyqt5搭建精美界面GUI设计源码实现五
【简单介绍】 依托先进的目标检测算法YOLOv8与灵活的PyQt5界面开发框架,我们倾力打造出了一款集直观、易用与功能强大于一体的目标检测GUI界面软件。通过深度融合YOLOv8在目标识别领域的出色性能与PyQt5的精美界面设计,我们成功推出了一款高效且稳定的软…...
C# get set 访问器
在C#中get 访问器set 访问器属性的优势例子 在C#中 get 和 set 是访问器(accessors)的关键词,它们用于定义属性的读取和写入行为。属性是一种特殊的类成员,它提供了对字段(field)或计算结果的灵活访问。 …...

【OpenGL】使用 python + Qt + OpenGL 的现代渲染
伴随资源 目录 一、说明二、 PyQt4三、PyOpenGL四、OpenGL 管线五、Python集成开发环境5.1 Emacs配置5.2 pycharm环境 六、你好,OpenGL!七、QGL控件八、平截头体.svg九、定义几何9.1 立即模式与保留模式9.2 使用 VBO 定义 Cube 十、渲染立方体十一、渲…...

vlan、三层交换机、网关、DNS、子网掩码、MAC地址详解
vlan、三层交换机、网关、DNS、子网掩码、MAC地址详解 一、 什么是VLAN? VLAN中文是“虚拟局域网”。 LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。 VLAN所指的LAN特指使用路由器分割的网络——也就是广…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
Leetcode33( 搜索旋转排序数组)
题目表述 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...