随着Unity项目中需要接入SDK增加,总有一天你的项目方法数会超过65K。当你的项目出现65K后,优先推荐sdk包进行裁剪,因为其实很多包我们都没有使用到,或者只使用了其中很小部分的功能,比如google大礼包,完整的google包里面有3W+方法,还有android UI相关的库,方法书暴多,design库有1.5W+方法,其实我们也许就仅仅显示一个外部页面而已,代价确实很大,同时也提醒我们做三方插件的时候一定要注意类似的问题。如果你的包裁剪后还是会出现65K,那么恭喜,我们一起愉快的分包吧。
推荐先阅读 google官方解决方案,google官方提供了gradle自动分包方案,但是没有ant的版本(早已不支持),所以我们需要进行手动分包,并且需要继承MutilApplication。
在分包之前需要将MutilDex库down到本地,推荐打包成jar放在plugins/android/libs下,我们的主工程需要继承MutilApplication,如果没有自定义Application则可以在AndroidManifest中直接指定Application为MutilApplication。
MutilDex库地址:如果嫌麻烦直接使用已经打包好的库。
- 库分离
分离出需要重新打包到第二个classes.dex问卷的库,从主工程中剥离出来,注意不要把项目Appilication前需要加载的库剥离出,比如google大礼包。我们接入的三方插件的大多数库文件可以放入第二个dex
- 打包apk文件
将剥离完成后的工程打包
- 将分离出的库文件打包成.dex
命令:
dx --dex output=classes2.dex(输出文件) bin(输入文件或文件目录)
- 将打包的dex加入到apk中
命令:
aapt add unsign.apk classes2.dex
- 重新进行应用签名
jarsigner -verbose -keystore android.keystore -signedjar sign.apk unsigh.apk android.keystore(别名)
最后可以根据需要写到自动化配置中。
- 自动打包
custom_rules.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules">
<property name="dex.file2.name" value="classes2.dex" />
<property name="jar.libs2.dir" value="libs2" />
<property name="debug.key.store" value="C:\Users\Administrator\.android\debug.keystore" />
<property name="debug.key.store.alias" value="androiddebugkey" />
<property name="debug.key.store.password" value="android" />
<target name="-package-second-lib">
<dex executable="${dx}"
output="${dex.file2.name}"
dexedlibs="${out.dexed.absolute.dir}"
nolocals="@{nolocals}"
forceJumbo="${dex.force.jumbo}"
disableDexMerger="${dex.disable.merger}"
verbose="${verbose}">
<path path="${jar.libs2.dir}"/>
</dex>
</target>
<target name="-add-dex" depends="-package-second-lib">
<echo>-add-dex</echo>
<exec
executable="${aapt}"
failonerror="true" >
<arg value="add" />
<arg value="${out.packaged.file}" />
<arg value="${dex.file2.name}" />
</exec>
<delete file="${dex.file2.name}"/>
<delete file="${dex.file2.name}.d"/>
</target>
<target name="-debug-sign">
<!-- only create apk if *not* a library project -->
<do-only-if-not-library elseText="Library project: do not create apk..." >
<sequential>
<!-- Signs the APK -->
<echo level="info">Signing final apk...${out.packaged.file}</echo>
<property name="out.resign.file" location="${out.absolute.dir}/${ant.project.name}-debug-unaligned-resign.apk" />
<signapk
input="${out.packaged.file}"
output="${out.resign.file}"
keystore="${debug.key.store}"
storepass="${debug.key.store.password}"
alias="${debug.key.store.alias}"
keypass="${debug.key.store.password}"/>
<!-- Zip aligns the APK -->
<zipalign-helper
in.package="${out.resign.file}"
out.package="${out.final.file}" />
<echo level="info">Release Package: ${out.final.file}</echo>
</sequential>
</do-only-if-not-library>
<record-build-info />
</target>
<target name="-post-package" depends="-add-dex" />
<target name="debug" depends="-set-debug-files, -do-debug,-debug-sign, -post-build"
description="Builds the application and signs it with a debug key.">
</target>
</project>
1.根目录 android update project -p .
2.使用 ant debug
发布release版本需要制定秘钥,创建ant.properties
key.store=android.keystore
key.alias=android.keystore
指定秘钥位置和别名,可以不用指定密码
推荐阅读下面的内容:
网友评论