月份:2016年10月

拆解阴阳师安卓apk

不得不说阴阳师真的是个肝到死的游戏。
最近在升6星。在有全程白蛋的情况下,依旧攒狗粮攒到死。

1个6星=……=360个2星,不算经验……。
哭了。

附上触乐视频,各位且看一乐。

(因为渣浪没有给video.weibo.com开https支持,因此没法直接嵌入到这个页面里面)
http://video.weibo.com/player/1034:7755106f8dfb556c1e7f2d40b0d52f31/v.swf

今天的正题是如何拆解《阴阳师》的安卓apk。

为了研究一下素材,在红米里面装了一下。不得不说这玩意的优化真是……(虽然红米也很烂就是了),完全卡的跑不动。

我已经事先刷过了Recovery,进到Recovery里面通过USB链接到电脑拷贝出阴阳师全部文件。

这部分参考的帖子主要是:http://nga.178.com/read.php?tid=10187005&rand=993

路径基本没差,小米版的路径后面有个.mi,我用的是网易官方版,所以没有太大区别。

使用安卓安装数据的原因,是因为安装包拆出来的数据包(*.npk)是分段的,这个不太好解决,还是需要程序自己去解压合并。

这时候,我们需要一个这样的程序:

QuickBMS
by Luigi Auriemma
e-mail: me@aluigi.org
web: aluigi.org
home: http://quickbms.aluigi.org
help: http://zenhax.com

官网下载在上面。

配合这样一个脚本,脚本来自于某个技术论坛里解压网易另外一个使用 Neox 引擎的游戏所给出的脚本。


# NXPK (script 0.1.1)
# script for QuickBMS http://quickbms.aluigi.org

idstring "NXPK"
get FILES long
get OFFSET asize
xmath OFFSET "OFFSET - (FILES * 0x1c)"
goto OFFSET
for i = 0 < FILES
    get NAME_CRC long
    get OFFSET long
    get ZSIZE long
    get SIZE long
    get ZCRC long
    get CRC long
    get FLAGS long
    if FLAGS == 2
        comtype lz4
    else    # 0
        comtype zlib
    endif
    if SIZE == ZSIZE
        log "" OFFSET SIZE
    else
        clog "" OFFSET ZSIZE SIZE
    endif
next i   

将res.npk使用这个脚本即可解压。

可以看出,这个包基本就是对已有压缩包进行了额外的封包。
还挺好玩的。

读源码

http://www.yiichina.com/doc/guide/2.0/structure-controllers

在“控制器ID”一节中这一特性被通过命名规范的方式规定。
错怪yii了。

还是要多看官网。

==16:51更新,以上为更新全文

最近由于工作(因为业余依旧沉迷阴阳师),开始正式研究php7和yii2。
今天试图通过pretty-url将所有/api/v1/action的请求转发到/apiv1下面来进行处理。
于是配置如下:

'urlManager' => [
            'enablePrettyUrl' => true,
            'enableStrictParsing' => false,
            'showScriptName' => false,
            'rules' => array('api/v1/' => 'apiv1/', '' => 'site/index','/'=>'/',)
        ],

然后,在apiv1的controller里面写了这样一个函数:

public function actionFinanceInfo()
    {
        $userObj = new \app\models\User();
        return $userObj::find()->where(['id' => 1])
            ->one();
    }

理论上是没问题的,但是死活就是404。无奈中翻看yii2的源码,发现路由这块的实现是:

public function createAction($id)
    {
        if ($id === '') {
            $id = $this->defaultAction;
        }
        $actionMap = $this->actions();
        if (isset($actionMap[$id])) {
            return Yii::createObject($actionMap[$id], [$id, $this]);
        } elseif (preg_match('/^[a-z0-9\\-_]+$/', $id) && strpos($id, '--') === false && trim($id, '-') === $id) {
            $methodName = 'action' . str_replace(' ', '', ucwords(implode(' ', explode('-', $id))));
            if (method_exists($this, $methodName)) {
                $method = new \ReflectionMethod($this, $methodName);
                if ($method->isPublic() && $method->getName() === $methodName) {
                    return new InlineAction($id, $this, $methodName);
                }
            }
        }

        return null;
    }

竟然是一个将驼峰处理成连字符的函数。文档里貌似就没提到这一条啊。坑。

多看官网多读书

是的,依旧沉迷阴阳师。因此没有好好写文章。周末找个时间干了吧。
最近还在做一个官网,反正事儿也不是没有。
webpack 的 html-loader 是可以直接代替 apache/nginx 进行 server-side-include 的,虽然从原理上看似乎不是一个事儿。

https://github.com/webpack/html-loader

配置webpack的配置文件中,关于html的加载项:

{test: /\.html$/, loader: 'html?interpolate'},

即可。

===更新===

早上话说了一半。
完成上面的工作之后,在页面里面即可使用

${require('./tmpl/footer.tmpl.html')}

这样的语法来引用html模板了。这个 require 可以使用已有的 loader 来载入各种神奇的东西,比如 css js等等,来做各种黑科技。