打包发布for Android

最后更新时间:2019年5月17日

APP应用打包

基于 Android 的移动APP开发完成后,接下来需要打包应用程序,最后通过云开发世界上传,审核通过后在云交易中心上架。

在APP代码开发完成之后,需要对程序进行打包操作,生成apk才能在手机上安装使用。打包时需要对APP进行签名。

小知识:为何要进行数字签名?一个方面是由于Android系统的要求,一个Android应用程序必须经过数字签名才能安装到手机上;另一方面,Android系统根据“程序包名+数字签名”来确定应用程序的唯一性。进行数字签名能够避免许多问题,例如:如果只根据包名来确定的话,可能会有多个应用的包名完全一样,那么在安装的时候会进行覆盖安装,这样不利于应用安全性的保护。

APP打包(for Android Studio)

移动应用打包使用集成开发工具自带的打包功能即可,以入门示例“HelloWorld”for Android Studio为例,具体操作如下:

(1) 在菜单栏选择“Build”下的“Generate Signed APK”,弹出对话框;

061创建签名APK.png

(2) 如果没有签名文件,点击“Create new”按钮,弹出创建签名文件的对话框,输入信息点击“OK”即可;

062创建新的签名文件.png

(3) 回到上一界面,点击“Next”;

063打包签名设置.png

(4) 选择打包后apk的存放位置、打包的版本(release:发布版、debug:调试版),然后将“Signature Versions”签名方案栏中的“V1”和“V2”都进行勾选。随后点击“Finish”,稍作等待就能生成apk。

064打包设置.png 065打包的正式签名apk.png

APP打包(for Eclipse)

1

离线数据打包配置(打包前,可选)

APP若使用离线数据,需要注意APP数据打包:一般情况下,打包时可将离线数据一起打包成APK,用户下载安装时自动将其离线数据放置到移动设备根目录下。

使用场景:当程序中使用的离线数据存储大小较小的时候可以将其打包到APK中,避免用户使用的时候还需拷贝数据。但是当数据量较大,则不建议将数据打包到APK中。

数据打包步骤:

(1)首先将数据文件压缩为zip文件,将压缩文件拷贝拷到工程目录中的“assets”文件夹中;

066拷贝数据包.png

(2)在AndroidManifeast.xml文件中添加对手机的读写权限,添加了权限之后程序才能对手机的文件进行操作。

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

(3)在子线程中编写解压数据包的代码(此方法为解压zip文件的方法),例如在MainActivity.java文件中编写解压数据包代码,添加解压文件的代码如下所示。

    new Thread(new Runnable()
    {
	@Override
	public void run()
	{
		//判断文件是否已存在
        String fileFolder = Environment.getExternalStorageDirectory().getPath() + "/MapGIS Data/wuhan";
		File file = new File(fileFolder);
		if (!file.exists() && !file.isDirectory())
		{
			//如果文件不存在,则解压文件
			mapFromAsset(getApplicationContext(), "MapGIS Data.zip");
		}
	}
    }).start();

    //方法
    public static void mapFromAsset(Context context, String assetName)
	{
		 //解压目的存放路径
		 String outputDirectory = Environment.getExternalStorageDirectory().getPath();
		 //输入流
		 InputStream localInputStream;
		 try {
			 localInputStream = context.getAssets().open(assetName);
			 //调用解压文件方法
			 unzip(localInputStream, outputDirectory);
		 } 
		 catch (IOException e) {
			 e.printStackTrace();
		 }
	}

	/**
	 * 解压ZIP文件
	 * 
	 * @param zipFileName ZIP文件
	 * @param outputDirectory 解压目的存放路径
	 */
	public static void unzip(InputStream zipFileName, String outputDirectory)
	{
		try
		{
			BufferedOutputStream dest = null;
			ZipInputStream in = new ZipInputStream(zipFileName);
			// 获取ZipInputStream中的ZipEntry条目,一个zip文件中可能包含多个ZipEntry,
			// 当getNextEntry方法的返回值为null,则代表ZipInputStream中没有下一个ZipEntry,
			// 输入流读取完成;
			ZipEntry entry = in.getNextEntry();
			while (entry != null)
			{
				// 创建以zip包文件名为目录名的根目录
				File file = new File(outputDirectory);
				file.mkdir();
				if (entry.isDirectory())
				{
					String name = entry.getName();
					name = name.substring(0, name.length() - 1);

					file = new File(outputDirectory + File.separator + name);
					file.mkdir();
				}
				else
				{
					// 判断父文件夹是否被创建
					File Fout = new File(outputDirectory, entry.getName());
					if (!Fout.exists())
					{
						(new File(Fout.getParent())).mkdirs();
					}
					int count;
					byte data[] = new byte[2048];
					file = new File(outputDirectory + File.separator + entry.getName());
					file.createNewFile();
					FileOutputStream out = new FileOutputStream(file);
					dest = new BufferedOutputStream(out, 2048);
					while ((count = in.read(data, 0, 2048)) != -1)
					{
						dest.write(data, 0, count);
					}
					dest.flush();
					dest.close();
				}
				// 读取下一个ZipEntry
				entry = in.getNextEntry();
			}
			in.close();		//到此解压完成,可以读取其中的数据
		}
		catch (FileNotFoundException e)
		{
			e.printStackTrace();
		}
		catch (IOException e)
		{
			// TODO 自动生成 catch 块
			e.printStackTrace();
		}
	}

