cc creator 打包apk 踩坑(内网环境)
这一波坑,搜了很多资料,本文只能用于学习用途,不可作为其他用途
一、内网打包
1.打包的必要环境
java 8 或以上 64位
NDK r16
android studio 3.0 版本以上
2.android studio 设置offline模式
11.png 12.png3.修改gradlew.bat 在gradle执行那一行 末尾添加 --offline
13.png 14.png4.gradle no cache version xxx.xxxx
1.先用外网gradle缓存一下所需的依赖,(可以在外网打包一下应该会下载到 %userprofile%/.gradle
里面)然后将这个文件夹复制到内网就可以
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.png4.复制上面导出的m2repository到 sdk目录 的extras/m2repository目录下
25.png 26.png5.修改构建的项目里面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文件名,不需要相对路径,有的话反而会报错之后项目终于跑起来没有报错了。