開發node桌面級應用工具:apk轉化epub


隨着蘋果ibooks對國內的開放,最近接了個麻煩的需求:

把現有的APK轉化支持蘋果ibooks電子書的epub格式

  • apk,基本都知道就是安卓的應用程序
  • epub,是ibooks支持的電子書格式 (xhtml組成的靜態多頁面)

這apk與epub兩個完全不是一個世界的東西,怎么能關聯並轉化?

因為我司產出的APK應用是通過phonegap打包的SPA應用,這也是一套黑科技,通過ppt批量生成應用,本質上還是web那一套,所以給epub轉化提供契機

通過H5寫應用已經流行幾年了,這里也不多說了,如流行的phonegap國產appcan、APICloud和HBuilder之類的打包工具太多了,本質上基本差不都,如果沒有接觸的可以看看

這是一個APK

image

APK解壓后的文件結構

image

其中assets就是web目錄,其中還包含應用的sqlite數據庫

image

很明顯只有一個index的單面結構,現用就是需要把index單頁面,分解成多個獨立的靜態頁面,並且要符合xhtml語法規范

常規來說,這只是一個靜態分析,應該簡單。

但是這里我沒有采用靜態分析,原因不多說,跟項目的復雜度有關系,詳情可以參考我的項目分享 Hybrid App應用制作與跨平台解決方案

 

我采用的是動態編譯,簡單來說,讓瀏覽器自己解析

通過加載一個后台的Chromium來解析頁面,然后直接提取出Chromium渲染后的最終HTML結構

如果只是這樣解析,提取的只可能當前執行的頁面部分,不可能是全部的頁面結構

因此,依照靜態編譯的思路需要符合幾點要求

  1. 單頁面的入口index.html,能夠根據傳遞參數自動加載不同的頁面
  2. 數據庫xxtebook.db能夠通過算法分解到每一個獨立的頁面中,做成json的數據格式

考慮到最終是桌面級應用工具,我這里采用了node語言編寫

當然用node的原因也是因為有神器node-webkit,可以把node打包成exe執行文件

 

具體的思路流程:

讀取apk文件 =》改名rar =》解壓后讀取web目錄

=》讀出sqlite數據

=》根據數據創建基本頁面 n*.xhtml多個

=》給生成的所有xhtml頁面寫入區分頁面標記(因為apk中的web資源代碼是共享的js/css/圖片等等)

=》將所有ajax處理的資源轉化成js格式(如 svg 讀出數據寫入js文件,靜態訪問直接加載這個腳本)

=》分解每個頁面的數據sqlite數據,並寫入到對應的xhtml中(數據庫的數據需要分解成json寫入對應的頁面中)

=》啟動web服務器

=》啟動webkit,並加載每一個xhtml頁面做分解,等待頁面渲染拿到每個頁面最終的靜態結構

=》合並epub的標准文件結構,生成對應的規范

=》打包輸出最終的epub文件

 

對比下單頁面結構與多個xhtml靜態文件

 

單頁面SPA結構,通過JS生成DOM

通過JS動態渲染HTML結構,頁面總入口都是同一個

image1

 

靜態xhtml,DOM與數據靜態化

image2

 

把一個index分解成多個xhtml頁面,每個頁面的js、css等資源代碼都是共享的,所以需要在每一個頁面寫入不同的數據,用來區分頁面

架設一個web服務端,通過http加載這些xhtml頁面,通過瀏覽器解析就能得到最終獨立xhtml的結構

由於執行代碼做了接口處理,只要xhtml中傳遞不同的頁碼,代碼就自動執行不同的頁面,這樣就能達到,不同的頁面都有不同的解析結果

由於是node全自動操作,所以web與頁面的解析都必須通過自動化工具處理,這里我用的是browser-syncphantomjs

通過phantomjs 解析后就能拿到瀏覽器渲染后的HTML結構了

 

遇到的問題:

解壓丟失文件:node確實沒有一個解壓插件好使,最終用shell執行腳本命令,通過調用winrar軟件處理

node-webkit不支持64位的sqlite3讀取:這是因為nodejs和node-webkit的ABI不同,處理的辦法就是重新編譯64位的sqlite3,我估計很難成功,后來找了一款神器 sql.js直接數據庫分解

phantomjs可以通過execFile調用,但是執行路徑,是以node調用命名為根路徑計算的

phantomjs加載頁面,需要監聽onResourceReceived事件,之后再獲取數據,頁面的完全渲染無法把控的,有請求,有JS繪制等等,必須有一個延時的等待

通過browser-sync做服務器,phantomjs獲取的html的結構中會有__bs_script__這個注入節點,需要刪除

通過browser-sync做服務器,background加載的url都會加上整個http跟地址,所以在最終數據中需要處理

 

打包運行的效果

GQGA$7U`@N@X(R}20Z}DSKW

UI有點丑。。。

如果有這方面需求,或者有啥疑問的,可以留言。。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM