Ubuntu中使用纯命令行进行Android开发

安装JDK

sudo apt install openjdk-8-jdk

注意本文采用jdk1.8,因为后文设置的android版本太低。

安装Android命令行工具和SDK(不可用):

访问https://developer.android.google.cn/studio,拉到最底下,找到“仅限命令行工具”,选择Linux下载即可。

下载后,在Linux下新建文件夹,把这个压缩包弄进去,然后解压:

unzip commandlinetools-linux-11076708_latest.zip

接下来进入cmdlines-tools目录,新建一个latest目录,将解压后的所有文件移到该目录:

mkdir latest
mv * latest

注意mv会将除latest外所有文件移入latest,当移动latest时会报错,但此时已经完成了移动。

接下来进入latest下的bin目录,输入:

./sdkmanager --list

这将列出所有可安装的Android工具。

这里我们安装最新版的build-tools和platforms:

./sdkmanage "build-tools;35.0.0"
./sdkmanager "platforms;android-35"

走到这一步,就卡住了,来看Android文档是咋说的:Android Studio | Android Developers

创建和更新 Android 项目。(现已改用 Android Studio 完成。)

因此,在这里面,我们需要安装旧版的Android SDK,而非新版的命令行工具。

安装Android SDK

下载:

wget http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz

解压:

tar xzvf android-sdk_r24.4.1-linux.tgz

配置环境变量,打开~/.bashrc文件,在最后写入:

export ANDROID_HOME=<你的Android SDK路径>
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools

然后source一下:

source ~/.bashrc

还没完,这时候应该进入可以打开图形界面的系统(或X11转发),直接输入命令:

android

然后再在弹出的图形化界面中安装build-tools和platform-tools。这里Android已经给我们选好了,直接点“install”即可。

然后点击每一个父项目,点“Accept license”即可。

安装Gradle及Android插件

建议使用GitHub下载加速网站GitHub 文件加速直接访问下载:https://github.com/gradle/gradle-distributions/releases/download/v8.11.0/gradle-8.11-bin.zip。然后解压:

unzip gradle-8.11-bin.zip

然后设置GRADLE_HOME和PATH环境变量:

vim ~/.bashrc

在最后写入:

export GRADLE_HOME<你的Gradle路径>
export PATH=$PATH:$GRADLE_HOME/bin

然后保存,更新:

source ~/.bashrc

创建一个项目

切换到新的文件夹,然后输入命令:

android create project [选项]

其中,选项解释如下:

  • -n --name:项目名称。
  • -a --activity:创建的默认活动的名称。[必填]
  • -k --package:应用程序的Android包名称。[必填]
  • -v --gradle版本:gradle安卓插件版本。
  • -t-target:新项目的目标ID。通过android list targets查看。[必填]
  • -g --gradle:使用gradle模板。若指定-g,则必须指定参数-v,即gradle安卓插件版本。
  • -p --path:新项目的目录。[必填]

如:

android create project -n demo -a MainActivity -k com.woyou.demo -t 1 -p . -g -v 4.0.0

运行完后,文件目录如下:

.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── local.properties
└── src├── androidTest│   └── java│       └── com│           └── woyou│               └── demo│                   └── MainActivityTest.java└── main├── AndroidManifest.xml├── java│   └── com│       └── woyou│           └── demo│               └── MainActivity.java└── res├── drawable-hdpi│   └── ic_launcher.png├── drawable-ldpi│   └── ic_launcher.png├── drawable-mdpi│   └── ic_launcher.png├── drawable-xhdpi│   └── ic_launcher.png├── layout│   └── main.xml└── values└── strings.xml

打包

修改Android糟糕的Gradle配置

在打包之前,需要修改Android糟糕的Gradle配置,因此android命令早就不维护了:

打开gradle-wrapper,设置项目中gradle的版本和zip的网络地址:

