安卓ADT项目及升级AS(Android Studio)全攻略

来源:互联网 发布:破解 百度离线 知乎 编辑:程序博客网 时间:2024/06/07 13:42

安卓ADT项目及升级AS全攻略...1

1    ADT项目(即原Eclipse开发环境下项目)打包、签名、混淆配置...2

1.1     生成签名文件...2

1.2     打包配置...2

2    Eclipse项目升级至AS项目及升级过程遇到问题...7

2.1     首先将原先项目复制一份出来(避免损坏原项目),记为project_tag..7

2.2     打开AS选择Import project (Eclipse ADT,Gradle,etc)7

3    AS项目多渠道混淆打包...7

3.1     生成签名文件就不多说,同上...7

3.2     添加签名文件(步骤如下)7

3.3     多渠道及混淆配置...8

 


 

1   ADT项目(即原Eclipse开发环境下项目)打包、签名、混淆配置

1.1  生成签名文件

dos下进入JDK的bin目录

 

运行如下命令:

 

keytool -genkey-alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore

 

(-validity 20000代表有效期天数),命令完成后,bin目录中会生成android.keystore

 

查看命令keytool-list -keystore "android.keystore" 输入你设置的keystore密码

 

输入密钥库口令

       <-------->

您的名字与姓氏是什么?

<-------->

您的组织单位名称是什么?

<-------->

您的组织名称是什么?

<-------->

您所在的城市或区域名称是什么?

<-------->

您所在的省/市/自治区名称是什么?

<-------->

该单位的双字母国家/地区代码是什么?

<-------->

y

输入 <xxxxxx.keystore>的密钥口令

<-------->

输入后回车即可完成

1.2  打包配置

Ø  将1.1中生成的签名文件放入主工程目录(即classpath能识别的目录)下;

Ø  打开cmd命令并分别切换至对应项目目录下:

n  主工程项目执行android update project -n 项目名 -p ./

n  类库项目执行android update lib-project -p ./

Ø  在主工程项目下创建ant.properties文件(内容如下)

key.store=签名文件名

key.alias=签名文件别名

key.store.password=签名文件密码

key.alias.password=签名文件别名密码

apk.dir=生成APK存放路径

app.name=项目名称

market_channels=渠道标识中间用智短号分隔

test.tag.name=debug(测试包标识)

release.tag.name=release(正式包标识)

tz.dir=..\\工程项目

其它项目目录只要与tz.dir放在同一目录下,写法类似;

Ø  在主工程项目下创建custom_rule.xml文件(内容如下)

【配置之前需安装好ant环境】

<?xmlversion="1.0" encoding="UTF-8"?>

<projectname="custom_rules" >

    <!-- 引用ant-contlib这个扩展包,声明一下 -->

    <taskdefresource="net/sf/antcontrib/antcontrib.properties" >

        <classpath>

                     <!—其中ANT_HOM为ant安装目录的环境变量-->

            <pathelement location="${ant.ANT_HOME}/lib/ant-contrib-1.0b3.jar"/>

        </classpath>

    </taskdef>

    <!-- 定义一个时间变量,打完包后跟渠道号一起命名apk -->

    <tstamp>

        <format

            pattern="yyyyMMddhhmm"

            property="pktime"

            unit="hour" />

    </tstamp>

    <!-- 创建apk存放目录 -->

    <mkdir dir="${apk.dir}" >

    </mkdir>

    <!-- 将第三方jar包添加到classpath变量中 -->

    <target name="-pre-compile" >

        <echomessage="JARPATH=${toString:project.all.jars.path}" >

        </echo>

              <!—若有多个循环添加以下标深绿色背景部分-->

        <property

                     <!—工程项目第三方库配置,其它项目配置类似-->

            name="tz.jars"

            value="${tz.dir}/libs">

        </property>

        <path id="tz.lib" >

            <pathpath="${toString:project.all.jars.path}" >

            </path>

            <pathelementlocation="${tz.jars}/第三方包(jar或so)路径 " >

            </pathelement>

        </path>

        <path id="project.all.jars.path">

            <path refid="tz.lib" >

            </path>

        </path>

        <echomessage="JARPATH=${toString:project.all.jars.path}" >

        </echo>

    </target>

    <!-- 替换参数 然后打包APK, deploytest打测试包标识-->

    <target name="deploytest" >

                     <antcalltarget="foreach_replacechannel" >

             <param

                   name="deploy_environment"

                  value="${test.tag.name}"/>

