通过命令行创建Android工程,并编译发布

编译ffmpeg并集成到安卓工程中 如果执行过程中,出现make notfound,表示系统没有安装make程序,执行apt install make即可解决。切换到root用户下,并执行./configure检查配置(非root用户会存在权限问题而无法编译项目)检查完毕后,编写脚本传参给 configure对项目进行。这里取名为android_build.sh。3.编写CMakeList.txt文件。解压后可以看到下面的目录结构。4.调用ffmpeg库的方法。三,集成静态库到安卓工程。1.新建安卓ndk工程。2.拷贝源文件到项目中。 阅读详情
       
 1、利用命令行创建一个新的工程:
       android create project --target 1 --name PROJECTNAME --path /PROJECT_PATH --package com.project --activity ActivityName

 2、将对应的信息拷贝到刚才创建的工程中,如拷贝图片资源到/res/drawable-hdpi目录中,因为我们需要创建的是资源包,即在其他应用程序中需要访问这个应用程序的资源目录,在Activity中可以通过调用getPackageManager().getResourcesForApplication方法来访问指定包名的资源目录,而要获得包名,只需获得对应的ActivityInfo即可,可以通过getPackageManager().queryIntentActivities来获得指定action的ActivityInfo,ok,咱们只需要如修改AndroidManifest.xml文件中的内容,制定action和category即可。

3、编译APK,第一步自动生成空的工程后,也会自动生成ant的编译脚本,即我们可以利用ant来编译Android工程,编译命令为:ant release -f PROJECT_PATH/build.xml

4、签名命令:jarsigner -verbose -keystore KEY_PATH/*.keystore -storepass password -signedjar APK_PATH/apkname.apk PROJECT_PATH/bin/projectname-release-unsigned.apk *.keystore,

5、代码实现:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;


import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;


import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;


public class CustomCreateApk {
private static String sApkName; //要创建的apk名称
private static String sResourceSourcePath; //存放您需要生成APK的资源路径
private static String sApkDesPath; //生成APK的目标路径
private static final String sKeyFilePath = "/home/keyfiledir/"; //签名路径
private static final String sApkProjectPath = "/home/temp/";//中间文件存放路径


public static void main(String[] args) throws IOException,
InterruptedException {
if (args.length != 3)
return;
sApkName = args[0];
sResourceSourcePath = args[1];
sApkDesPath = args[2];

/*
* 利用命令行创建一个新的工程:
       android create project --target 1 --name PROJECTNAME --path /PROJECT_PATH --package com.project --activity ActivityName
*/
File apkSource = new File(sApkProjectPath);
if (!apkSource.exists()) {
apkSource.mkdirs();
}


File dest = new File(sApkDesPath);
if (!dest.exists()) {
dest.mkdirs();
}


//封装命令行创建的字符串
StringBuilder sb = new StringBuilder();
sb.append("android create project --target 1 --name ");
sb.append(sApkName);
sb.append(" --path ");
sb.append(sApkProjectPath);
sb.append(sApkName);
sb.append(" --package com.");
sb.append(sApkName);
sb.append(" --activity ");
sb.append("MainActivity");


//创建shell脚本,该脚本用来创建一个空的工程,主ACTIVITY是SkinActivity 
File createpoj = new File(sApkProjectPath + "createProject.sh");
if (!createpoj.exists()) {
createpoj.createNewFile();
createpoj.setExecutable(true);
}


FileWriter fw = new FileWriter(createpoj);
fw.write(sb.toString());
fw.flush();
fw.close();


//执行该shell脚本
Process process = Runtime.getRuntime().exec(
       sApkProjectPath + "createProject.sh");
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
if (process.waitFor() != 0) {
process.destroy();
return;
} else {
process.destroy();
prepareResources(sApkName);
}


}