#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
#distributionUrl=http\://services.gradle.org/distributions/gradle-1.12-all.zip
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-6.1.1-all.zip # 新增这一行

打开build.gradle,设置镜像仓库:

repositories {google()jcenter()maven { setUrl("https://maven.aliyun.com/repository/central") }maven { setUrl("https://maven.aliyun.com/repository/jcenter") }maven { setUrl("https://maven.aliyun.com/repository/google") }maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }maven { setUrl("https://maven.aliyun.com/repository/public") }maven { setUrl("https://jitpack.io") }maven { setUrl("https://maven.aliyun.com/nexus/content/groups/public/") }maven { setUrl("https://maven.aliyun.com/nexus/content/repositories/jcenter") }maven { setUrl("http://maven.aliyun.com/nexus/content/repositories/releases")}mavenCentral()gradlePluginPortal()}

然后将runProguard改成minifyEnabled:

minifyEnabled false
proguardFile getDefaultProguardFile('proguard-android.txt')

然后加上allprojects:

allprojects {repositories {google()jcenter()maven { setUrl("https://maven.aliyun.com/repository/central") }maven { setUrl("https://maven.aliyun.com/repository/jcenter") }maven { setUrl("https://maven.aliyun.com/repository/google") }maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }maven { setUrl("https://maven.aliyun.com/repository/public") }maven { setUrl("https://jitpack.io") }maven { setUrl("https://maven.aliyun.com/nexus/content/groups/public/") }maven { setUrl("https://maven.aliyun.com/nexus/content/repositories/jcenter") }maven { setUrl("http://maven.aliyun.com/nexus/content/repositories/releases")}mavenCentral()gradlePluginPortal()}
}

经过这些操作后,完整的build.gradle如下:

buildscript {repositories {google()jcenter()maven { setUrl("https://maven.aliyun.com/repository/central") }maven { setUrl("https://maven.aliyun.com/repository/jcenter") }maven { setUrl("https://maven.aliyun.com/repository/google") }maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }maven { setUrl("https://maven.aliyun.com/repository/public") }maven { setUrl("https://jitpack.io") }maven { setUrl("https://maven.aliyun.com/nexus/content/groups/public/") }maven { setUrl("https://maven.aliyun.com/nexus/content/repositories/jcenter") }maven { setUrl("http://maven.aliyun.com/nexus/content/repositories/releases")}mavenCentral()gradlePluginPortal()}dependencies {classpath 'com.android.tools.build:gradle:4.0.0'}
}
apply plugin: 'android'android {compileSdkVersion 'android-29'buildToolsVersion '29.0.3'buildTypes {release {minifyEnabled falseproguardFile getDefaultProguardFile('proguard-android.txt')}}
}allprojects {repositories {google()jcenter()maven { setUrl("https://maven.aliyun.com/repository/central") }maven { setUrl("https://maven.aliyun.com/repository/jcenter") }maven { setUrl("https://maven.aliyun.com/repository/google") }maven { setUrl("https://maven.aliyun.com/repository/gradle-plugin") }maven { setUrl("https://maven.aliyun.com/repository/public") }maven { setUrl("https://jitpack.io") }maven { setUrl("https://maven.aliyun.com/nexus/content/groups/public/") }maven { setUrl("https://maven.aliyun.com/nexus/content/repositories/jcenter") }maven { setUrl("http://maven.aliyun.com/nexus/content/repositories/releases")}mavenCentral()gradlePluginPortal()}
}

接下来输入命令:

./gradlew build

它将会输出两个apk文件,分别在build/outputs/apk/debug和build/outputs/apk/release内。debug版有Android的Debug签名,release则没有任何签名,因此无法安装,需要进行手动签名:

将apk拷出

cp build/outputs/apk/release/android_demo-release-unsigned.apk .

生成签名文件:

keytool -genkey -v -keystore <文件名(*.keystore)> -alias <别名> -keyalg RSA -validity <有效天数>

签名:

