本文将介绍如何在Mac系统下命令行编译生成一个简单的Apk程序。

准备工作

配置环境变量

aapt、dx、android.jar等工具或jar包本文采用SDK-26版本。

为了在mac系统下方便调用命令,需要添加环境变量:

命令

默认目录

adb

~/Library/Android/sdk/platform-tools

aapt、dx

~/Library/Android/sdk/build-tools/26.0.2

android.jar

~/Library/Android/sdk/platforms/android-26/android.jar

sdklib-26.0.0-dev.jar

~/Library/Android/sdk/tools/lib/sdklib-26.0.0-dev.jar

这里只添加了adb、aapt、dx到环境变量中,jar包直接使用全路径调用。环境变量进入控制台如下配置:

//1.打开变量文件

cd ~

vim ~/.bash_profile

//2.增加如下变量

export PATH=${PATH}:~/Library/Android/sdk/platform-tools adb

export PATH=${PATH}:~/Library/Android/sdk/build-tools/26.0.2

//使用:wq!保存退出

//3.刷新变量文件

source .bash_profile

//4.重启控制台生效

创建项目

这里创建一个小型测试项目,用于生成apk。文件目录如下:

test-app

-- AndroidManifest.xml

-- gen

-- out

-- res

---- layout

------ activity_main.xml

---- mipmap-xxhdpi

------ ic_launcher.png

---- values

------ strings.xml

-- src

---- java

------ MainActivity.java

这里创建的文件目录完全是自定义的,你可以根据需要创建符合自己需求的目录结构。我这里的目录主要有如下用途:

目录

用途

gen

存放后续生成的R.java文件

out

存放后续生成的class、dex、apk文件

res

存放项目资源文件

src

存放代码文件

这里AndroidManifest.xml代码如下:

package="com.dixon.test">

android:allowBackup="true"

android:icon="@mipmap/ic_launcher"

android:label="@string/app_name"

android:supportsRtl="true">

MainActivity.java代码如下:

package com.dixon.test;

import android.app.Activity;

import android.os.Bundle;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

}

}

activity_main.xml代码如下:

xmlns:app="http://schemas.android.com/apk/res-auto"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.dixon.test.MainActivity">

android:gravity="center"

android:text="Hello My App"

android:background="#FFFFFF"

android:layout_width="match_parent"

android:layout_height="match_parent" />

可以看出这只是一个单页面的简单项目,需要注意包名为com.dixon.test。

命令行编译

为了方便操作,这里cd到项目根目录下。

生成R.java文件

1

aapt package -f -m -M AndroidManifest.xml -I ~/Library/Android/sdk/platforms/android-26/android.jar -S res/ -J gen/

aapt各参数意义如下:

参数

意义

-f

如果编译出来的文件已经存在,强制覆盖。

-m

使生成的包的目录放在-J参数指定的目录。

-J

指定生成的R.java的输出目录

-S

res文件夹路径

-A

assert文件夹的路径

-M

AndroidManifest.xml的路径

-I

某个版本平台的android.jar的路径

-F

具体指定apk文件的输出

此时项目gen目录下会出现以下几级目录:

gen/com/dixon/test/R.java

正好对应包名+文件,其中R.java代码如下:

package com.dixon.test;

public final class R {

public static final class attr {

}

public static final class layout {

public static final int activity_main=0x7f030000;

}

public static final class mipmap {

public static final int ic_launcher=0x7f020000;

}

public static final class string {

public static final int app_name=0x7f040000;

}

}

生成class文件

这段命令会将java代码(包括R.java)编译为class文件输出到out目录下。

2