//准备资源信息
public static void prepareResources(String apkName) throws IOException {
   
   //prepare drawable-hdpi目录
File file = new File(sApkProjectPath + apkName + "/res/drawable-hdpi");
if (!file.exists()) {
file.mkdir();
}


//raw目录
file = new File(sApkProjectPath + apkName + "/res/raw");
if (!file.exists()) {
file.mkdir();
}

        file = new File(sResourceSourcePath);
        File[] files = file.listFiles();
        for (File f : files) {
            String name = f.getName();
            File des;
            //图片拷贝至drawable目录,其余文件拷贝到对应的目录即可
            if (name.endsWith("png")) {
                des = new File(sApkProjectPath + apkName + "/res/drawable-hdpi/"
                        + name);
                if (!des.exists()) {
                    des.createNewFile();
                    des.setExecutable(true);
                }
            } else {
                //以raw目录为例
                des = new File(sApkProjectPath + apkName + "/res/raw/" + name);
                if (!des.exists()) {
                    des.createNewFile();
                    des.setExecutable(true);
                }
            }


            FileOutputStream fos = new FileOutputStream(des);
            FileInputStream fis = new FileInputStream(f);
            byte[] bytes = new byte[1024];
            int len = 0;
            while ((len = fis.read(bytes)) > 0) {
                fos.write(bytes, 0, len);
            }
            fos.flush();
            fis.close();
            fos.close();
        }
        try {
            //在此处修改AndroidManifest.xml文件,也可以修改其他资源文件,比如strings.xml
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            file = new File(sApkProjectPath + apkName + "/AndroidManifest.xml");
            Document doc = builder.parse(file);
            Element element = (Element) doc.getElementsByTagName("action").item(0);
            //设置action name
            element.setAttribute("android:name", "com.action.name");
            //设置category name
            element = (Element) doc.getElementsByTagName("category").item(0);
            element.setAttribute("android:name", "android.intent.category.DEFAULT");
            //还可以设置其他信息,if you want
            element = (Element) doc.getElementsByTagName("application").item(0);
            element.setAttribute("android:icon", "@drawable/star_h");
            
            TransformerFactory tfFac = TransformerFactory.newInstance();
            Transformer tf = tfFac.newTransformer();
            tf = tfFac.newTransformer();
            StreamResult result = new StreamResult(file);
            DOMSource source = new DOMSource(doc);
            result = new StreamResult(file);
            source = new DOMSource(doc);
            tf.transform(source, result);
            
            //ok, 资源准备好,开始编译
            buildapk(apkName);
        
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (TransformerException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
}


public static void buildapk(String apkName) throws IOException,
InterruptedException {
   //创建编译脚本
StringBuilder sb = new StringBuilder();
sb.append("ant release -f " + sApkProjectPath + apkName + "/build.xml");

File ant = new File(sApkProjectPath + "build.sh");
ant.setExecutable(true);

FileWriter fw = new FileWriter(ant);
fw.write(sb.toString());
fw.flush();
fw.close();
Process process = Runtime.getRuntime().exec(
sApkProjectPath + "build.sh");
BufferedReader br = new BufferedReader(new InputStreamReader(
process.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
if (process.waitFor() != 0) {
process.destroy();
return;
} else {
process.destroy();
sigin(apkName);
}
}


//签名
public static void sigin(String apkName) throws IOException,
InterruptedException {
StringBuilder sb = new StringBuilder();
sb.append("jarsigner -verbose -keystore ");
sb.append(sKeyFilePath);
sb.append("sign.keystore ");
sb.append("-storepass bohaojingling -signedjar ");
sb.append(sApkDesPath);
sb.append("/");
sb.append(apkName + ".apk ");
sb.append(sApkProjectPath + apkName + "/bin/" + apkName
+ "-release-unsigned.apk sign.keystore");
File f = new File(sApkProjectPath + "jarsigner.sh");
f.setExecutable(true);

FileWriter fw = new FileWriter(f);
fw.write(sb.toString());
fw.flush();
fw.close();
Process p3 = Runtime.getRuntime().exec(sApkProjectPath + "jarsigner.sh");
BufferedReader br = new BufferedReader(new InputStreamReader(
p3.getInputStream()));
String line = null;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
if (p3.waitFor() != 0) {
p3.destroy();
} else {
p3.destroy();
}
}
}

学会使用Android SDK中的工具创建工程并运行APP 实验目的:学会使用Android SDK中的工具创建工程并运行APP 实验题目:使用SDK中的Android命令创建工程(注意,不用Android Studio),然后编译此工程,生成apk文件app1.apk,使用Android命令创建AVD,名为software_avd,最后使用adb命令将此apk文件运行到模拟器上。 实验步骤:(可以有代码和截图) 首先,配置环境变量 打印出我们所有的Android SDK中下载好的可用Android platforms,找想要创建项目的目标platform,记录该 阅读详情

相关推荐

下载编译 Qt 5 for Android 并新建工程

步骤详见: http://wiki.qt.io/Android 步骤1-4略 5.安装jdk1.6.0.45: http://blog.youkuaiyun.com/zjclugger/article/details/11762085 6.配置QT for Android,忽略不支持的模块: (配置的参数位于QT源码根目录qt-everywhere-opensource-src-5.5.0/qtbas

2184

命令行开发、编译、打包Android应用程序

Android SDK提供了一系列命令行工具,用来进行Android应用的开发、调试、打包等工作!Eclipse能够进行Android应用开发的相关工作,也是调用了这些工具而已. 只有掌握了命令下的工作方式,工作起来才会更加的得心应手.下面就抛开Eclipse集成开发工具,徒手走一遍Android开发、编译、打包的流程! 注:本文只作参考之用,因为LBSDemo工程中有本人自己加入的代码,有第...

weixin_30809173的博客 379

用源码编译虚幻引擎,并打包到安卓平台

本文详细介绍了如何用源码编译虚幻引擎,并将其打包到安卓平台。

m0_73727069的博客 1999

使用手动命令创建一个Android项目

android命令包含一个子命令:create project 命令,用该命令key

一个多年测试人的经验记录和分享 2207

Unity中实现导出安卓工程并发布APK

——将项目切换为安卓平台 ——勾选上Export Project ——导出工程到指定文件夹下(只能导出到文件夹里) ——使用Andorid Studio打开项目,点击构建APK(根据项目是否有签名选择不同的打包选项),等待打包成功即可。 ...

L的博客 3534

Oracle数据库安装及配置(Oracle19c)

Windows 10安装Oracle 19c教程

weixin_69200200的博客 2万+

Gradle 教程说明 用户指南 第11章 使用 Gradle 命令行

11.1 执行多个任务 每个任务都只执行一次,不管它如何被包含在build:无论是在命令行中指定,或作为一个依赖的另一个任务,或两者兼而有之。 以下四个任务的定义。dist和测试都依赖于 编译任务。运行gradle dist测试这个构建脚本,编译任务将被执行一次。 build.gradle task compile     println 'compiling source'

打渔还是晒网 —— stone 4万+

发那科机器人弧焊指令实战:从Search指令到组掩码设置的完整避坑指南

本文详细解析了发那科机器人弧焊指令系统的实战应用,从Search指令的正确使用到组掩码设置的避坑技巧。通过实际案例和参数优化建议,帮助工程师提升焊接质量和生产效率,避免常见错误操作。特别针对T2模式示教难题和外部轴协调运动提供了专业解决方案。

weixin_29040367的博客 185

使用命令行创建Android项目

要创建一个新的Android工程,打开命令行,导航到Android SDK安装目录下的tools/目录下,运行:     android create project --target 8 --name MyAndroidApp --path E:\workspace\MyAndroidAppProject --activity MyAndroidAppActivity --package

Hoker66的博客 677

STM32Cubemx-H7-17-麦克纳姆轮驱动

我们先看.h,知道哪些函数会有哪些功能和宏定义参数首先 是在.h的宏定义处定义引脚编号,比如tb6612控制方向的引脚,以及设定了哪个定时器作为pwm输出,还有编码计次的中断引脚/* 硬件相关宏定义 *//*1 前进方向往上 42 3*/// TB6612 方向引脚定义/* 定时器相关宏定义 *//* 编码器相关宏定义 */把自己的引脚根据原理图填对应,方向引脚也是,如果发现反转就把对应的引脚定义反过来,编码也是,编码我们用一个引脚就好,都在cubemx配置好。

m0_74211379的博客 1423

Windows 10/11 下用 Docker 一键部署 CVAT 标注工具(附 WSL2 配置指南)

本文详细指导如何在Windows 10/11系统上,通过配置WSL2和Docker Desktop,实现CVAT标注工具的一键部署。内容涵盖从环境准备、Docker安装、CVAT服务启动到性能优化与安全配置的全流程,为计算机视觉开发者提供稳定高效的本地标注平台解决方案。

weixin_28839601的博客 464

2.Android Studio创建安卓项目及项目结构

-----------android培训、java培训、java学习型技术博客、期待与您交流!------------ 上一篇Android Studio搭建完成了,接下来我们就用Android Studio创建我们的安卓项目吧! 一、使用Android Studio 图形用户界面创建安卓工程 1.使用Android Studio创建Android项目,启动Android Studio,

极客星云-优快云博客 8236

CNN经典网络模型(二):AlexNet简介及代码实现(PyTorch超详细注释版)

CNN经典网络模型之一:AlexNet,本文包含其简介及代码,在PyTorch中实现,进行超详细注释,适合新生小白阅读学习~

qq_43307074的博客 2万+

egret发布android包

发布遇到怪事 1.用egret wing 创建游戏并编译。 根目录与“template/web”下的index.html中入口都改成自己写的程序MainBezier data-entry-class="MainBezier" 2.编译通过 3.点击wing 的发布按钮,调出发布选择平台选择界面 4.选择android平添,输入游戏名称与报名,点击确认发布 5.发布后在原工程t...

wulong710的专栏 2617

实战|2026美团&大众点评餐饮数据抓取:Playwright/Selenium反爬全攻略

核心结论:2026年美团&大众点评的反爬核心是“多维度风控”,需组合使用“住宅IP+设备指纹伪装+真人行为模拟+动态验证处理”,Playwright是最优工具,Selenium仅作为补充。效率优化:单机爬取速度建议控制在“每小时500-800条”,避免高频请求触发风控;分布式爬取需确保每个节点使用独立住宅IP,且行为轨迹不一致。扩展方向集成WASM解密工具,破解2026年美团的Token加密;用AI识别动态点选验证,提升验证通过率;对接大数据平台,对抓取的餐饮数据进行可视化分析。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2464

YOLO格式数据集划分

YOLO格式的数据集划分 标题标签格式txt import os import cv2 import random from PIL import Image # os.makedirs('labels_train') # os.makedirs('labels_val') img_train_path ='./img_train/' #图片训练集保存路径 img_val_path = './img_val/' #图片验证集保存路径 labels_train_path = './labels_t

weixin_51154380的博客 3308

cocos2dx创建工程并在androidstudio平台编译

cocos2dx创建工程并用androidstudio打开

王者无双 3444

RK3568 Android14 调试 RTL8211F 千兆以太网 (RGMII)

调试 RTL8211F 的核心在于:确认地址(看电阻贴片情况)和 搞定延时(配置 rgmii-id 或微调 delay 值)。一旦这两点对上了,RK3568 的千兆网络就能稳定运行。希望这篇结合原理图的实战记录能帮到你!

qq_33427070的博客 1649

Android Studio创建安卓项目工程

Android Studio创建安卓项目工程 前言 因为想抽出时间复习考研因此提前接触安卓的一些开发,在实训的时候就可以不用再听讲学习,节省时间 随着前端混合开发和小程序技术的兴起,安卓开发的需求在日益减少。更多的学习是出于兴趣的缘故吧。 创建空工程 打开之前安装好的Android Studio 创建一个空的工程 选择一个合适的文件夹。路径中不能出现中文的符号 填写完信息之后等待项目创建完成 项目结构观察 整个项目的结构和idea创建的springboot项目类似。 使用gradle和

xiaoxu的博客 3593

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

android studio如何编译运行,Android Studio 在命令行编译工程

在Android sdk 目录下的samples/android-21/ 文件夹下,任找一个工程,如果在命令行直接编译可能会报这种错误:gradle buile.gradleFAILURE: Build failed with an exception.* What went wrong:Task 'build.gradle' not found in root project 'Borderl...

weixin_34743057的博客 2303

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android Studio 在命令行编译工程

在Androidsdk 目录下的samples/android-21/ 文件夹下,任找一个工程,如果在命令行直接编译 可能会报这种错误: 1 gradle buile.gradle 1 2 3 4 5 6 7 8 9 10 11 12 13 ...

Welcome 1773

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android工程的自动创建,编译并生成apk

参考文档(android官方) http://developer.android.com/tools/projects/projects-cmdline.html#ReferencingLibraryProject http://developer.android.com/tools/building/building-cmdline.html#AutoReleaseMode

oneRain88的专栏 6645

IDEA创建Android项目并反编译APK

IDEA创建Android项目并连接木木模拟器创建安卓项目项目结构app/src/main/res/layout/activity_my.xmlapp/src/main/java/example/com/androiddemo/MainActivity.javaapp/src/main/AndroidManifest.xmlapp/build.gradle连接木木模拟器 一开始我是准备使用Andr...

李玺 8532

命令行下创建 Android 工程,用 Ant 进行编译部署

安装完 Android SDK 后可以在命令行下 Android.bat 命令创建一个示例项目,有 Ant 的话还可直接用 Ant 来编译部署到模拟器上运行。 环境准备: 告诉 path 要指向到 Android SDK 目录的 tools 子目录中,如 d:\android-sdk-windows\tools 要用 ant 编译部署的话,再把 ant 的 bin 目录加入到 pat...

lw585625的博客 246

Cocos2d-x 创建Android工程和编译+导入到Eclipse编译

根据前两篇文章,我们大概搭建完成了开发环境,现在来创建Android工程和编译:   1、cygwin编译 进入cocos2d-x,用编辑器打开create-android-project.bat,修改三个路径: @echo off :: This script is used to create an android project. :: You should modify _AN

wxc237786026的专栏 3147
上一篇: 移植UDT到android
下一篇: google protocol buffer的使用
jiang_lostcode
博客等级 码龄18年 45粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值