2017年6月

Android应用程序如何导入到android源码树

软硬件环境

  • OTT BOx with android 5.1.1

前言

在做android开发时,有时需要事先将应用程序烧写到板子上去而不必让用户在板子出厂后自行安装。将应用导入到android源码树可以分为两种情况:应用的apk文件和工程源码,下面将一一介绍。

APK文件形式导入

这种方式最简单,app源码与android源码分开管理,互不相干。App发布后,再放进android源码库中编译打包。主要有一下几个步骤

在应用程序所在目录创建文件夹

一般是packages/apps/这个目录或者厂家自己存放apps的位置

mkdir Hello
将Hello.apk拷贝到刚才所创建的文件夹下
copy Hello.apk Hello
在apk同级创建Android.mk文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
    
LOCAL_MODULE := Hello.apk
LOCAL_MODULE_TAGS := eng
LOCAL_MODULE_CLASS := EXECUTABLE
LOCAL_MODULE_PATH := $(TARGET_OUT_APPS)
LOCAL_SRC_FILES := $(LOCAL_MODULE)
到android根目录进行编译
make

应用源码形式导入

在应用程序所在目录创建文件夹

一般是packages/apps/这个目录或者厂家自己存放apps的位置

mkdir Hello
将工程源码拷贝到Hello文件夹下
copy -rf Hello/* Hello/
新建Android.mk文件
LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS)

LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := Hello
LOCAL_MODULE_TAGS := eng 
    
include $(BUILD_PACKAGE)
到android根目录进行编译
make
如果java中调用了c库,则工程中会有个jni目录

source_tree_01

这里的Android.mk是用来编译C文件产生lib*.so的,如

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 

# java中System.loadLibray()使用 
LOCAL_MODULE := SerialPort
LOCAL_SRC_FILES := SerialPort.c     
LOCAL_LDLIBS := -llog 
include $(BUILD_SHARED_LIBRARY)
此时工程的Android.mk可如下
LOCAL_PATH:= $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE_TAGS := eng 
LOCAL_SRC_FILES := $(call all-java-files-under, src) 
LOCAL_PACKAGE_NAME := testApp 
LOCAL_CERTIFICATE := platform 
LOCAL_JNI_SHARED_LIBRARIES := libserial_port 
LOCAL_PROGUARD_ENABLED := disabled 
include $(BUILD_PACKAGE) 
include $(call all-makefiles-under,$(LOCAL_PATH))
重新编译
make

关于作者

Website: http://www.xugaoxiang.com
Github: https://github.com/djstava
Email: djstava@gmail.com

Android开机执行C程序

软硬件环境

  • OTT BOx with android 5.1.1

前言

之前的Android开机执行shell脚本介绍了如何在android系统开机时执行特定的shell脚本文件,不过在某些情况下不适合用shell实现,又不好做成jni动态库由app调用,这时用C语言程序来实现就有可能帮上你,本文就以创建文件夹为例,来实现android开机启动C可执行程序。

实现步骤

在Android源码中创建文件夹
cd android_src/external
mkdir djstava
创建C源文件及Android.mk

首先是写源码文件test.c

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int ret = mkdir("/system/djstava");//请确保你的用户有对相应目录的权限
    if(ret == -1)
    {
        printf("mkdir failed!\n");
        return -1;
    }
    return 0;
}

这里如果你的system分区只读,可以换成/data/djstava作为测试用

接下来就是Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng 
LOCAL_MODULE := djstava 
LOCAL_SRC_FILES := $(call all-subdir-c-files)
include $(BUILD_EXECUTABLE)
修改Android开机脚本文件init.${platform}.rc文件,增加
service djstava_test /system/bin/djstava
    class main
    user root
    group root
    oneshot
重新编译源码并打包
cd android_src
make
刷机并测试

看看文件夹/system/djstava(或者/data/djstava)是否已经被创建好了。

关于作者

Website: http://www.xugaoxiang.com
Github: https://github.com/djstava
Email: djstava@gmail.com

Android开机执行shell脚本

软硬件环境

  • OTT BOx with android 5.1.1

前言

在应用程序启动之前,往往需要在Android启动过程中去对系统做一些设置,如修改某些文件夹的属主和文件的权限等。本文实现在init.*.rc中调用shell脚本,而所有对系统资源的修改和配置都在此shell脚本中实现,最后讲一下关闭android selinux的三种方法。

Shell脚本

这里以创建蓝牙设备结点为例,shell文件名为makebtusb0.sh,在脚本中创建结点,然后修改结点属性,具体如下

#! /system/bin/sh

mknod /dev/btusb0 c 180 194
chmod 777 /dev/btusb0

修改init.${platform}.rc文件

这个文件一般是放在device目录下,如果没有的话,也可以直接加到init.rc中

service makenode /system/etc/makebtusb0.sh
    class main
    user root
    group root 
    oneshot

上述命令中,包含一些android init language的知识点,如果想了解的话,请见参考资料1,写得非常详细。

关闭Android selinux的几种方法

刚好在集成蓝牙驱动中碰到了这个问题,就在这里一并记录下,希望其他朋友少走弯路

方法一
setenforce 0
方法二
echo 0 > /sys/fs/selinux/enforce
方法三

编辑BoardConfig.mk

BOARD_KERNEL_CMDLINE := console=ttyS0,115200n8 androidboot.hardware=zx2000 androidboot.serialno=01234567890123456789 androidboot.selinux=permissive

方法一和方法二适合在终端中执行,当然放在这篇文章中,也可以利用shell脚本实现。方法三在源码中设定,编译打包镜像后就不用再做设置,推荐用这种方法。

关于作者

Website: http://www.xugaoxiang.com
Github: https://github.com/djstava
Email: djstava@gmail.com

参考资料

https://www.kancloud.cn/digest/shichang-framework/131973

Android应用的多语言支持

软硬件环境

  • Windows 10
  • Android studio 2.3.2
  • OTT BOx with android 5.1.1

前言

App开发测试完成后就面临着应用上架,除了国内的上架渠道,android阵营上架Google play我觉得是必不可少的。这样的话,中英文支持就成了必须的功能点了。本文就来实现这个功能。

设置不同语言的资源文件

如有必要,res文件夹下的像drawable、layout、values等都需要做不同语言的处理,这里仅以values为例

language_res

values-en和values-zh-rCN文件夹中的内容都一样values-en就是values-zh-rCN对应的英文翻译,如strings.xml文件内容如下

language_string

接下来就是如何使用对应资源,非常简答,以Toast为例

Toast.makeText(MainActivity.this, R.string.play_error, Toast.LENGTH_LONG).show();

系统当前的语言环境

这里仅处理中文、英文,如果还有其它语言,需要稍作修改

private boolean isZh() {
    Locale locale = getResources().getConfiguration().locale;
    String language = locale.getLanguage();
    if (language.endsWith("zh")) {
        return true;
    } else {
        return false;
    }
}

App内设置语言

//获取res资源对象
Resources resources = getResources();    
//获取设置对象
Configuration config = resources.getConfiguration();   
//获取屏幕参数:主要是分辨率,像素等
DisplayMetrics dm = resources.getDisplayMetrics(); 
//设置APP语言设置为英文
config.locale = Locale.ENGLISH;  
//设置完以后要刷新Activity才能及时生效
resources.updateConfiguration(config, dm);

资源文件夹后缀

给出一个常用的语言文件夹命名列表,方便查询

中文(中国):values-zh-rCN
中文(台湾):values-zh-rTW
中文(香港):values-zh-rHK
英语(美国):values-en-rUS
英语(英国):values-en-rGB
英文(澳大利亚):values-en-rAU
英文(加拿大):values-en-rCA
英文(爱尔兰):values-en-rIE
英文(印度):values-en-rIN
英文(新西兰):values-en-rNZ
英文(新加坡):values-en-rSG
英文(南非):values-en-rZA
阿拉伯文(埃及):values-ar-rEG
阿拉伯文(以色列):values-ar-rIL
保加利亚文:  values-bg-rBG
加泰罗尼亚文:values-ca-rES
捷克文:values-cs-rCZ
丹麦文:values-da-rDK
德文(奥地利):values-de-rAT
德文(瑞士):values-de-rCH
德文(德国):values-de-rDE
德文(列支敦士登):values-de-rLI
希腊文:values-el-rGR
西班牙文(西班牙):values-es-rES
西班牙文(美国):values-es-rUS
芬兰文(芬兰):values-fi-rFI
法文(比利时):values-fr-rBE
法文(加拿大):values-fr-rCA
法文(瑞士):values-fr-rCH
法文(法国):values-fr-rFR
希伯来文:values-iw-rIL
印地文:values-hi-rIN
克罗里亚文:values-hr-rHR
匈牙利文:values-hu-rHU
印度尼西亚文:values-in-rID
意大利文(瑞士):values-it-rCH
意大利文(意大利):values-it-rIT
日文:values-ja-rJP
韩文:values-ko-rKR
立陶宛文:valueslt-rLT
拉脱维亚文:values-lv-rLV
挪威博克马尔文:values-nb-rNO
荷兰文(比利时):values-nl-BE
荷兰文(荷兰):values-nl-rNL
波兰文:values-pl-rPL
葡萄牙文(巴西):values-pt-rBR
葡萄牙文(葡萄牙):values-pt-rPT
罗马尼亚文:values-ro-rRO
俄文:values-ru-rRU
斯洛伐克文:values-sk-rSK
斯洛文尼亚文:values-sl-rSI
塞尔维亚文:values-sr-rRS
瑞典文:values-sv-rSE
泰文:values-th-rTH
塔加洛语:values-tl-rPH
土耳其文:values--r-rTR
乌克兰文:values-uk-rUA
越南文:values-vi-rVN