javac -encoding GBK -bootclasspath ~/Library/Android/sdk/platforms/android-26/android.jar -d out/ gen/com/dixon/test/*.java src/java/*.java

命令执行完毕后,可以看到如下新生成目录:

out/com/dixon/test/xxx.class

生成dex文件

这段命令会将class文件转为dex文件。

需要注意的是:这里class目录只会识别包括包名在内的全文件路径。即--output的第二个参数不能为out/com/dixon/test,而应该是out/,否则会报路径错误。

3

dx --dex --output=out/classes.dex out/

打包资源文件

4

aapt package -f -M AndroidManifest.xml -S res/ -I ~/Library/Android/sdk/platforms/android-26/android.jar -F out/Test.ap_

生成apk

下面命令将生成apk文件,并将资源文件、dex文件加入到apk中。

5

java -cp ~/Library/Android/sdk/tools/lib/sdklib-26.0.0-dev.jar com.android.sdklib.build.ApkBuilderMain out/Test.apk -v -u -z out/Test.ap_ -f out/classes.dex

过去可以使用apkbuilder生成apk,目前apkbuidler已经废弃并且不能再用了。

这里使用如上方式生成apk,命令行仍会提示过期,但是实测可用(2018.11.25)。

如果有哪位大神知道不过期的apk生成命令,欢迎留言!

签名

这里为方便,直接使用Android Studio自带的debug签名文件进行签名。

6

jarsigner -verbose -keystore ~/.android/debug.keystore -storepass android -keypass android out/Test.apk androiddebugkey

安装

经过上述步骤,就可以安装out/目录下生成的apk文件了。

adb install ~/Dixon-Project/test-app/out/Test.apk

可以看到这个apk文件只有12k不到。

截图.png

总结

本文只是很粗浅的利用命令行生成一个简单的apk,旨在初探apk的原理。

上述流程虽然走通了,但是在后续扩展的探索中,遇到了目前无法解决的问题:

我最初的AndroidManifest.xml是从一个项目中拷贝出来的,它设置了主题为AppTheme,其中AppTheme继承自Theme.AppCompat.Light.DarkActionBar,它来自support-v7包。

于是问题来了,我在第一步生成R.java的时候,控制台编译不通过并做如下提示:

res/values/styles.xml:4: error: Error retrieving parent for item: No resource found that matches the given name 'Theme.AppCompat.Light.DarkActionBar'.

res/values/styles.xml:8: error: Error: No resource found that matches the given name: attr 'colorAccent'.

res/values/styles.xml:6: error: Error: No resource found that matches the given name: attr 'colorPrimary'.

res/values/styles.xml:7: error: Error: No resource found that matches the given name: attr 'colorPrimaryDark'.

生成R.java作为第一步,找不到资源很正常,因为此时还没有引入support-v7包。于是我意识到生成R.java的命令行一定有引入jar包的参数。但是经过多方查询,目前只找到一个类似的命令:

aapt package -m -J gen/ -M AndroidManifest.xml -S res/ -I ~/Library/Android/sdk/platforms/android-26/android.jar -I ~/Dixon-Project/test-app/lib/appcompat-v7-27.1.1-sources.jar

这个命令亲测无效。

如果有哪位大神知道解决方案麻烦告知,不胜感激!

命令行进入android设置,命令行编译生成APK相关推荐

  1. android 启动linux命令行模式,Android用命令行启动应用

    Android是基于Linux内核的操作系统,用Java写的应用程序被Android运行时虚拟机运行. 因为Android是基于Linux的,而Linux执行ELF格式的可执行文件,所以用C++编写的 ...

  2. Linux怎么给命令创建别名,linux设置命令别名

    腾讯云活动汇聚了最新的促销打折.优惠折扣等信息,你在这里可以找到云服务器.域名.数据库.小程序等等多种不同产品的促销活动,还有各种产品的免费试用哦. 我们可以使用 alias 命令定义或显示 bash ...

  3. 【转】eclipse android 设置及修改生成apk的签名文件 -- custom debug keystore

    原文网址:http://hold-on.iteye.com/blog/2064642 android eclipse 设置及修改生成apk的签名文件 1. 问题: 平时在使用eclipse进行andr ...

  4. android+设置字体行高,android textview设置字体的行距和字间距

    android textview设置字体的行距和字间距 字间距 textView有一个属性android:textScaleX是调节字间距的,它的值是一个float型.查看源代码,默认textView ...

  5. android+设置字体行高,TextView设置行间距、行高,以及字间距

    一. 设置TextView行间距.行高: Android系统中TextView有默认行间距,但是比较窄有的时候需要我们设置每行行间距. TextView为我们提供了相关设置属性android:line ...

  6. android行高,android – GridView的行高

    如何使行高适合GridView中最高的项目? 因为默认情况下它是失败的. 更新: 这里是网格布局 android:layout_width="fill_parent" androi ...

  7. android adb命令唤醒屏幕,Android adb命令点亮屏幕说明

    前言         欢迎大家我分享和推荐好用的代码段~~声明         欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog ...

  8. android create命令,phonegap运行android – create命令失败,退出代码8 – linux

    我做了一些googleing但没有发现任何相关内容. 任何帮助赞赏.请务必使用裸体vm进行尝试 没有nodejs安装或依赖问题. 基督教 sudo apt-get install nodejs sud ...

  9. Linux 命令(232)—— bind 命令(builtin)

    文章目录 1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 1.命令简介 bind 命令用于显示和设置命令行的键盘序列绑定的功能. 通过 bind 可以了解哪些按键组合的功能,也可以自 ...

最新文章

  1. 就业丨速成班出来的AI人才,老板到底要不要?
  2. DevOps笔记-02:DevOps与微服务之间是什么关系?
  3. Android:学习笔记(一)
  4. 操作系统:第一章 计算机系统概述
  5. 东软 软件工程1 软件危机 软件工程 软件生命周期
  6. 神器 Nginx 的学习手册 ( 建议收藏 )
  7. 微课|中学生可以这样学Python(5.8.2节):使用切片修改列表
  8. 安卓3d游戏引擎_3D球闯关游戏-3D球闯关游戏安卓官方版预约 v1.2.5
  9. 听了那么多语音识别,你知道它的发展史吗?
  10. 二元logistic回归前的单因素分析
  11. [转]Excel插件开发基础知识
  12. WAFW00F、WebCrack
  13. 事件管理和问题管理,配置管理和变更管理的区别
  14. 树莓派和电脑之间串口通信
  15. 【高频内存与主板内存频率和CPU内存频率之间的关系】
  16. 仿微博视频边下边播之滑动 TableView 自动播放
  17. thunderbird 配置exchange邮箱
  18. 普通2d视频转3d视频
  19. 四年级计算机课教学安排,四年级计算机教学的计划
  20. STM32 CAN波特率计算

热门文章

  1. qualys java 误报_从拒绝到接受 解析漏洞管理的五个阶段
  2. 【机器学习】Weighted LSSVM原理与Python实现:LSSVM的稀疏化改进
  3. 卡饭里的云计算机,微云可以在电脑用吗
  4. 在java中转义符 n代表什么_在Java中,表示换行符的转义字符是()。 A.\nB.\fC.n D.\ddd...
  5. 模拟鱼群的matlab算法,IFSA人工鱼群算法
  6. Chrome 开发工具之 Memory
  7. jQuery EasyUI 数据网格
  8. 使用 SqlDataSource 控件查询数据47
  9. 谷歌浏览器修改CSS和js后同步保存到文件中 (译)
  10. 显示滚动条后,table 表头与内容不对齐,JS脚本控制