说明:上述解压代码不支持中文名称的文件,建议将数据库文件、地图文档文件等用英文命名。若要支持中文名称的文件,可以选择用第三方解压功能的jar包。

解压完成之后即可读取解压的文件。

067打包后安装apk成功解压数据包.png    

2

移动应用打包步骤

移动应用打包使用集成开发工具自带的打包功能即可,以入门示例“FirstMap”for Eclipse为例,具体操作如下:

(1)右键“FirstMap” |“Export”,选中“Android” |“Export Android Application”,单击 “Next”继续,如下图所示;

068导出Android应用程序.png

(2)选择将要导出的Project“FirstMap”,单击“Next”继续,如下图所示;

069选择目标项目.png

(3)在打开的新窗口中,选中“Create new keystore”,单击“Browse”,选择签名文件存储位置并设置文件名,如下图所示,通常存放在该项目的根目录下;

特别说明:在此操作将生成keystore文件(即数字签名/数字证书,一般情况下用来进行通信加密),基于此文件打包APK,主要作用为APP加密,一来防破解、二来信任。推荐不同app打包用不同的数字签名。例如升级应用程序时同包名,但签名不一样是无法覆盖安装的(此举也避免了APP升级时其他人恶意发布新版本替换原来的真版本);空的签名是未信任的应用在某些设备上也安装不了。

0610创建新的密钥.png

0611设置名称与保存路径.png

(4)单击保存回到“Keystore selection”界面,设置密码和确认密码,并单击“ Next”继续,如下图所示;

0612设置创建的密钥.png

(5)在打开的“Key Creation”对话框中设置别名、地区、单位等信息,单击“ Next”继续,如下图所示:

0613设置生成密钥的相关信息.png

(6)在新打开的“Destination and key/certificate checks”对话框中,单击“Browse”,选择目标 APK 文件存放的位置及文件名,单击“保存”,回到“Destination and key/certificate checks”对话框,单击“Finish”,完成工程“FirstMap”的打包,如下图所示;

0614设置APK文件名称与存放位置.png

0615确认打包生成APK文件.png

至此,打包工作完成,接下来将生成的*.APK 文件拷贝到手机,在手机端运行安装,或者将其发布到互联网供其他用户下载安装。

APP上传发布

移动应用打包完成后,即可使用云开发世界的 “上传新产品”模块上传该移动产品,通过审核后在云交易中心发布,供终端用户使用。

(1) 在线访问云开发世界,通过账号登录(需先注册并加入云开发世界),登录之后单击网页右上角的『工作台->工作室->个人工作室->产品管理->上传新产品->移动产品』进入;

0616上传新产品.png

(2) 在弹出的“上传-移动产品”页面中,默认勾选产品类别『移动端-Android应用』,按照界面提示分别设置产品提交、基本信息、开发信息、描述信息等,如下图所示(其中标红项为必填项);

0617选择上传文件设置应用参数.png

(3) 设置完成之后,可点击最下方的『保存产品』进行保存或『提交产品』进行提交。 若点击的是『保存产品』则如下图所示,在〖我的产品→未上架〗的列表中显示该框架产品,此时产品状态为“未提交”,提供查看,编辑和删除操作。

0618保存产品.png

若点击的是『提交产品』,则如下图所示,在『我的产品→未上架』的列表中显示该框架产品,此时产品状态为“待审核”,只提供查看和撤回操作。等待审核,若审核成功则会在云交易中心上架,若有问题则会返回相关问题信息给用户。

0619提交审核.png

APP上传完成后,Smaryun后台质保团队将严格测试审核APP产品,审核通过后的APP将统一在云交易中心上架。