查看: 18|回复: 0

一个Renpy安卓打包游戏通过安卓平台审核方案

[复制链接]

1

主题

1

回帖

12

积分

新手上路

积分
12
发表于 2026-7-19 10:41:49 | 显示全部楼层 |阅读模式
前言:
1.本方案由我和清奕云時想出,实现,以及测试
2.本方案在Ren'py-8.3.7能够实现效果,如果使用,请注意引擎版本
3.涉及到修改引擎的代码,所以请在事前把引擎目录下的rapt相关文件备份
4.知道怎么写html(最新版更新不用)
5.这个方法有部分缺陷,看文尾。
6.使用了该方案需要标注“浅唱”标注使用该插件

压缩包:(一键解压移动文件即可食用)
点击前往下载
按照压缩包里面的说明很详细,直接改就行了
目前在多个gal已经通过qɐꓕ审核

方法思路以及部分代码解释:
ren打包的安装包有一个特性,它不会要求额外权限(除了安装软件的储存权限),但是会在安装包启动的时候开始调用传感器video_play_edit_sdk,而部分安装包发布平台并不允许这样子,需要在权限申请或者隐私政策弹出一个窗口,窗口包含调用权限说明以及各种条例,用户同意后方可调用,这是大部分renpy引擎的apk被卡住审核的原因。

关于video_play_edit_sdk,这是一个针对ffmpeg在android手机平台视频处理的底层,加速了ffmpeg的解码和编码能力,增加硬解码模块和硬编码模块
我们删除了这个传感器的调用,用软解也没问题,性能方面损耗并不大
所以我们在renpy的活动之前写一个活动,让允许在这个新的活动之前弹出我们要的所有东西(隐私条约等),而在这个活动中,传感器并没有被调用。
renpy的安装包活动顺序有关文件在renpy引擎的rapt下的templates里面的app-AndroidManifest.xml中,这一部分就是写了renpy引擎的活动
在这里面的这一部分就是引擎活动

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="{{ config.package }}">
  3.   <application
  4. ...省略
  5.     <activity
  6.         android:name="org.renpy.android.PythonSDLActivity"
  7.         android:label="@string/iconName"
  8.         android:alwaysRetainTaskState="true"
  9.         android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
  10.         android:launchMode="singleTop"
  11.         android:screenOrientation="{{ config.orientation }}">

  12.         <intent-filter>
  13.             <action android:name="android.intent.action.MAIN" />
  14.             <category android:name="android.intent.category.LAUNCHER" />
  15.         </intent-filter>

  16.     </activity>

  17.     <receiver android:name="com.amazon.device.iap.ResponseReceiver"
  18.       android:permission="com.amazon.inapp.purchasing.Permission.NOTIFY">
  19.       <intent-filter>
  20. ...省略
复制代码

这个文件的改动是:
这里加入就禁用了renpy调用权限,其实不加也行,没有问题,但是为了稳定通过某些平台的审核,还是限制了,可以看情况自己更改

  1.    <!-- 权限设置 -->
  2.     <uses-permission android:name="android.permission.WAKE_LOCK" />
  3.     <uses-permission android:name="android.permission.VIBRATE" />
  4.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  5.     <!-- 这里加入了各种传感器权限的取消申请 -->
  6.     <uses-feature android:name="android.hardware.sensor.accelerometer" android:required="false"/>
  7.     <uses-feature android:name="android.hardware.sensor.gyroscope" android:required="false"/>
  8.     <uses-feature android:name="android.hardware.sensor.light" android:required="false"/>
  9.     <uses-feature android:name="android.hardware.sensor.proximity" android:required="false"/>
  10.     <uses-feature android:name="android.hardware.sensor.compass" android:required="false"/>
  11.     <uses-feature android:name="android.hardware.sensor.barometer" android:required="false"/>
  12.     <uses-feature android:name="android.hardware.sensor.stepcounter" android:required="false"/>
  13.     <uses-feature android:name="android.hardware.sensor.stepdetector" android:required="false"/>
  14.    
复制代码

加入新的活动
  1. <application
  2.             android:label="@string/app_name"
  3.             android:icon="@drawable/android_icon"
  4.             android:hasCode="true"
  5.             android:allowBackup="false"
  6.             android:theme="@style/Theme.AppCompat.Light.NoActionBar">
  7.         <!-- 启动页设为 MainActivity -->
  8.         <activity
  9.                 android:name="org.renpy.android.MainActivity"
  10.                 android:exported="true">
  11.             <intent-filter>
  12.                 <action android:name="android.intent.action.MAIN" />
  13.                 <category android:name="android.intent.category.LAUNCHER" />
  14.             </intent-filter>
  15.         </activity>
  16.         <!-- 游戏核心逻辑 Activity -->
  17.         <activity
  18.                 android:name="org.renpy.android.PythonSDLActivity"
  19.                 android:label="@string/iconName"
  20.                 android:alwaysRetainTaskState="true"
  21.                 android:configChanges="layoutDirection|locale|orientation|uiMode|screenLayout|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation"
  22.                 android:launchMode="singleTop"
  23.                 android:screenOrientation="landscape"
  24.                 android:exported="true" />
  25.     </application>
复制代码

主要改动:
我把声明包名给删了
  1. {% for perm in config.permissions %}
  2.   <uses-permission android:name="{{ perm }}" />
  3. {% endfor %}
复制代码

我删了动态生成权限的代码,也就是video_play_edit_sdk
然后活动方面的区别就是改的使用 MainActivity 作为启动入口(有LAUNCHER),把PythonSDLActivity改为后面的游戏逻辑(无 LAUNCHER)
(LAUNCHER决定了软件启动活动的优先级)
然后MainActivity就是在里面改的加入的弹窗,在同意后跳转startGame也就是PythonSDLActivity这个renpy原本的游戏主活动

(旧版本是引入了一个html文件,新版本优化了这个过程)
缺点:(高情商:给后面的人优化空间{:5_150:};低情商:我太菜了,不会改{:5_269:})
1.这个方案由于重新写了一个活动,所以在项目里面自己规定的安卓打包图标是不生效的(被顶替了),需要修改图标则要到drawable里面改(最新版已经可以读取项目规定图标
2.由于改的是引擎的内容,所以对于有多项目的来说,可能不同游戏的隐私政策不同,所以要多次写不同的html文件,或者在引用中多次改文件名字,很麻烦。(最新版已经可以读取项目配置名称
3.这个隐私政策的窗口弹出是竖屏,其实没有多大影响,但横屏似乎效果更好。(最新版已经加入横屏
以上缺陷都已经在最新版修复!最新版下载链接:
点击前往下载




视频版教程:








关注公众号

相关侵权、举报、投诉及建议等,请发 E-mail:admin@discuz.vip

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|苏ICP备17067825号

在本发帖
关注公众号
返回顶部