cc creator 打包apk 踩坑(内网环境)

这一波坑,搜了很多资料,本文只能用于学习用途,不可作为其他用途

一、内网打包

1.打包的必要环境

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

2.android studio 设置offline模式

11.png
12.png

3.修改gradlew.bat 在gradle执行那一行 末尾添加 --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版本之前都不支持),那么打包一般会出现一个问题,生成动态库 的过程会报错,...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文件名,不需要相对路径,有的话反而会报错之后项目终于跑起来没有报错了。

你可能感兴趣的:(cc creator 打包apk 踩坑(内网环境))