Android Ant命令行编译和APK签名详解

 更新时间:2016年9月20日 19:59  点击:1886
本文章来给各位同学详细的介绍一下关于Android Ant命令行编译和APK签名详解一些实现方法,这是一个朋友在自己做安卓开发时写的,希望对大家会有所帮助呀。

最近在做Android开发时,需要引用第三方的代码进项目,一般情况下,直接在Eclipse下设置需要导入的代码的编译输出为library即可,但是很多代码在Eclipse下编译会出现很多莫名其妙的错误。因而只能使用命令行方式对代码进行编译。具体方法如下:

1.安装编译用的Java,安装Android Platform-tools,安装Ant,设置好各种环境变量。部分Linux下Ant已经默认集成,Windows下需要自行安装。
2.使用Android工具更新代码的编译配置。
3.使用Ant工具进行编译,可编译Debug版和Release版本。
4.生成代码签名用的私钥,并对APK进行签名。
5.对APK文件进行对齐,对大文件APK有不错的效果。


以下是参考Bash代码,可自己需要更改,执行时,sudo bash XXX.sh即可

 代码如下 复制代码

# Setup Java Home
JAVA_HOME = "/System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home"
 
# Setup android Home
ANDROID_HOME="~/android-sdk-macosx"
 
# Setup path
PATH = "$ANDROID_HOME/tools:$JAVA_HOME/bin:$PATH"
 
# Update current project
android update project --path .
#android update project --path ./Library/lib1
#android update project --path ./Library/lib2
 
# Remove keystore
rm -f product.keystore
 
# Make keystone
keytool -genkey -alias product.keystore -keyalg RSA -validity 40000
-keystore product.keystore -storepass password -keypass password
-dname "CN=Product OU=Android Team O=Organization L=Hongkong ST=Hongkong C=China"
 
# Clean
ant clean
 
# Remove ant.properties
rm -f ant.properties
 
# Make ant.properties
echo "key.store=product.keystore" > ant.properties
echo "key.alias=product.keystore" >> ant.properties
 
# Build apk
ant release
 
# Sign APK
# jarsigner -verbose -keystore product.keystore -signedjar
# bin/product_signed.apk bin/product-release-unsigned.apk product.keystore
 
# Zip align apk
# zipalign -v 4 bin/product_signed.apk bin/product_final.apk

说明:
更新Android的ant编译配置,如果代码的结构发生变更,请执行,如果代码中包含引用的第三方库代码,需要分别对这些代码进行更新。

 代码如下 复制代码

# Update current project
android update project --path .
#android update project --path ./Library/lib1
#android update project --path ./Library/lib2

生成签名用的Keystore文件,几个参数的说明
-genkey 生成秘钥证书
-alias 别名
-keyalg 秘钥的计算算法
-validity 有效期
-keystore 秘钥库文件路径
-storepass 秘钥库密码
-keypass 秘钥证书密码
-dname 发行者信息
CN= 发行者姓名 (个人姓名或产品名)
OU= 组织单元名 (团队名)
O= 组织机构名 (公司名)
L= 城市/地区
ST= 州/省
C= 国家代码

 代码如下 复制代码

# Make keystone
keytool -genkey -alias product.keystore -keyalg RSA -validity 40000
-keystore product.keystore -storepass password -keypass password
-dname "CN=Product OU=Android Team O=Organization L=Hongkong ST=Hongkong C=cn"

生成ant自动编译用的ant.properties文件,设置key.store和key.alias两个变量后,ant release时会自动对生成的APK签名和对齐

 代码如下 复制代码

echo "key.store=product.keystore" > ant.properties
echo "key.alias=product.keystore" >> ant.properties

手动对代码签名,几个参数的说明
-verbose 显示输出
-keystore keystore别名
-signedjar 签名apk文件,第一个参数为目标文件,第二个为未签名apk

 代码如下 复制代码

# Sign APK
jarsigner -verbose -keystore product.keystore -signedjar bin/product_signed.apk bin/product-release-unsigned.apk product.keystore

手动对APK进行对齐

 代码如下 复制代码

# Zip align apk
zipalign -v 4 bin/product_signed.apk bin/product_final.apk

可能不秒用户会发现用css定义好的内容在手机中显示不那么标准了,下面小编来给大家介绍移动web开发无法正确按照响应样式显示解决办法。

记最近在做移动混合应用的开发,遇到的一个问题:android无法按照指定的响应样式正确显示。

首先说一下两次遇到此问题的环境:
1.使用jQuery Mobile写界面时,在测试机上(G7)字体和界面显示偏小。
2.在G7上使用自定义的响应样式进行布局时没有问题,界面显示正常。但在小米2S上,界面却显示错误。通过JS脚本获取了一下小米2S的屏幕宽度,发现获得的值并不是想像的720px,而是360px,所以响应的样式会发生错误。

 
在没有设置target-densitydpi时


在设置target-densitydpi时,得到正确的响应布局

原来在android上,会通过 target-densitydpi 来获取DPI。在不设置的情况下,默认选择的是 medium-dpi(160)。

上面的两个问题,可以通过给元标签添加target-densitydpi=device-dpi来解决,代码如下。

 代码如下 复制代码

<meta name="viewport" content="target-densitydpi=device-dpi, width=device-width, initial-scale=1, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">

