Project1

标题: MV插件开发杂谈之安卓移植初步踩坑 [打印本页]

作者: 沉滞的剑    时间: 2019-10-23 22:44
标题: MV插件开发杂谈之安卓移植初步踩坑
打算不用任何打包工具从头搞定安卓端移植
官方打包工具Crosswalk已经不再维护
所以我们使用安卓自带的Webview作为浏览器底层
目测很多国产手机定制的Webview版本较低
为了支持更多JS特性(包括WebGl)
需要从酷安等第三方商城安装高版本的Webview
我把我的2000元辣鸡Vivo Y79升级到了70版本

之前我是55版本, 虽然支持大部分比如箭头函数, class关键字, static关键字, getter/setter等特性
但是不支持...运算符, 所以如果要支持更广泛的设备的话还是不要使用解构运算符比较好
(不太清楚为啥国内系统不升级WebView...)

然后是下载安卓的开发工具Android Studio和SDK
选择一个5.1以上的版本的SDK(我选择了7.1版本)
创建一个新的工程, 选择 Empty Activity 就行
语言选择Kotlin就可以
然后Android Studio会自动帮你初始化, 不用管它

我们首先要把浏览器加入到视图当中
我们在左侧选择res/layout/activity_main.xml
修改布局文件, 我们删除了所有没用的东西,
添加了一个WebView进去, 并设置了它的大小和id


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     xmlns:app="http://schemas.android.com/apk/res-auto"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     tools:context=".MainActivity">

  8.     <WebView
  9.         android:id="@+id/webView"
  10.         android:layout_width="match_parent"
  11.         android:layout_height="match_parent"
  12.         app:layout_constraintBottom_toBottomOf="parent"
  13.         app:layout_constraintEnd_toEndOf="parent"
  14.         app:layout_constraintStart_toStartOf="parent"
  15.         app:layout_constraintTop_toTopOf="parent" />
  16. </androidx.constraintlayout.widget.ConstraintLayout>
复制代码


然后修改一下manifests\AndroidManifest.xml 文件

android:configChanges="orientation|screenSize"
android:screenOrientation="landscape"
就是在activity里增加强制横屏和切换不刷新的设定
这个是为了解除切出应用导致WebView重加在的问题


  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="com.example.myapplication">

  4.     <application
  5.         android:allowBackup="true"
  6.         android:icon="@mipmap/ic_launcher"
  7.         android:label="@string/app_name"
  8.         android:roundIcon="@mipmap/ic_launcher_round"
  9.         android:supportsRtl="true"
  10.         android:theme="@style/AppTheme">
  11.         <activity android:name=".MainActivity"
  12.         android:configChanges="orientation|screenSize"
  13.         android:screenOrientation="landscape">
  14.             <intent-filter>
  15.                 <action android:name="android.intent.action.MAIN" />

  16.                 <category android:name="android.intent.category.LAUNCHER" />
  17.             </intent-filter>
  18.         </activity>
  19.     </application>
  20. </manifest>

复制代码


下一步在工程浏览器里选择app, 右键new->Folder->AssetsFolder创建一个assets文件夹
用来存放我们的RM工程
右键新建的assets文件夹, 选择Show in Explorer就能进入该文件夹下
你可以把你部署打包后的网页版放在这里, index.html应该在assets文件夹下

接下来我们来写主Activity的逻辑, 选择MainActivity.kt
首先我们先在onCreate方法里继续添加代码
这段代码初始化了我们的应用的UI效果
比如隐藏导航栏, 状态栏, 全屏等等


  1. override fun onCreate(savedInstanceState: Bundle?) {
  2.     super.onCreate(savedInstanceState)
  3.     setContentView(R.layout.activity_main)

  4.     window.decorView.systemUiVisibility =
  5.         (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
  6.                 or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
  7.                 or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
  8.                 or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
  9.                 or View.SYSTEM_UI_FLAG_FULLSCREEN
  10.                 or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
  11.     window.navigationBarColor = Color.TRANSPARENT;
  12.     window.statusBarColor = Color.TRANSPARENT;
  13.     supportActionBar?.hide();
  14. }
复制代码


如果出现提示缺少导入的包按下Alt+Enter就可以自动导入啦

然后下一步我们要让webView加载我们的html文件, 继续写onCreate方法
我们先选取id为webView的WebView组件并设置它的属性
我们允许JS运行, 这样会有安全警告, 但是我们不添加联网权限就可以了
允许使用网页版的存储, 这个可以让我们在手机端上存档读档
允许以url的方式读取文件, 这个可以解决本地资源文件读取的问题
最后让游戏跳转到index.html



  1. override fun onCreate(savedInstanceState: Bundle?) {
  2.   ....
  3.   val webView: WebView = findViewById(R.id.webView)
  4.   val webSettings = webView.settings
  5.   webView.webViewClient = WebViewClient()
  6.   webSettings.javaScriptEnabled = true
  7.   webSettings.domStorageEnabled = true
  8.   webSettings.allowFileAccessFromFileURLs = true
  9.   webView.loadUrl("file:///android_asset/index.html")
  10. }
复制代码


其实到这里功能已经差不多了, 不过还有几个可以改进的地方

在mainActivity下面重写一下几个类
如果我们按下了返回按钮, 就会导致网页后退, 所以我们要把它禁用
还有如果锁屏状态下, WebView会继续运行, 会导致播放声音
我们需要运行一段js代码来将bgm在暂停的时候停止, 在恢复的时候恢复


  1. override fun onResume() {
  2.     super.onResume()
  3.     val webView: WebView = findViewById(R.id.webView)
  4.     webView.evaluateJavascript(
  5.         "AudioManager.onResume()",
  6.         null
  7.     )

  8. }

  9. override fun onSaveInstanceState(bundle: Bundle) {
  10.     super.onSaveInstanceState(bundle)
  11.     val webView: WebView = findViewById(R.id.webView)
  12.     webView.evaluateJavascript(
  13.         "AudioManager.onPaused()",
  14.         null
  15.     )
  16. }

  17. override fun onBackPressed() {}
复制代码


在我们的工程里rpg_managers里添加两段js代码
这个只是随意添加的, 可以写成插件或者在初始化的时候由安卓端注入代码



  1. AudioManager.onPaused = function() {
  2.     this._pausedBgm = AudioManager.saveBgm()
  3.     this.stopBgm()
  4. };

  5. AudioManager.onResume = function() {
  6.     AudioManager.replayBgm(this._pausedBgm);
  7. };

复制代码


这样这个问题算是勉强解决了,
不过注意安卓系统会自动管理手机内存, 清除不活跃的应用
如果锁屏一段时间, 应用就会被销毁, 未保存的记录也就丢失啦

接下来就是测试, 手机(需要开启开发者权限)连接到电脑上, 然后选择Run就可以了~

以上就是安卓移植踩坑的, 欢迎大家交流心得
作者: 白嫩白嫩的    时间: 2019-10-23 23:07
之前尝试过安卓四特有丢打包,感觉比官方推荐的流畅很多,过了一年了不知道安卓环境是什么情况了,也没怎么测试手机版,感谢楼主大神分享经验,给我等萌新点亮了前进路上的明灯
作者: 347780682    时间: 2019-10-24 09:34
好东西  谢谢楼主分享!对了不知道楼主懂不懂怎么在Android Studio嵌入腾讯x5,据说其他低端手机内核版本比55版本还低,腾讯x5可以使用到55版本,不知道楼主知不知道怎么嵌入腾讯x5
作者: 347780682    时间: 2019-10-24 09:53
顺便再求一个空包或是操作截图(˶˚  ᗨ ˚˶)




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1