apk打包之用纯命令行打包apk(android4.4亲测可用)

2022-08-02 14:54:47 浏览数 (1)

代码语言:javascript复制
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"><span style="font-size:18px;">现在小型程序的打包基本上用IDE完成了</span></span>

所以久而久之很多人都不会最基础的打包方式,现在就来捋顺关系

首先是步骤 ,网上最少有三步,最多有8步,其中一些函数都已经被废弃,所以,笔者选择比较通用的6步

1.用aapt命令生成R.java文件

2.用javac命令编译java源文件生成class文件

3.用dx.bat将class文件转换成classes.dex文件

4.用aapt命令生成资源包文件resources.ap_

5.生成未签名的apk(sdk更新3.0以后貌似apkbuilder已经被删除了,所以笔者不用apkbuilder)

6.用jarsinger命令对apk认证,生成signed.apk

下面介绍笔者的实施背景

1.target以20为例,其中android.jar的地址为E:adt-bundle-windows-x86_64-20140702sdkplatformsandroid-20android.jar

2.项目为learn723(不要问为什么是这个名字,我测试了才成功几十遍我会说!!!),建立完成之后的复制出来,地址为E:Workspace

3.SDK为E:adt-bundle-windows-x86_64-20140702sdk

4.密匙地址E:keystore(不会设密匙的后面会有脑补地址)

首先第一步

代码语言:javascript复制
aapt package -f -m -J ./gen -S res -M AndroidManifest.xml -I E:adt-bundle-windows-x86_64-20140702sdkplatformsandroid-20android.jar

  -f 如果编译生成的文件已经存在,强制覆盖。   -m 使生成的包的目录存放在-J参数指定的目录   -J 指定生成的R.java 的输出目录路径   -S 指定res文件夹的路径   -I 指定某个版本平台的android.jar文件的路径   -A 指定assert文件夹的路径

这里要注意,可能会报缺失资源的错误,这里需要确保的是,建立项目是最低版本不能低于4.0,否则就会缺失资源

第二步

代码语言:javascript复制
javac -bootclasspath E:adt-bundle-windows-x86_64-20140702sdkplatformsandroid-20android.jar -d bin srccomexamplelearn723*.java gencomexamplelearn723R.java

    -target <版本> 生成特定 VM 版本的类文件   -bootclasspath <路径> 覆盖引导类文件的位置   -d <目录> 指定存放生成的类文件的位置   -sourcepath <路径> 指定查找输入源文件的位置

这里没什么要注意的,好吧,你的程序不能出错,或者得设置环境变量(废话)

第三步

代码语言:javascript复制
dx --dex --output=E:Workspacelearn723binclasses.dex E:Workspacelearn723binclasses

--output=<要生成的classes.dex路径> <要处理的class文件的路径>

这里要注意前后两者的地址不统一,一个是bin,一个是binclass,这里是个很重要的不同,笔者就是在这里花费了一个中午的时间(午觉!!!)虽然在已有的地方都是bin,但通过笔者和同事的亲测,两个都是bin的话可能会出现

NEXPECTED TOP-LEVEL EXCEPTION: com.android.dx.cf.iface.ParseException: class name (/path/to/className) does not match path (bin/classes/path/to/className)的错误,而这里就会发现,两者的地址不同,然后根据提示进行修改

第四步

代码语言:javascript复制
aapt package -f -M AndroidManifest.xml -S res -I 
E:adt-bundle-windows-x86_64-20140702sdkplatformsandroid-20android.jar -F binresources.ap_

       -f 如果编译生成的文件已经存在,强制覆盖   -M 指定AndroidManifest.xml的路径   -S 指定res文件夹路径   -I 指定某个版本平台的android.jar的路径   -F 指定输出文件完整路径

第五步

代码语言:javascript复制
java -cp E:adt-bundle-windows-x86_64-20140702sdktoolslibsdklib.jar com.android.sdklib.build.ApkBuilderMain learn723.apk  -v -u -z binresources.ap_ -f binclasses.dex -rf src

这里不能用 apkbuilder命令!!!

第六步

这里已经有apk了,但没有签名,所以不能安装

具体密匙制作和加签名可以脑补http://jingyan.baidu.com/article/3c48dd3491d91fe10be358f4.html

现在已经有密匙了,然后进入关键的一步,先进入密匙所在的文件夹!!!先进入密匙所在的文件夹!!!先进入密匙所在的文件夹!!!重要的事情说三遍,我也不知道为什么不在密匙所在目录命令怎么也写不成功,总是报只能有一个别名,希望大牛指点

然后代码为

代码语言:javascript复制
jarsigner -verbose -keystore mydemo.keystore -signedjar -learn723s.apk E:Workspacelearn723learn723.apk mydemo.keystore

然后继续输入密匙密码即可

这个时候了learn723s.apk(即第一个)为加密好的,地址在密匙目录,

最后开启虚拟机

在cmd中用adb install learn723s.apk命令就可以安装成功了!!!

好吧,言归正传,如果有兴趣的人可以写成shell,这个对于自动打包的软件设计有很重要的帮助

后面附两篇文章,虽然由于版本的原因,函数废弃的原因,按照下面的方法不能实现,但也可以增加大家的错误经验,避免走这些路,另外里面的一些讲解也比较详细,

http://bbs.9ria.com/thread-250131-1-1.html http://jingyan.baidu.com/article/14bd256e21b415bb6d26128b.html

0 人点赞