1:打包步骤:
1:桌面建立一个文件夹,名字叫keystore
2:点击build下面的 ,如下:
3:会出现如下界面:
4:下一步:
5:如果有keystore,请点击 choose existing,选择以前的keystore,同时输入密码和项目名字,最后点击下一步,如果没有keystore,请选择 create new keystore,跳转如下界面:
上面的参数分别是:
keystore path:存放keystore的路径,一般建议在桌面建立一个文件夹,放这个文件,
password:密码
confirm:重复输入密码
Alias:别名,唯一识别名(一般建议使用项目的名字)
Frist and last name:项目的名字
6:写完以上信息,点击ok,进入如下界面:
7:点击下一步,进入下一个页面:(如果开发工具设置了密码,会让输入密码,否则跳过这不)
8:最后一步,选择apk的存放路径:(建议一般情况放到keystore里面)
以上就是最简单的打包.
代码混淆:
其中我们打包的时候为了防止被反编译,需要对代码进行混淆;首先在Android studio里面开启代 码混淆的方式很简单,默认Android studio不开启代码混淆,
其中开启代码混淆的字段为:minifyEnabled,false不开启代码混淆,true开启代码混淆,图如下:
proguardFiles:后面两个文件名字,第一个是代表系统帮我们做的混淆,第二个代表需要我们自己写混淆规则.
混淆规则写在:proguard-rules.pro或者proguard-rules.txt里面
-optimizationpasses 5 # 指定代码的压缩级别(混淆次数可以定义,但是一般混淆5次)
-dontusemixedcaseclassnames # 是否使用大小写混合(加上他表示使用大小写混合)
-dontpreverify # 混淆时是否做预校验(表示混淆的时候会不会报错)
-verbose # 混淆时是否记录日志(加上他表示混淆的时候记录日子)
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所采用的算法(指定混淆的时候所采用的算法)
声明那些类不能被混淆:
-keep public class * extends android.app.Activity # 保持哪些类不被混淆 -keep public class * extends android.app.Application # 保持哪些类不被混淆 -keep public class * extends android.app.Service # 保持哪些类不被混淆 -keep public class * extends android.content.BroadcastReceiver # 保持哪些类不被混淆 -keep public class * extends android.content.ContentProvider # 保持哪些类不被混淆 -keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些类不被混淆 -keep public class * extends android.preference.Preference # 保持哪些类不被混淆 -keep public class com.android.vending.licensing.ILicensingService # 保持哪些类不被混淆
不能混淆的包括如下:
-keepclasseswithmembernames class * { # 保持 native 方法不被混淆 native <methods>; } -keepclasseswithmembers class * { # 保持自定义控件类不被混淆 public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * {# 保持自定义控件类不被混淆 public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { # 保持自定义控件类不被混淆 public void *(android.view.View); } -keepclassmembers enum * { # 保持枚举 enum 类不被混淆 public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆 public static final android.os.Parcelable$Creator *; }
注意: shrinkResources 表示是否移除图片资源 true表示移除,false 表示不移除
Android studio 多渠道打包:
目的:多渠道打包的目的是什么?
多渠道打包的目的是为了统一app在各个平台的下载量,一般集成友盟,同时会集成友盟统计.
第一步:在注册文件修改一下文件:AndroidManifest.xml中修改以下值:
<meta-data android:name="UMENG_CHANNEL" android:value="wandoujia" />
修改为:
先你必须在AndroidManifest.xml中的meta-data修改以下的样子:
<meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" />
其中${UMENG_CHANNEL_VALUE}中的值就是你在gradle中自定义配置的值
build.gradle文件就利用productFlavors这样写:
productFlavors { wandoujia { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] } baidu { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"] } c360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "c360"] } uc { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"] } }
其中[UMENG_CHANNEL_VALUE: "wandoujia"]就是对应${UMENG_CHANNEL_VALUE}的值。
最新更新
后来发现上面的重复代码太多,就在网上又发现了一个更简洁的写法
productFlavors { wandoujia {} baidu {} c360 {} uc {} productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } }
其中name的值对相对应各个productFlavors的选项值,这样就达到自动替换渠道值的目的了。
这样生成apk时,选择相应的Flavors来生成指定渠道的包就可以了,而且生成的apk会自动帮你加上相应渠道的后缀,非常方便和直观。
发布步骤:
一般情况下发布平台包括360,豌豆荚,91助手,应用宝,腾讯手机助手
首先以360为例:
第一步:首先需要打包apk,接下来交给测试区测试.当测试测试的没有BUG,我们就可以拿着apk去上线.
第四步:选择软件发布,如果没有登陆,会跳转到登陆页面,进行登陆,或者注册,登陆成功以后进入如下界面,点击软件按钮:
第五步:点击软件按钮,进入app发布页面:
(1):上传apk
(2):上传版权证明
(3):选择语言
(4):选择资费类型
(5):应用简介
(6):上传图标
(7):提交审核,立即发布.
注意:上传apk的时候需要进行加固,加固完以后需要进行重新签名,签名步骤如下:
第一步:首先从360下载到apk
第二部:将apk与keystore.jsk 放到同一个文件夹下面
第三部:启动终端命令行,cd进去到当前文件夹:
输入如下格式:
arsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore 【你的签名文件】 【代签名的apk】 【你的alias】 -storepass 【你的密码】
代码如下:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore keystore.jks app-release.apk TestApk -storepass 123456
注意:【你的签名文件】必须带后缀,否则会报签名失败的错误.
【代签名的apk】 使用带后缀的全部名字
【你的alias】 打包时候指定的,一把使用项目名字
【你的密码】 就是密码
- app打包,发布(同步发生冲突)
1:打包步骤: 1:桌面建立一个文件夹,名字叫keystore 2:点击build下面的 ,如下: 3:会出现如下界面: 4:下一步: 5:如果有keystore,请点击 choose exi ...
- iOS开发之 xcode6 APP 打包提交审核详细步骤
一. 在xcode6.1和ios10.10.1环境下实现app发布 http://blog.csdn.net/mad1989/article/details/8167529 http://jingya ...
- Django APP打包重用
引言 有时候,我们需要将自己写的app分发(dist)给同事,分享给朋友,或者在互联网上发布,这都需要打包.分发我们的app. Django的子系统重用是基于app级别的.也就是一个项目可以包含多个互 ...
- apicloud版人人商城app打包教程
一.APP环境搭建和配置编译1.登录APICLOUD后台新建应用 步骤一 .注册账号注册apicloud 账号并登录APICLOUD控制台 注册apicloud 账号:https://www.apic ...
- TroubleShooting笔记--快照进程sp_replupdateschema和索引重建发生冲突
今天早上服务器出现大面积的阻塞,上去排查blocking,最后大概确定的问题是: rebuild index job(243) --->blocked--->sp_replupdatesc ...
- App 打包并跳过 AppStore 的发布下载
一.App 打包 (编译 -> 链接 -> 打包) 1) 下载发布版的证书并安装. 2)Target -> Build Setting,改为发布版本的 profile 3) Targ ...
- ios App 打包
ios 版本的 App 打包两种方式: 1. 命令行 xcodebuild exportArchive -exportFormat ipa 2. 通过 xcode Product -> Arch ...
- cxf,两个声明导致 ObjectFactory 类中发生冲突
说明先,这里不管是client还是server端都是用java语言编写,如有写得不好,望原谅! 问题 http://localhost:8080/WEB-SMVC/cxf/userService?ws ...
- iOS开发基础:最新的APP打包上架流程
之前有人留言让我更新部分文章,下面就为大家分享一下iOS的APP打包上架流程: 上传至apple developer 1.1 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...
随机推荐
- 常用HTML标签元素结合及简介
常用HTML标签元素结合及简介 <html></html> 创建一个HTML文档<head></head> 设置文档标题和其它在网页中不显示的信息< ...
- Hadoop:输入,输出,key,value格式
map: (K1, V1) → list(K2, V2) reduce: (K2, list(V2)) → list(K3, V3) (K1, V1): jobConf.setInputKeyClas ...
- 对客户推荐产品模型+python代码
首先观看数据: l 数据的基本特征用 describe 描述每个基本特征 l 画图画出每个特征的基本统计图 应用import matplotlib.pylab as pl 画图显示 l 关 ...
- web.config 配置
一.认识Web.config文件 Web.config 文件是一个xml文本文件,它用来储存 asp.NET Web 应用程序的配置信息(如最常用的设置asp.NET Web 应用程序的身份验证方 ...
- TestNG插件的安装问题
一.可以采用离线安装的方式 离线安装若不成功,可以删除之前的eclipse,然后在新下载eclipse中添加离线安装包 1.离线安装方法: 发现很多同学和我一样无法在线安装testNg,现在分享一个离 ...
- C语言程序设计第12次作业
一.本次课主要内容: 本章主要介绍指针相关的基础知识,本节课的主要如下 (1)通过示例"电码加密"引入字符指针与字符串处理.首先重点介绍字符指针和字符串的关联和区别,然后对常用字符 ...
- 谈谈自己对C语言中函数指针的一些理解 (第一次写博客,有点小兴奋哈)
1.函数指针声明的格式及简单的使用 (1)格式:(返回值)(*函数指针名)(参数列表) 例如:声明一个无参数无返回值的函数指针(void)(*p)(void). (2)将函数指针指向某个无参数无 ...
- 电脑重装系统后如何恢复Mysql数据库
电脑重装系统后如何恢复Mysql数据库 一.[设置mysql的path]
- Java并发编程学习笔记(二)——对象的共享
主要概念:可见性.重排序.失效数据.最低安全性.发布.逸出.线程封闭(Ad-hoc.栈封闭.ThreadLocal类).不变性.Final域.事实不可变对象. 1.在没有同步的情况下,编译器.处理器以 ...
- 将IIS6.0中的某页设置成首页