命令行进入android设置,命令行编译生成APK
本文将介绍如何在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相关推荐
- android 启动linux命令行模式,Android用命令行启动应用
Android是基于Linux内核的操作系统,用Java写的应用程序被Android运行时虚拟机运行. 因为Android是基于Linux的,而Linux执行ELF格式的可执行文件,所以用C++编写的 ...
- Linux怎么给命令创建别名,linux设置命令别名
腾讯云活动汇聚了最新的促销打折.优惠折扣等信息,你在这里可以找到云服务器.域名.数据库.小程序等等多种不同产品的促销活动,还有各种产品的免费试用哦. 我们可以使用 alias 命令定义或显示 bash ...
- 【转】eclipse android 设置及修改生成apk的签名文件 -- custom debug keystore
原文网址:http://hold-on.iteye.com/blog/2064642 android eclipse 设置及修改生成apk的签名文件 1. 问题: 平时在使用eclipse进行andr ...
- android+设置字体行高,android textview设置字体的行距和字间距
android textview设置字体的行距和字间距 字间距 textView有一个属性android:textScaleX是调节字间距的,它的值是一个float型.查看源代码,默认textView ...
- android+设置字体行高,TextView设置行间距、行高,以及字间距
一. 设置TextView行间距.行高: Android系统中TextView有默认行间距,但是比较窄有的时候需要我们设置每行行间距. TextView为我们提供了相关设置属性android:line ...
- android行高,android – GridView的行高
如何使行高适合GridView中最高的项目? 因为默认情况下它是失败的. 更新: 这里是网格布局 android:layout_width="fill_parent" androi ...
- android adb命令唤醒屏幕,Android adb命令点亮屏幕说明
前言 欢迎大家我分享和推荐好用的代码段~~声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net 雨季o莫忧离:http://blog ...
- android create命令,phonegap运行android – create命令失败,退出代码8 – linux
我做了一些googleing但没有发现任何相关内容. 任何帮助赞赏.请务必使用裸体vm进行尝试 没有nodejs安装或依赖问题. 基督教 sudo apt-get install nodejs sud ...
- Linux 命令(232)—— bind 命令(builtin)
文章目录 1.命令简介 2.命令格式 3.选项说明 4.常用示例 参考文献 1.命令简介 bind 命令用于显示和设置命令行的键盘序列绑定的功能. 通过 bind 可以了解哪些按键组合的功能,也可以自 ...
最新文章
- 就业丨速成班出来的AI人才,老板到底要不要?
- DevOps笔记-02:DevOps与微服务之间是什么关系?
- Android:学习笔记(一)
- 操作系统:第一章 计算机系统概述
- 东软 软件工程1 软件危机 软件工程 软件生命周期
- 神器 Nginx 的学习手册 ( 建议收藏 )
- 微课|中学生可以这样学Python(5.8.2节):使用切片修改列表
- 安卓3d游戏引擎_3D球闯关游戏-3D球闯关游戏安卓官方版预约 v1.2.5
- 听了那么多语音识别,你知道它的发展史吗?
- 二元logistic回归前的单因素分析
- [转]Excel插件开发基础知识
- WAFW00F、WebCrack
- 事件管理和问题管理,配置管理和变更管理的区别
- 树莓派和电脑之间串口通信
- 【高频内存与主板内存频率和CPU内存频率之间的关系】
- 仿微博视频边下边播之滑动 TableView 自动播放
- thunderbird 配置exchange邮箱
- 普通2d视频转3d视频
- 四年级计算机课教学安排,四年级计算机教学的计划
- STM32 CAN波特率计算
热门文章
- qualys java 误报_从拒绝到接受 解析漏洞管理的五个阶段
- 【机器学习】Weighted LSSVM原理与Python实现:LSSVM的稀疏化改进
- 卡饭里的云计算机,微云可以在电脑用吗
- 在java中转义符 n代表什么_在Java中,表示换行符的转义字符是()。 A.\nB.\fC.n D.\ddd...
- 模拟鱼群的matlab算法,IFSA人工鱼群算法
- Chrome 开发工具之 Memory
- jQuery EasyUI 数据网格
- 使用 SqlDataSource 控件查询数据47
- 谷歌浏览器修改CSS和js后同步保存到文件中 (译)
- 显示滚动条后,table 表头与内容不对齐,JS脚本控制