jarsigner -verbose -keystore <签名文件>  -signedjar <签名后的文件名> <未签名的文件名> <别名>

签名完毕,可正常安装。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/472484.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu+ROS 机械臂拾取和放置

官方链接&#xff1a;https://github.com/skumra/baxter-pnp 1.下载并安装 SDK 依赖项 sudo apt-get install python-wstool python-rosdep 2.创建新的 catkin 工作区 mkdir -p ~/ros_ws/src cd ~/ros_ws/src 3.使用 wstool 下载 rosinstall 文件并将其复制到 Catkin 工作区…

w~视觉~合集23

我自己的原文哦~ https://blog.51cto.com/whaosoft/12548542 #DragGAN 在 AIGC 的神奇世界里&#xff0c;我们可以在图像上通过「拖曳」的方式&#xff0c;改变并合成自己想要的图像。比如让一头狮子转头并张嘴&#xff1a; 实现这一效果的研究出自华人一作领衔的「Drag You…

从电动汽车到车载充电器:LM317LBDR2G 线性稳压器在汽车中的多场景应用

附上LM317系列选型&#xff1a; LM317BD2TG-TO-263 LM317BTG-TO-220 LM317BD2TR4G-TO-263 LM317D2TG-TO-263 LM317D2TR4G-TO-263 LM317TG-TO-220 LM317LBDR2G-SOP-8 LM317LDR2G-SOP-8 LM317MABDTG-TO-252 LM317MABDTRKG-TO-252 LM317MA…

【已解决】git push一直提示输入用户名及密码、fatal: Could not read from remote repository的问题

问题描述&#xff1a; 在实操中&#xff0c;git push代码到github上一直提示输入用户名及密码&#xff0c;并且跳出的输入框输入用户名和密码后&#xff0c;报错找不到远程仓库 实际解决中&#xff0c;发现我环境有两个问题解决&#xff1a; git push一直提示输入用户名及密码…

测试实项中的偶必现难测bug--互斥逻辑异常

问题: 今天线上出了一个很奇怪的问题,看现象和接口是因为数据问题导致app模块奔溃 初步排查数据恢复后还是出现了数据重复的问题,查看后台实际只有一条数据,但是显示在app却出现了两条一模一样的置顶数据 排查: 1、顺着这个逻辑,我们准备在预发复现这个场景,先是cop…

二五、pxe自动装机

pxe自动装机 pxe------------------------------自动安装系统必要的运行环境 无人值守--------------------为系统定制化的安装需要的软件 pxe的优点&#xff1a; 1、规模化&#xff1a;同时装配多台服务器&#xff08;20-30&#xff09; 2、自动化&#xff1a;系统安装和…

算法魅力-二分查找实战

目录 前言 算法定义 朴素二分模版 二分查找 二分的边界查找 在排序数组中查找元素的第一个和最后一个位置&#xff08;medium&#xff09; 暴力算法 二分查找 边界查找分析 山峰数组的峰顶 暴力枚举 二分查找 搜索旋转排序数组中的最小值&#xff08;medium&#xf…

# 第20章 Cortex-M4-触摸屏

第20章 Cortex-M4-触摸屏 20.1 触摸屏概述 20.1.1 常见的触摸屏分类 电阻式触摸屏、电容式触摸屏、红外式触摸屏、表面声波触摸屏 市场上用的最多的是电阻式触摸屏与电容式触摸屏。红外管式触摸屏多用于投影仪配套设备。 电阻式触摸屏构成&#xff1a;整个屏由均匀电阻构成…

