cc creator 打包apk 踩坑(內網環(huán)境)

這一波坑,搜了很多資料,本文只能用于學習用途,不可作為其他用途

一、內網打包

1.打包的必要環(huán)境

java 8 或以上  64位
NDK r16 
android studio 3.0 版本以上

2.android studio 設置offline模式

11.png
12.png

3.修改gradlew.bat 在gradle執(zhí)行那一行 末尾添加 --offline

13.png
14.png

4.gradle no cache version xxx.xxxx

1.先用外網gradle緩存一下所需的依賴,(可以在外網打包一下應該會下載到 %userprofile%/.gradle 里面)然后將這個文件夾復制到內網就可以

21.png

2.提取 復制好的文件夾 %userprofile%/.gradle/caches/modules-2/files-2.1 里面的信息,這里提供一個簡單的py腳本,我不熟悉gradle,只好自行解決

#coding=utf-8
import os,shutil

def checkHasAFileInPath(dirname):
    files = os.listdir(dirname)
    count = 0
    filename = ""
    for name in files:
        if os.path.isfile(dirname+"/"+name):
            count = count + 1
            filename = name
    return count==1,filename
    
# 將文件從base32拿出來
def removeSomeUselessInfo(dirname):
    fnames = os.listdir(dirname)
    for name in fnames:
        subPath = "{0}/{1}".format(dirname,name)
        if "." != name and ".." != name  and os.path.isdir(subPath):
            # 這里我也不知道具體是多少,只是猜測base32的長度,一般范圍都沒啥問題
            if "." not in name and len(name) > 32:
                fg,fileName = checkHasAFileInPath(subPath)
                if fg:
                    shutil.move(subPath+"/"+fileName,dirname+"/"+fileName)
                    os.rmdir(subPath)
            else:
                removeSomeUselessInfo(subPath)

# 復制文件夾
def copy2dir(src,dst):
    fnames = os.listdir(src)
    for name in fnames:
        dstname = dst+"/"+name
        if os.path.exists(dstname):
            shutil.rmtree(dstname)
        shutil.copytree(src+"/"+name,dstname)
    removeSomeUselessInfo(dst)

EXPORT_PATH = None #"D:/exportm2Resiposity"
# 生成對應的倉庫目錄
def start(dirname):
    global  EXPORT_PATH

    exportDir = "%s/export"%dirname
    if EXPORT_PATH:
        exportDir = EXPORT_PATH
    if not os.path.exists(exportDir):
        os.mkdir(exportDir)
    fnames = os.listdir(dirname)
    for name in fnames:
        if "." != name and ".."!=name and name!="export":
            pathName = "%s/%s"%(exportDir,"/".join(name.split(".")))
            if not os.path.exists(pathName):
                os.makedirs(pathName)
            copy2dir("%s/%s"%(dirname,name),pathName)


if __name__ == "__main__":
    gradlePath = os.popen("echo %userprofile%/.gradle/caches/modules-2/files-2.1").read().strip()
    start(gradlePath)

3.設置android studio的gradle,找到Android Studio的安裝文件夾,安裝目錄的gradle里面也有一個m2repositiry,將上面處理好的導出文件復制到m2repositiry目錄下

23.png
24.png

4.復制上面導出的m2repository到 sdk目錄 的extras/m2repository目錄下

25.png
26.png

5.修改構建的項目里面proj.android-studio文件夾下的gradle/wrapper/gradle-wrrapper.properties如下

27.png
28.png
    distributionBase=GRADLE_USER_HOME
    distributionPath=wrapper/dists
    zipStoreBase=GRADLE_USER_HOME
    zipStorePath=wrapper/dists
    distributionUrl=xxxx  #這里的xxxx就是源文件中的url

6.打包的時候可能會有build_tool版本過低,這時候需要去下載打包需要的build_tools到sdk目錄的build_tools

29.png

二、內網打包中

1、如果是windows,又恰好不支持長路徑(windows10 14352版本之前都不支持),那么打包一般會出現(xiàn)一個問題,生成動態(tài)庫 的過程會報錯,...xxxx/inspector_socket_server.o ...xxxx/node_debug_options.o :No such file or directory 大概類似這樣的報錯。 如果不是windows或者window10 14352版本以上,就當我沒說過。

2、 其中會有 ....xxxxx\app\libs,not found ,這個好像不影響最后打包的結果,只是會有這個log,至少目前打包出來有這個報錯的還是可以正常運行,好像在creator的issue里面有這個的解答,影響不大就暫時忽略了。

三、打包好之后

1、log里面如果是缺失setting.js 或者缺失 main.js 這樣的描述的話,那么檢查一下包體,是否把assets打包進去了

如果assets沒有打包進去,閃退的幾率是100%,至少我在內網模擬器上跑著是這樣的
至于為什么會沒有把assets打包進去呢,網上的答案似乎是因為gradle的版本導致的。
解決的方案:
####1.打開 構建的項目里面proj.android-studio文件夾下面的app/build.gradle,在里面找到sourceSets.main,檢查是否和下面一樣

    sourceSets.main {
        assets.srcDir "assets"
        java.srcDir "src"
        res.srcDir "res"
        jniLibs.srcDir "libs"
        manifest.srcFile "AndroidManifest.xml"
    }

18.png

由于gradle新版本的問題,這里需要改為截圖所示


20.png

2、 不閃退,就是一直黑屏,看log好像是eval “xxxxx.js” failed

這個問題主要是代碼報錯導致的,確實一開始我也很好奇,瀏覽器明明跑得好好的,為什么到了這里偏偏就跑不起來,論壇上說是路徑的問題。直接require文件名,不需要相對路徑,有的話反而會報錯之后項目終于跑起來沒有報錯了。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容