美文网首页Unity干货
Unity ant解决打包65535问题原理(官方解决方案)

Unity ant解决打包65535问题原理(官方解决方案)

作者: 阿飞咯 | 来源:发表于2017-08-11 18:44 被阅读235次

    随着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
    

    指定秘钥位置和别名,可以不用指定密码

    推荐阅读下面的内容:

    美团Android DEX自动拆包及动态加载简介

    其实你不知道MultiDex到底有多坑

    Android拆分与加载Dex的多种方案对比

    Jenkins中的Android打包任务设计

    ant 入门使用指南

    Android自动化构建之Ant多渠道打包实践(下)

    Android利用ant手动打包

    彻底掌握Android多分包技术MultiDex-用Ant和Gradle分别构建(一)

    Android签名机制之---签名过程详解

    很好用的工具——查看apk方法数

    相关文章

      网友评论

        本文标题:Unity ant解决打包65535问题原理(官方解决方案)

        本文链接:https://www.haomeiwen.com/subject/hhurrxtx.html