精华内容
下载资源
问答
  • android打包

    2021-06-06 17:03:14
    时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情,“时光不倒带,岁月不重来”-致自己 ​​​​多种渠道打包方式由于国内存在众多的android市场:产品在...

    66b52468c121889b900d4956032f1009.png

    8种机械键盘轴体对比

    本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?

    时间飞快流逝,年纪不断增长,人总要找点事情做,让自己忙起来,忙起来才知道生活不易,才明白平时的忧伤都是矫情,“时光不倒带,岁月不重来”-致自己 ​​​​

    多种渠道打包方式

    由于国内存在众多的android市场:产品在不同的渠道可能有不同的统计需求,为此android开发人员需要为每个应用市场发布一个安装包,这就涉及到了android的多渠道打包

    学习下美团客户端打包经验,主要是利用在META-INF目录内添加空文件的方式,实现批量快速打包Android应用.

    1>实现原理

    Android应用安装包apk文件其实是一个压缩文件,可以将后缀修改为zip直接解压,解压安装文件后会发现在根目录有一个META-INF目录,如果在META-INF目录内添加空文件,可以不用重新签名应用.

    因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道.“采用这种方式,每打一个渠道包只需复制一个apk,在META-INF中添加一个使用渠道号命名的空文件即可.这种打包方式速度非常快.百十多个渠道不到一分钟就能打完.

    2>实现步骤

    编写渠道号文件”channel.txt”文件内容如下:1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16H5_Home

    XIAOMI

    HUAWEI

    MEIZU

    OPPO

    VIVO

    SAMSUNG

    LENOVO

    SMARTISAN

    TXYYB

    m360

    BAIDU

    ANZHI

    ALI

    SOUGOU

    pgyer

    3>编写python脚本,实现解压缩apk文件,为META-INF目录添加文件,重新压缩apk文件等逻辑:1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71# coding=utf-8

    import zipfile

    import shutil

    import os

    def delete_file_folder(src):

    '''delete files and folders'''

    if os.path.isfile(src):

    try:

    os.remove(src)

    except:

    pass

    elif os.path.isdir(src):

    for item in os.listdir(src):

    itemsrc=os.path.join(src,item)

    delete_file_folder(itemsrc)

    try:

    os.rmdir(src)

    except:

    pass

    # 创建一个空文件,此文件作为apk包中的空文件

    src_empty_file = 'info/empty.txt'

    f = open(src_empty_file,'w')

    f.close()

    # 在渠道号配置文件中,获取指定的渠道号

    channelFile = open('./info/channel.txt','r')

    channels = channelFile.readlines()

    channelFile.close()

    print('-'*20,'all channels','-'*20)

    print(channels)

    print('-'*50)

    # 获取当前目录下所有的apk文件

    src_apks = [];

    for file in os.listdir('.'):

    if os.path.isfile(file):

    extension = os.path.splitext(file)[1][1:]

    if extension in 'apk':

    src_apks.append(file)

    # 遍历所以的apk文件,向其压缩文件中添加渠道号文件

    for src_apk in src_apks:

    src_apk_file_name = os.path.basename(src_apk)

    print('current apk name:',src_apk_file_name)

    temp_list = os.path.splitext(src_apk_file_name)

    src_apk_name = temp_list[0]

    src_apk_extension = temp_list[1]

    apk_names = src_apk_name.split('-');

    output_dir = 'outputDir'+'/'

    if os.path.exists(output_dir):

    delete_file_folder(output_dir)

    if not os.path.exists(output_dir):

    os.mkdir(output_dir)

    # 遍历从文件中获得的所以渠道号,将其写入APK包中

    for line in channels:

    target_channel = line.strip()

    target_apk = output_dir + apk_names[0] + "-" + target_channel+"-"+apk_names[2] + src_apk_extension

    shutil.copy(src_apk, target_apk)

    zipped = zipfile.ZipFile(target_apk, 'a', zipfile.ZIP_DEFLATED)

    empty_channel_file = "META-INF/uuchannel_{channel}".format(channel = target_channel)

    zipped.write(src_empty_file, empty_channel_file)

    zipped.close()

    print('-'*50)

    print('repackaging is over ,total package: ',len(channels))

    input('npackage over...')

    4>打包一个正常的apk包

    使用AndroidStudio 打一个签名的apk文件、要往这个apk写入渠道号、我们可以动态获取写入的渠道,在设置到友盟或者Bugly1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17// 友盟

    private void initUMSDK() {

    String channel = AppChannelUtil.getChannel(this);

    UMConfigure.init(this, "APP_ID", channel, UMConfigure.DEVICE_TYPE_PHONE, null);

    }

    // Bugly

    private void initBugly() {

    CrashReport.UserStrategy strategy = new CrashReport.UserStrategy(this);

    String channel = AppChannelUtil.getChannel(this);

    strategy.setAppChannel(channel);

    String version = ApkUtil.getCurrentVersionName(this);

    strategy.setAppVersion(version);

    String packageName = ApkUtil.getPackageName(this);

    strategy.setAppPackageName(packageName);

    Bugly.init(this, "APP_ID", false, strategy);

    }

    5>android代码中获取渠道号

    渠道号工具类:解析压缩包,从中获取渠道号设置统计渠道的软件:友盟,Bugly1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    70

    71

    72

    73

    74

    75public class ChannelUtil {

    private static final String CHANNEL_KEY = "uuchannel";

    private static final String DEFAULT_CHANNEL = "internal";

    private static String mChannel;

    public static String getChannel(Context context) {

    return getChannel(context, DEFAULT_CHANNEL);

    }

    public static String getChannel(Context context, String defaultChannel) {

    if (!TextUtils.isEmpty(mChannel)) {

    return mChannel;

    }

    //从apk中获取

    mChannel = getChannelFromApk(context, CHANNEL_KEY);

    if (!TextUtils.isEmpty(mChannel)) {

    return mChannel;

    }

    //全部获取失败

    return defaultChannel;

    }

    /**

    * 从apk中获取版本信息

    *

    * @param context

    * @param channelKey

    * @return

    */

    private static String getChannelFromApk(Context context, String channelKey) {

    long startTime = System.currentTimeMillis();

    //从apk包中获取

    ApplicationInfo appinfo = context.getApplicationInfo();

    String sourceDir = appinfo.sourceDir;

    //默认放在meta-inf/里, 所以需要再拼接一下

    String key = "META-INF/" + channelKey;

    String ret = "";

    ZipFile zipfile = null;

    try {

    zipfile = new ZipFile(sourceDir);

    Enumeration entries = zipfile.entries();

    while (entries.hasMoreElements()) {

    ZipEntry entry = ((ZipEntry) entries.nextElement());

    String entryName = entry.getName();

    if (entryName.startsWith(key)) {

    ret = entryName;

    break;

    }

    }

    } catch (IOException e) {

    e.printStackTrace();

    } finally {

    if (zipfile != null) {

    try {

    zipfile.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    }

    }

    String channel = "";

    if (!TextUtils.isEmpty(ret)) {

    String[] split = ret.split("_");

    if (split != null && split.length >= 2) {

    channel = ret.substring(split[0].length() + 1);

    }

    System.out.println("-----------------------------");

    System.out.println("渠道号:" + channel + ",解压获取渠道号耗时:" + (System.currentTimeMillis() - startTime) + "ms");

    System.out.println("-----------------------------");

    } else {

    System.out.println("未解析到相应的渠道号,使用默认内部渠道号");

    channel = DEFAULT_CHANNEL;

    }

    return channel;

    }

    }

    5>执行python脚本,多渠道打包1

    2

    3

    4

    5

    6新建buildapk目录在此目录新建“info”目录,目录放channel.txt,empty.txt

    channel.txt:创建一个空文件,此文件作为apk包中的空文件

    empty.txt:在渠道号配置文件中,获取指定的渠道号

    buildapk 目录放入打一个签名的apk文件,和一个打包的python文件.

    6>命令1

    2

    3

    4

    5

    6

    7

    8

    9

    10安装python https://www.python.org/downloads

    查看版本 python3 --version

    进入buildapk目录

    执行权限设置:chmod u+x apk.py

    执行打包:python apk.py

    渠道名字列表可以添加修改:channel.txt

    展开全文
  • Android打包版本号设置

    2021-06-02 21:18:28
    之前没有设置过打包的命名,每次打包都是默认的"app-realease.apk",之后手动修改名字来显示出它是一个新版本。晚上学习了如何配置打包名称,很简单,修改build.gradle里的代码就行。详细记录如下:1、打开app这个...

    之前没有设置过打包的命名,每次打包都是默认的"app-realease.apk",之后手动修改名字来显示出它是一个新版本。

    晚上学习了如何配置打包名称,很简单,修改build.gradle里的代码就行。

    详细记录如下:

    1、打开app这个directory下的build.gradle

    2、定义打包时间:

    //时间

    def releaseTime() {

    return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))

    }

    3、自定义发布时的版本号(return的返回值可自行修改,例如1.0、2.0):

    //版本号

    def getVersionName(){

    return "2.0"

    }

    4、自定义打包名称(代码中的XYZ可修改为app名字):

    //名称

    applicationVariants.all { variant ->

    variant.outputs.each { output ->

    def outputFile = output.outputFile

    def fileName

    if (outputFile != null && outputFile.name.endsWith('.apk')) {

    if (variant.buildType.name.equals('release')) {

    variant.mergedFlavor.versionName = getVersionName()

    fileName = "XYZ_${variant.mergedFlavor.versionName}_release.apk"

    } else if (variant.buildType.name.equals('debug')) {

    variant.mergedFlavor.versionName = getVersionName()+"."+releaseTime()

    fileName = "XYZ_${variant.mergedFlavor.versionName}_debug.apk"

    }

    output.outputFile = new File(outputFile.parent, fileName)

    }

    }

    }

    5、build.gradle的完整代码:

    apply plugin: 'com.android.application'

    //定义时间

    def releaseTime() {

    return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))

    }

    //设置发布时的版本号

    def getVersionName(){

    return "2.0"

    }

    android {

    compileSdkVersion 26

    buildToolsVersion "26.0.0"

    defaultConfig {

    applicationId "***"

    minSdkVersion 14

    targetSdkVersion 23

    versionCode 1

    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {

    release {

    buildConfigField("boolean","API_DEBUG","false")

    minifyEnabled false

    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }

    debug {

    buildConfigField("boolean","API_DEBUG","true")

    minifyEnabled false

    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }

    }

    //配置打包名称

    applicationVariants.all { variant ->

    variant.outputs.each { output ->

    def outputFile = output.outputFile

    def fileName

    if (outputFile != null && outputFile.name.endsWith('.apk')) {

    if (variant.buildType.name.equals('release')) {

    variant.mergedFlavor.versionName = getVersionName()

    fileName = "XYZ_${variant.mergedFlavor.versionName}_release.apk"

    } else if (variant.buildType.name.equals('debug')) {

    variant.mergedFlavor.versionName = getVersionName()+"."+releaseTime()

    fileName = "XYZ_${variant.mergedFlavor.versionName}_debug.apk"

    }

    output.outputFile = new File(outputFile.parent, fileName)

    }

    }

    }

    }

    dependencies {

    compile fileTree(dir: 'libs', include: ['*.jar'])

    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

    exclude group: 'com.android.support', module: 'support-annotations'

    })

    }

    Android打包 & Gradle用法

    Ref: Maven仓库上查插件最新版本号The Central Repository Search Enginehttp://search.maven.org/#search%7Cga%7C1%7C ...

    Android打包的那些事

    使用gradle打包apk已经成为当前主流趋势,我也在这个过程中经历了各种需求,并不断结合gradle新的支持,一一改进.在此,把这些相关的东西记录,做一总结. 1. 替换AndroidManifes ...

    unity3d在菜单栏,一键设置Player setting及自动打包并设置apk的存储位置

    项目进行中,领导要求能够进行一键设置Player settings及自动打包并设置apk的位置,所以自己就上网搜索了很多大神的文章.最后是完成了领导需要的功能,在这里记录并分享一下(此项指针对安卓ap ...

    ionic3应用的Android打包签名发布步骤

    版权声明:本文为博主原创文章,未经博主允许不得转载. 当我们的ionic应用开发结束之后,就要开始上线到应用市场,那么Android的发布步骤具体是怎么样的呢? 1)编译 运行命令行: ionic c ...

    RN在Android打包发布App

    参考资料:http://www.jianshu.com/p/b8811669bcb6 RN在Android打包发布App 1-:生成一个签名密钥你可以用keytool命令生成一个私有密钥.在Windo ...

    [原]Android打包之Eclipse打多渠道包

    Android自动打包流程详细图: 步骤一和步骤二参考:[原]Android打包之Eclipse打包 步骤三:编写build.xml <?xml version="1.0" ...

    &lbrack;转&plus;补&rsqb;Android打包so后魅族5中安装运行崩溃问题的解决方法

    上周在做噪音检测so集成中,遇到不同的so库打包到 APK 时,安装在某些机器上,出现 java.lang.UnsatisfiedLinkError 加载失败. 为此,深究了一下原理,和给出了解决方案 ...

    Android学习路线(十九)支持不同设备——支持不同&lpar;Android&rpar;平台版本号

    当最新的Android版本号为你的应用提供着非常棒的APIs时.你却要在很多其它的设备更新之前继续支持老的系统版本号.这篇课程怎样在继续支持低版本号的系统的情况下使用新版本号的高级API. Platf ...

    Android提示版本号更新操作流程

    Android提示版本号更新操作流程 2014年5月8日: andorid的app应用中都会有版本号更新的操作,今天空暇的时候就花了点心思弄了一下.主要技术方面用到了AsyncTask异步载入.htt ...

    随机推荐

    php 执行程序分析

    记录程序运行细节 记录程序运行时间 <?php $start = microtime(true); //index.php $end = microtime(true); $time = num ...

    HDU1402 A &ast; B Problem Plus(FFT)

    http://acm.hdu.edu.cn/showproblem.php?pid=1402 初学FFT. http://www.cnblogs.com/WABoss/p/FFT_Note.html ...

    JavaScript里面三个等号和两个等号有什么区别?

    1.对于string,number等基础类型,==和===是有区别的 a)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等 b)同类型比较,直接进 ...

    java web 学习三(Tomcat 服务器学习和使用2)

    一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

    hdoj 4183 Pahom on Water

    Pahom on Water Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

    CSS常见问题及兼容性

    CSS常见问题 1 (IE6,7)H5标签兼容 解决方法1:(只显示核心代码) 1

    iOS 开发中中 textView 作为子控件点击输入文本,然后退出文本的方式

    方式1. 使用当双击输入的时候弹出键盘同时,使用手势和通知监听键盘的方法实现 代码如下: 1. 监听键盘通知 [[NSNotificationCenter defaultCenter] addObse ...

    Core Animation 文档翻译 (第四篇)

    Core Animation 文档翻译(第四篇) 让Layer的content动画起来 核心动画的基础接口以及为拥有Layer的View做的动画扩展接口,使得为Layer制作复杂动画变得简单化.例如改 ...

    js 解密

    需求:爬取https://www.xuexi.cn/f997e76a890b0e5a053c57b19f468436/018d244441062d8916dd472a4c6a0a0b.html页面中的 ...

    dos命令 创建数据库,建表,两表联查,三表联查(mysql---第一篇)

    首先打开mysql的控制台,输入密码进行登录  (ps:本文的mysql控制台,是运用的php的集成环境(phpstudy),点击运行,找到mysql命令行,直接打开就可以了) 登陆成功后,就可以进行 ...

    展开全文
  • Android打包流程

    2021-05-26 06:05:15
    一、Apk组成关闭Android Instant Run热部署功能,正常打包的情况下,生成的Apk包含以下文件和目录。Apk组成1,res目录,存放资源文件,所有文件映射在R类资源id常量中,在代码中通过id直接访问。2,lib目录,C++库,...

    一、Apk组成

    关闭Android Instant Run热部署功能,正常打包的情况下,生成的Apk包含以下文件和目录。

    4b8206262991

    Apk组成

    1,res目录,存放资源文件,所有文件映射在R类资源id常量中,在代码中通过id直接访问。

    2,lib目录,C++库,so文件,根据Cpu架构区分文件夹,如arm-v7,x86,mips,不同目标设备根据当前架构加载对应目录下so文件。

    3,classes.dex文件,由class字节码文件通过dx工具转化,Dalvik虚拟机识别的执行文件。

    4,assets目录,存放任何文件或文件夹,一般存放WebView相关资源。

    和res目录的区别:不会在R类中映射资源id,在代码中通过AssetManager类访问,其他资源,包括raw资源,都会生成资源id。

    5,AndroidMainfest文件,应用配置,向Android系统注册该应用信息,四大组件,权限声明。

    6,resources.arsc文件,记录资源文件和资源id的映射关系,在代码中通过R类的资源id查找资源,运行时,需要根据id找到资源的路径。

    7,META-INF目录,签名和校验,验证Apk文件完整性,打包时,会计算内部所有文件摘要签名,保存在该目录下,安装时,根据该目录的相关文件校验完整性,确保Apk每个文件不被篡改,是官方正版Apk。

    二、打包流程

    Apk如何出来的?

    aapt(Android Asset Packaging Tool),资源打包工具,编译res目录下的资源文件,生成R文件,resources.arsc和res目录,R文件。

    4b8206262991

    屏幕快照 .png

    res目录是资源文件,比如layout,anim,drawable,menu,raw,xml目录下的文件,在R文件是静态内部类的静态变量,每个文件对应一个id。

    4b8206262991

    屏幕快照 .png

    value目录下的文件,比如attrs,colors,dimens,styles,strings文件,每个文件对应一个静态内部类,文件内的资源item是静态变量,每个项对应一个id。

    4b8206262991

    屏幕快照 .png

    资源id是4字节无符号,resources.arsc文件记录应用程序资源目录信息,包括每一个资源名称、类型、值、id以及所配置的维度信息,资源索引表,key是资源id。

    4b8206262991

    屏幕快照 .png

    res目录将文本格式的xml转换成二进制xml,文本编辑器打开是乱码的。

    4b8206262991

    屏幕快照 .png

    用As的Apk查看工具可以看到里面内容。二进制xml实现了字符串替换,将一些在资源使用id表示,解析更快,占用空间更小。

    aidl,处理aidl文件,编译成java文件。

    compile,javac工具编译所有java文件,包括R文件,aidl生成的java文件,java源文件和第三方java文件,生成class文件。

    dex,通过dex命令,处理class文件,包括第三方class文件,生成Delvik虚拟机可执行的classes.dex文件,在分包情况下生成多个dex文件。对多个class文件合并,重组,优化,可以减小体积,缩短运行时间。

    apkbuilder,将resources.arsc,res目录,Androidmanifest文件,dex文件,一些第三方的so文件,assets目录,通过apkbuilder工具生成未签名Apk包。

    注意,raw资源和assets直接打包进入Apk,其他资源编译处理,raw被映射到R文件,assets不会映射,需要Assetmanager类访问,raw目录内部不能再有目录结构,assets可以有。

    jarsigner,对Apk进行签名,debug使用默认签名。

    zipalign,对未压缩的数据,如图片,按4字节边界进行对齐,对齐后可以向读内存一样对普通文件操作,加快资源访问速度。

    参考

    任重而道远

    展开全文
  • 之前没有设置过打包的命名,每次打包都是默认的"app-realease.apk",之后手动修改名字来显示出它是一个新版本。晚上学习了如何配置打包名称,很简单,修改build.gradle里的代码就行。详细记录如下:1、打开app这个...

    之前没有设置过打包的命名,每次打包都是默认的"app-realease.apk",之后手动修改名字来显示出它是一个新版本。

    晚上学习了如何配置打包名称,很简单,修改build.gradle里的代码就行。

    详细记录如下:

    1、打开app这个directory下的build.gradle

    2、定义打包时间:

    //时间

    def releaseTime() {

    return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))

    }

    3、自定义发布时的版本号(return的返回值可自行修改,例如1.0、2.0):

    //版本号

    def getVersionName(){

    return "2.0"

    }

    4、自定义打包名称(代码中的XYZ可修改为app名字):

    //名称

    applicationVariants.all { variant ->

    variant.outputs.each { output ->

    def outputFile = output.outputFile

    def fileName

    if (outputFile != null && outputFile.name.endsWith('.apk')) {

    if (variant.buildType.name.equals('release')) {

    variant.mergedFlavor.versionName = getVersionName()

    fileName = "XYZ_${variant.mergedFlavor.versionName}_release.apk"

    } else if (variant.buildType.name.equals('debug')) {

    variant.mergedFlavor.versionName = getVersionName()+"."+releaseTime()

    fileName = "XYZ_${variant.mergedFlavor.versionName}_debug.apk"

    }

    output.outputFile = new File(outputFile.parent, fileName)

    }

    }

    }

    5、build.gradle的完整代码:

    apply plugin: 'com.android.application'

    //定义时间

    def releaseTime() {

    return new Date().format("yyyyMMdd", TimeZone.getTimeZone("UTC"))

    }

    //设置发布时的版本号

    def getVersionName(){

    return "2.0"

    }

    android {

    compileSdkVersion 26

    buildToolsVersion "26.0.0"

    defaultConfig {

    applicationId "***"

    minSdkVersion 14

    targetSdkVersion 23

    versionCode 1

    testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

    }

    buildTypes {

    release {

    buildConfigField("boolean","API_DEBUG","false")

    minifyEnabled false

    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }

    debug {

    buildConfigField("boolean","API_DEBUG","true")

    minifyEnabled false

    proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

    }

    }

    //配置打包名称

    applicationVariants.all { variant ->

    variant.outputs.each { output ->

    def outputFile = output.outputFile

    def fileName

    if (outputFile != null && outputFile.name.endsWith('.apk')) {

    if (variant.buildType.name.equals('release')) {

    variant.mergedFlavor.versionName = getVersionName()

    fileName = "XYZ_${variant.mergedFlavor.versionName}_release.apk"

    } else if (variant.buildType.name.equals('debug')) {

    variant.mergedFlavor.versionName = getVersionName()+"."+releaseTime()

    fileName = "XYZ_${variant.mergedFlavor.versionName}_debug.apk"

    }

    output.outputFile = new File(outputFile.parent, fileName)

    }

    }

    }

    }

    dependencies {

    compile fileTree(dir: 'libs', include: ['*.jar'])

    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {

    exclude group: 'com.android.support', module: 'support-annotations'

    })

    }

    总结

    以上所述是小编给大家介绍的Android打包版本号设置方法,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

    展开全文
  • Android SDk。NKD,Cocos2d官方推荐使用R9D版本,使用R10D会出现找不到srand函数错误。Eclipse,我使用的是最新的Luna标准版。ADT,用Eclipse开发Android程序需要用到ADT环境。JDK,java开发环境。AVD ARM支持,默认...
  • 一般开发安卓程序,打包成正式包时需要提供证书及密钥等信息, 如果时原生开发的话,可以直接使用开发工具来生成打包证书 或者 使用 java提供的命令行指令来生成证书。 如果时混合开发的话,可以使用 java提供的...
  • 踩坑点,刚开始下载的Gradle6.5版本,打开 Android Studio后打包编译失败,排查原因,下载了Gradle7.1版本 2.需要按照上面的网址指引配置 gradle环境变量 有时会因为网路慢,打开的软件过多,造成电脑卡顿,这时
  • Android 打包发布流程

    2021-06-02 16:29:23
    生成正式签名的APK文件之前一直都是通过Androidstudio来将程序安装到手机上,而它背后实际的工作流程是,Androidstudio会将程序打包成一个apk文件,然后将这个文件传输到手机上,最后再执行安装操作。Android系统会...
  • 系统版本Android Studio版本Build APK方式生成APK调试的时候好好的,将打完的包传输到手机上进行安装,安装成功,但是一打开就闪退。没办法,只好通过在命令行运行adb logcat来抓取下log,发现闪退原因是:...
  • android-optimize.txt'), 'proguard-rules.pro' } debug { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } ...
  • 前言本文主要介绍了关于Android打包中区分测试和正式环境的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:APK打包正式环境和测试环境注意最近在项目打包中,遇到一个问题,每次打包都要...
  • 首先将需要打包的项目里的app文件复制到桌面如图: 复制出来后我们将它重新命名为你导入其他项目的Module名字如图: 这里我命名为buleToolManager 之后的一些操作我们在AS中完成,因为比较好操作,我们打开AS。...
  • Invalid keystore format 出现这个错误,我这里是jdk配置出现了问题,一个是自己下载安装的jdk ,一个是android studio安装带的jre,改成 android studio 自带的jdk就可以了。 注
  • 可通过app下面的build.gradle进行配置压缩比率,配置是否需要进行webp转换 androidwebp {//注意应该放在最外层 isOpen true //控制是否需要进行webp转换,因为在开发环境可能因为转化耗费时间,true代表进行webp转化...
  • Unity 安卓打包

    千次阅读 2021-11-14 23:31:12
    unity打包先配置环境,下载unity的时候可以顺道把unity的安卓包下载下来,如果忘了也没事,可以从unityhub下载,也可以去官网下,Unity实时内容开发平台 - 3D、2D、VR & AR可视化 | Unity中国官网 下载完以后...
  • 最近在给一个客户做SDK开发,客户交付的aar要求比较多,比如去掉R.txt文件了,把class.jar改名为我们公司前缀名并移动到libs下,网上查了好多方法都不好用,终于还是找到一个可行的方法,在这里记录一下打包过程。...
  • android 命令打包

    2021-06-09 15:34:23
    所以久而久之很多人都不会最基础的打包方式,现在就来捋顺关系首先是步骤 ,网上最少有三步,最多有8步,其中一些函数都已经被废弃,所以,笔者选择比较通用的6步1.用aapt命令生成R.java文件2.用javac命令编译java...
  • 报错信息:Cannot find type definition file for'@typeds'当我尝试使用命令'ionic cordova build android --prod --release'在android中构建应用程序时,它在Windows上正常工作在ios中使用相同命令(在Mac上)对接,...
  • Android打包失败出现Proguard returned with error code 1. See console的错误这个问题是由于代码混淆引起的,找不到引用包。只需在你的proguard-project.txt中添加如下两行即可。-libraryjars libs/okio-1.6.0.jar...
  • 该楼层疑似违规已被系统折叠隐藏此楼查看此楼Updated project.propertiesUpdated local.propertiesUpdated file F:\NewClient\huifangbanClientInitYuGan\frameworks\cocos2d-x\cocos\latform\android\java\proguard...
  • ###改动任何源代码,先执行 ionic cordova build --release android 构建生产版本包 将在app/build/outputs/apk文件夹下生成release文件夹,该文件夹下包含app-release-unsigned.apk文件和一个output-metadata.json...
  • Android Studio 打包APK(详细版)

    万次阅读 多人点赞 2021-01-07 15:22:01
    Android Studio 打包APK前言正文总结 前言 ...  Android打包APK在开发中是必不可少的一个环节,相信你可能已经会了,或者在别的博客中看到过了,但是其实还有一些细节是你所不知道的。 总结 ...
  • 微信小程序打包 找到项目中的manifest.json文件,在项目的根目录下和main.js同级 填上自己的微信小程序AppID ,如果没有申请,直接点击这个网址申请[https://mp.weixin.qq.com/] 填上AppID之后重新运行到微信...
  • 一、android中.aar文件与.jar文件简单介绍.jar:只包含了class文件与清单文件,不包含资源文件,如图片等所有res中的文件。.aar:包含所有资源,class以及res资源文件如果你只是一个简单的类库那么使用生成的.jar...
  • 命令行打包 Android APK

    2021-06-04 14:17:45
    注意安装软件包管理器MAC 电脑Windows 电脑cmd.exe 中安装PowerShell.exe 中安装安装 JDK8Mac osWindows安装 GradleMac osWindows安装 Android SDKMac osWindows安装 androd build-tools构建调试 APK构建发布版本 ...
  • 如下图所示 打包生成内容 截图 六、在 自己的 github 创建一个仓库,并把 刚刚生成的 文件全部上传到这个仓库里,比如我这里生成的内容全部在: D:/Program Files/Android/localMaven 文件里,那么就把 localMaven...
  • 这一篇讲的是用 Cocos Creator 编译器打包 Android APP 的时候遇到的一些问题,虽然说打包的过程不是很复杂,但是在其中还是会遇到各式各样的坑。我们将项目用CCC(Cocos Creator)编译器打包的时候,肯定是要先配置...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 176,777
精华内容 70,710
关键字:

安卓打包