這一波坑,搜了很多資料,本文只能用于學習用途,不可作為其他用途
一、內網打包
1.打包的必要環(huán)境
java 8 或以上 64位
NDK r16
android studio 3.0 版本以上
2.android studio 設置offline模式


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


4.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目錄下


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


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


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

二、內網打包中
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"
}

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

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