大数据新视界 -- 大数据大厂之 Impala 性能优化:基于数据特征的存储格式选择(上)(19/30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Gitcode文件历史记录查看和还原

文件历史记录 文件历史记录用于记录代码文件的更改历史&#xff0c;它允许用户查看文件的不同版本&#xff0c;了解每个版本的修改内容、作者和提交消息。这对于跟踪文件演进、恢复错误更改、审查代码以及了解项目进展都非常有用。 文件历史记录功能提供了以下核心功能&#…

数据结构-二叉树及其遍历

🚀欢迎来到我的【数据结构】专栏🚀 🙋我是小蜗,一名在职牛马。🐒我的博客主页​​​​​​ ➡️ ➡️ 小蜗向前冲的主页🙏🙏欢迎大家的关注,你们的关注是我创作的最大动力🙏🙏🌍前言 本篇文章咱们聊聊数据结构中的树,准确的说因该是只说一说二叉树以及相…

Java集合(Collection+Map)

Java集合&#xff08;CollectionMap&#xff09; 为什么要使用集合&#xff1f;泛型 <>集合框架单列集合CollectionCollection遍历方式List&#xff1a;有序、可重复、有索引ArrayListLinkedListVector&#xff08;已经淘汰&#xff0c;不会再用&#xff09; Set&#xf…

Python学习------第八天

函数 函数的传入参数 掌握函数返回值的作用 掌握函数返回值的定义语法 函数的嵌套调用&#xff1a; 函数的局部变量和全局变量 局部变量的作用&#xff1a;在函数体内部&#xff0c;临时保存数据&#xff0c;即当函数调用完成后&#xff0c;则销毁局部变量。 money 5000000 n…

reduce-scatter:适合分布式计算;Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响

目录 Gather Scatter Reduce reduce-scatter:适合分布式计算 Reduce、LayerNorm和Broadcast算子的执行顺序对计算结果的影响,以及它们对资源消耗的影响 计算结果理论正确性 资源消耗方面 Gather 这个也很好理解,就是把多个进程的数据拼凑在一起。 Scatter 不同于Br…

C++- 基于多设计模式下的同步异步日志系统

第一个项目:13万字,带源代码和详细步骤 目录 第一个项目:13万字,带源代码和详细步骤 1. 项目介绍 2. 核心技术 3. 日志系统介绍 3.1 为什么需要⽇志系统 3.2 ⽇志系统技术实现 3.2.1 同步写⽇志 3.2.2 异步写⽇志 4.知识点和单词补充 4.1单词补充 4.2知识点补充…

Node.js GET/POST请求、WEB模块使用介绍 (基础介绍 八)

GET/POST请求 在很多场景中&#xff0c;我们的服务器都需要跟用户的浏览器打交道&#xff0c;如表单提交。 表单提交到服务器一般都使用 GET/POST 请求。 本章节我们将为大家介绍 Node.js GET/POST请求。 获取GET请求内容 由于GET请求直接被嵌入在路径中&#xff0c;URL是…

字节青训-小M的多任务下载器挑战、版本号比较

目录 一、小M的多任务下载器挑战 题目背景 题目内容 数据输入 数据输出 数据与约定 示例1 示例2 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 最终代码&#xff1a; 运行结果&#xff1a; 二、版本号比较 问题描述 样例 示例 1: 示例 2: 示例 3:…

jenkins用户在执行scp的时候如何做免密登录

一、背景 在jenkins job中执行scp的shell命令&#xff0c;当然不希望每次输入密码&#xff0c;另外处于出于安全考虑&#xff0c;也不建议在scp命令中指定。 所以&#xff0c;我们需要对远程机器进行免密登录。 本文遇到的问题是&#xff0c;在jenkins机器上执行scp已做到了…

Prometheus监控SQL SERVER常用指标和PromQL预警

SQL Server是企业级广泛应用的数据库&#xff0c;通过简单的Prometheus exportor可以很容易地监控它。与所有数据库一样&#xff0c;SQL Server也有许多故障点&#xff0c;例如事务延迟或数据库中连接过多。本文介绍如何使用Prometheus监视SQL Server&#xff0c;包括常用的监控…

HTML5实现俄罗斯方块小游戏

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面1.3 游戏结束界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/143788449 HTML5实现俄罗斯方块小游戏&#x…