</antcall>

    </target>

       <!—deployrel,打正式包标识-->

    <target name="deployrel" >

        <antcall target="foreach_replacechannel">

            <param

               name="deploy_environment"

               value="${release.tag.name}" />

        </antcall>

    </target>

       <!-- singlerelease ,打单个正式包标识-->

    <target name="singlerelease" >

        <antcall target="modify_manifest_for_singlerelease">

            <param

               name="deploy_environment"

               value="${release.tag.name}" />

        </antcall>

    </target>

       <!—singledebug,打单个测试包标识-->

   <target name="singledebug" >

        <antcall target="modify_manifest_for_singledebug">

            <param

               name="deploy_environment"

               value="${test.tag.name}" />

        </antcall>

    </target>

       <!—打包时循环替换渠道号-->

    <target name="foreach_replacechannel">

        <foreach

            delimiter=","

            list="${market_channels}"

            param="channel"

            target="modify_manifest">

        </foreach>

    </target>

    <target name="modify_manifest">

        <replaceregexp

            byline="false"

            encoding="UTF-8"

            flags="g" >

            <regexppattern="android:name=&quot;TA_CHANNEL&quot;\s*android:value=&quot;(.*)&quot;"/>

            <substitutionexpression="android:name=&quot;TA_CHANNEL&quot;

                android:value=&quot;${channel}&quot;"/>

            <fileset

                dir=""

               includes="AndroidManifest.xml" />

        </replaceregexp>

        <!-- 这里设置最终生成包的存放目录以及apk的名称,注意这里是文件名称,所以变量中不允许出现违规字符,否则将无法生成最终的apk(会出现output is not valid 的错误) -->

        <property

            name="out.final.file"

           location="${apk.dir}/${app.name}_${channel}_${deploy_environment}_${pktime}.apk"/>

        <antcall target="clean" />

        <antcall target="release"/>

    </target>

    <target name="modify_manifest_for_singlerelease">

        <!-- 这里设置最终生成包的存放目录以及apk的名称,注意这里是文件名称,所以变量中不允许出现违规字符,否则将无法生成最终的apk(会出现output is not valid 的错误) -->

        <property

            name="out.final.file"

           location="${apk.dir}/${app.name}_${deploy_environment}_${pktime}.apk"/>

        <antcall target="clean" />

        <antcall target="release"/>

    </target>

    <target name="modify_manifest_for_singledebug">

        <!-- 这里设置最终生成包的存放目录以及apk的名称,注意这里是文件名称,所以变量中不允许出现违规字符,否则将无法生成最终的apk(会出现output is not valid 的错误) -->

        <property

            name="out.final.file"

           location="${apk.dir}/${app.name}_${deploy_environment}_${pktime}.apk"/>

        <antcall target="clean" />

        <antcall target="debug"/>

    </target>

</project>

此时多渠道打包相关配置完成

Ø  在主工程项目下创建proguard-project.txt文件,创建好后在project.properties文件中做关联(proguard.config=proguard-project.txt)

 

-dontoptimize

-dontusemixedcaseclassnames

-dontskipnonpubliclibraryclasses

-verbose

-dontwarn

-dontpreverify

-ignorewarnings

-optimizationpasses5