网上找到听说Eclipse下Android插件报错Debug certificate expired是因为,Debug证书的有效期限是365天,那么不可避免的就会有证书过期的问题了。而Android SDK又比较呆板,发现证书过期了,不会给你换新的,只会给你Error提示。

前几天用Eclipse写程序的试试,突然就不能运行了,报了个奇怪的错误。

[2010-02-03 10:31:14 - androidVNC]Error generating final archive:
Debug certificate expired on 1/30/10 2:35 PM!

解决的办法比较简单:

将debug.keystore直接删除。Android SDK发现debug.keystore丢失了,就会自个生成一个新的。再运行SDK

不同系统位置不同

删除Android的debug certificate即可。
Linux/Mac OS : ~/.android/debug.keystore
Windows: %USERPROFILE%/.android

本文章来给大家介绍在android开发中我们要对EditText限制,只能让用户输入像数字 字母 邮箱地址,电话号之类的,其它的不能输入。

下面以数字、电话为例讲述EditText怎么设置输入类型,其他类型可以参考InputType类。

1) 只能输入数字

 代码如下 复制代码

EditText et = (EditText) findViewById(R.id.etTest);
et.setInputType(InputType.TYPE_CLASS_NUMBER);

2) 只能输入电话号码

 代码如下 复制代码

EditText et = (EditText) findViewById(R.id.etTest);
et.setInputType(InputType.TYPE_CLASS_PHONE);//电话

3) 邮箱地址

 代码如下 复制代码

EditText et = (EditText) findViewById(R.id.etTest);
et.setInputType(InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS);

4) 禁止输入任何文本

 代码如下 复制代码

EditText et = (EditText) findViewById(R.id.etTest);
et.setInputType(InputType.TYPE_NULL);

// 禁止输入(不弹出输入法)上述也是隐藏输入法的一种方式,还有另外一种隐藏办法,

可查看android隐藏IME(输入法)输入框

不让程序默认升起IME输入框有两种方法:
1.让EditText失去焦点,使用EditText的clearFocus方法
2.强制隐藏Android输入法窗口,在IME类中我们通过实例化输入法控制对象,通过hideSoftInputFromWindow来隐藏IME输入框。

代码

 

 代码如下 复制代码
Toast.makeText(WindowBackgroundColorActivity.this, "焦点改变", Toast.LENGTH_SHORT).show();
InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
//第一种方法
//imm.toggleSoftInput(InputMethodManager.SHOW_IMPLICIT, InputMethodManager.HIDE_NOT_ALWAYS);
//第二种方法
imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);

参考代码:

 代码如下 复制代码

<EditText android:id="@+id/etTest" android:inputType="number"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>

下面小编来给各位同学介绍一篇关于Android中Movie导入播放GIF图片文件异常IOException.reset的解决办法,希望些方法对你有帮助。

使用Movie播放GIF图片时,能正常导入assets中的gif文件,如:

 代码如下 复制代码

is=context.getResources().openRawResource(R.drawable.mygif);
movie = Movie.decodeStream(is);

然而把网络图片加载到本地后,却报以下错误:

 代码如下 复制代码

java.io.IOException
at java.io.InputStream.reset(InputStream.java:218)
at android.graphics.Movie.decodeStream(Native Method)
at android.graphics.Movie.decodeTempStream(Movie.java:74)
at android.graphics.Movie.decodeFile(Movie.java:59)

我是在Androidmanifest.xml声明了权限:

 代码如下 复制代码

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

解决办法:

 代码如下 复制代码

InputStream is = null;
    try {
        is = new BufferedInputStream(new FileInputStream(new File(getCacheDir(), "mygif.gif")), 16 * 1024);
        is.mark(16 * 1024);
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
movie = Movie.decodeStream(is);

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Linux中grep命令详解

    grep命令是Linux系统中最重要的命令之一,功能是从文本文件或管道数据流中筛选匹配的行和数据,如果再配合正则表达式,功能十分强大,是Linux运维人员必备的命令,这篇文章主要介绍了Linux中grep详解,需要的朋友可以参考下...2023-02-15
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • C#隐式运行CMD命令(隐藏命令窗口)

    这篇文章主要介绍了C#隐式运行CMD命令(隐藏命令窗口),本文实现在winform窗口中运行CMD命令,需要的朋友可以参考下...2020-06-25
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • PHP实现连接设备、通讯和发送命令的方法

    本文实例讲述了PHP实现连接设备、通讯和发送命令的方法。分享给大家供大家参考。具体如下:开发的BS架构的软件(PHP),需要跟设备进行通讯,在此记录一下,欢迎各位指正:1. 采用php socket技术使用TCP/IP连接设备参数$service_po...2015-10-21
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • 对MySQL日志操作的一些基本命令总结

    MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句...2015-11-24
  • Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
  • Android 开发之布局细节对比:RTL模式

    下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
  • Mysql命令大全(详细篇)

    一、连接Mysql格式: mysql -h主机地址 -u用户名 -p用户密码1、连接到本机上的MYSQL。首先打开DOS窗口,然后进入目录mysql/bin,再键入命令mysql -u root -p,回车后提示你输密码.注意用户名前可以有空格也可以没有空格,但是密...2015-11-08
  • Android中使用SDcard进行文件的读取方法

    首先如果要在程序中使用sdcard进行存储,我们必须要在AndroidManifset.xml文件进行下面的权限设置: 在AndroidManifest.xml中加入访问SDCard的权限如下: <!--...2016-09-20