安卓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开发环境下项目)打包、签名、混淆配置
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.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="TA_CHANNEL"\s*android:value="(.*)""/>
<substitutionexpression="android:name="TA_CHANNEL"
android:value="${channel}""/>
<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项目多渠道混淆打包
?
? 选择工程Modules
? 创建签名标识并选择签名文件、设置密码
? 配置构建类型
【此时签名相关配置已完成】
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