-optimizations!code/simplification/arithmetic,!field/*,!class/merging/*

-keepattributesSignature,InnerClasses,LineNumberTable

                     <!—排除第三方混淆包-->

-libraryjars..\\项目\第三方包路径

-keepclass android.support.v4.** { *; }

-keeppublic class * extends android.support.v4.**

-keeppublic class * extends android.app.Fragment

-keeppublic class * extends android.app.Activity

-keeppublic class * extends android.app.Application

-keeppublic class * extends android.app.Service

-keeppublic class * extends android.app.View

-keeppublic class * extends android.content.BroadcastReceiver

-keeppublic class * extends android.content.ContentProvider

-keeppublic class * extends android.app.backup.BackupAgentHelper

-keeppublic class * extends android.preference.Preference

 

-keepclassmembersclass * implements java.io.Serializable {

    static final long serialVersionUID;

    private static final java.io.ObjectStreamField[]serialPersistentFields;

    private voidwriteObject(java.io.ObjectOutputStream);

    private voidreadObject(java.io.ObjectInputStream);

    java.lang.Object writeReplace();

    java.lang.Object readResolve();

}

 

-keepclasseswithmembernamesclass * {

    native <methods>;

}

 

-keepclasseswithmembernamesclass * {

    public<init>(android.content.Context, android.util.AttributeSet);

}

 

-keepclasseswithmembernamesclass * {

    public<init>(android.content.Context, android.util.AttributeSet, int);

}

 

-keepclassmembersclass * extends android.app.Activity {

   public void *(android.view.View);

}

 

-keepclassmembersenum * {

    public static **[] values();

    public static ** valueOf(java.lang.String);

}

 

-keepclass * implements android.os.Parcelable {

  public static finalandroid.os.Parcelable$Creator *;

}

-keep class * extends java.lang.annotation.Annotation {*;}

最后根据实际需要排除项目相关包及类文件

【此时对于eclipse项目多渠道、混淆、签名打包基本配置完成】

Ø  执行命令进行打包

n  选中需要的打包的项目右击——》刷新

n  cmd进入到主工程目录执行ant clean;

n  执行ant release/debug(或deployrel)进行打包;

2   Eclipse项目升级至AS项目及升级过程遇到问题

2.1  首先将原先项目复制一份出来(避免损坏原项目),记为project_tag

2.2  打开AS选择Importproject (Eclipse ADT,Gradle,etc)

Ø  选择要转换的项目工程,单击“OK”->下一步,去掉

一直Next即可完成;

Ø  转换后项目可能无法直接运行主要因为以下几个原因导致;

n  图片问题,可能部分图片不是真正png格式;需要通过TotalImageConverter工具转一下;

n  资源配置文件语言问题,需要在头部添加忽略MissingTranslation(示例如下)
<?xml version="1.0" encoding="utf-8"?>

<resources

   xmlns:tools="http://schemas.android.com/tools"

   tools:ignore="MissingTranslation">

</resources>

【解决以上两个问题项目基本可以运行,当然打包、混淆、多渠道需重新配置与Eclipse项目有区别;继续往下看】

3   AS项目多渠道混淆打包

3.1  生成签名文件就不多说,同上

3.2  添加签名文件(步骤如下)

Ø 

Ø  选择工程Modules

Ø  创建签名标识并选择签名文件、设置密码

Ø  配置构建类型

       【此时签名相关配置已完成】

3.3  多渠道及混淆配置

1.     如果混淆文件在当前工程下(即Gradle Scripts),那在buildTypes——>release下新增proguardFilesgetDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'即可;

2.     如果混淆文件放在其它位置,则可通过3.2中配置构建类型的Proguard File选择即中;

3.     混淆过程与Eclipse项目没多大区别可参考上面;

4.     多渠道配置如下:

productFlavors{

        updateapks {}

        baiduzhushou {}

        qiuyaozhushou {}

        anzhuoshichang {}

        yingyongbao{}

        wandoujia{}

        sanliuling{}

        huaweishichang{}

        pgyer{}

        sinaweibo{}

 

        productFlavors.all { flavor ->

            flavor.manifestPlaceholders =[TA_CHANNEL: name]

        }

 

}

基本TA_CHANNEL为Mefester.xml渠道标识名称

【配置好后在右边选择Gradle,刷新后选择工程项目在build会出现对应多个渠道打包标识】(如下图)

5.     命令行统一生成多渠道

Ø  在android studio底栏中有个命令行工具Terminal,打开后就CMD可以自动切换到当前项目的目录下

Ø  有的项目下会有graldew.bat这个文件,你就可以输入这个命令:

gradlew assembleRelease

就可以一次性生成所有的渠道包了

【在执行以上命令之前最好先设置以下环境变量】

变量名为:GRADLE_HOME,变量值就为gradle的根目录;

所以变量值为:C:\Users\yazhou\.gradle\wrapper\dists\gradle-2.1-all\27drb4udbjf4k88eh2ffdc0n55\gradle-2.1

 

还有一个在系统变量里PATH里面添加gradle的bin目录

我的就是C:\Users\yazhou\.gradle\wrapper\dists\gradle-2.1-all\27drb4udbjf4k88eh2ffdc0n55\gradle-2.1\bin


安卓ADT项目及升级AS(Android Studio)全攻略.docx


0 0
原创粉丝点击