Android 빌드 시 u-boot image 생성을 위한 tool 설치방법
OS : Ubuntu 14.04.5 LTS
Command
$ sudo apt-get install u-boot-mkimage
Error Message
"mkimage" command not found - U-Boot images will not be built
make[1]: *** [arch/arm/boot/uImage] Error 1
make: *** [uImage] Error 2
ERROR: build kernel Failed
2020년 1월 10일 금요일
2019년 3월 25일 월요일
[android] SharedPreferences 사용하기
Android SharedPreferences 사용하기
import android.content.SharedPreferences;
private static SharedPreferences mSharedPref;
private static SharedPreferences.Editor mEditor;
private static final String PREF_PDCUI = "PdcUIPrefs" ;
Override
protected void onCreate(Bundle savedInstanceState) {
mSharedPref = getSharedPreferences(PREF_PDCUI, Context.MODE_PRIVATE);
if ( mSharedPref != null )
mEditor = mSharedPref.edit();
}
---------------------------------------------------------------------
1. Write Data to Preferneces
mEditor.putInt(PREF_OPSWIDGET, ((arg1==true)?1:0));
mEditor.commit();
2. Read Data from Preferences
mOpsWidgetShow = mSharedPref.getBoolean(PREF_OPSWIDGET, true);
[android] 안드로이드 인터페이스 정의 언어 (AIDL)
안드로이드 인터페이스 정의 언어 (AIDL)
- https://developer.android.com/guide/components/aidl.html?hl=ko#Calling
- https://android-kr.tistory.com/m/284
- https://developer.android.com/guide/components/aidl.html?hl=ko#Calling
- https://android-kr.tistory.com/m/284
[android] Native RTL support in Android 4.2
[android] Native RTL support in Android 4.2
1. add android:supportsRtl="true" to the <application> element in your manifest file.
2. Change all of your app's "left/right" layout properties to new "start/end" equivalents.
- https://android-developers.googleblog.com/2013/03/native-rtl-support-in-android-42.html
[android] signing key 적용 APK Release하기 (link)
signing key 적용 APK Release하기
- https://appsnuri.tistory.com/20[android] How to disable Lock Screen via property system
Android Disable Lock Screen via property system
add below line at init.rc or build.prop
# Set LockScreen Disable
setprop ro.lockscreen.disable.default true
[android] How to get Default Launcher Package Name
Android How to get Default Launcher Package Name
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.content.pm.PackageManager;
private String getHomeScreenAppName() {
String homePkgName;
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
ResolveInfo resolveInfo = mContext.getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY);
homePkgName = resolveInfo.activityInfo.packageName;
//Toast.makeText(this.getApplicationContext(), currentHomePackage, Toast.LENGTH_LONG).show();
Log.d(TAG, "Home Screen Package : " + homePkgName);
return homePkgName;
}
[android] Audio System 관련 링크
Android Audio System
Linux Sound Device와 안드로이드 사운드 시스템
- https://www.oss.kr/info_techtip/show/d6d8e645-5a73-43b1-8c4b-4acf38f79553
ASoc Codec Class driver
- https://www.kernel.org/doc/html/v4.14/sound/soc/codec.html
오디오 용어정리
- http://www.audiojournal.co.kr/lecture/aud_15_1.php
Android Auto 관련 link 모음
Android Auto
- https://www.slideshare.net/dhiraj007/android-auto-43273422
- http://linuxgizmos.com/google-posts-android-auto-guidelines/
- https://www.slideshare.net/godfreynolan/android-auto
- https://www.slideshare.net/dhiraj007/android-auto-43273422
- http://linuxgizmos.com/google-posts-android-auto-guidelines/
- https://www.slideshare.net/godfreynolan/android-auto
[android] Telephony Framework (link)
Android Telephony Framework 개요
- https://victor8481.tistory.com/m/262
- https://victor8481.tistory.com/m/262
[android] 디자인패턴 (link)
Android 디자인패턴
- https://tosslab.github.io/android/2015/03/01/01.Android-mvc-mvvm-mvp.html
Android MVP 무작정 따라하기
- https://thdev.tech/androiddev/2017/02/20/Android-MVP-Package-Structure/
- https://tosslab.github.io/android/2015/03/01/01.Android-mvc-mvvm-mvp.html
Android MVP 무작정 따라하기
- https://thdev.tech/androiddev/2017/02/20/Android-MVP-Package-Structure/
[android] Binder 소개 (link)
Android Binder 소개
- http://www.flowdas.com/introduction-to-android-binder/
- http://www.flowdas.com/introduction-to-android-binder/
[ Android] Wakelock을 이용한 Back Light AlwaysOn
Back Light AlwaysOn via Wakelock
import android.os.PowerManager;
private PowerManager mPM;
private PowerManager.WakeLock mAlwyasOnWakeLock;
mPM = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
mAlwyasOnWakeLock = mPM.newWakeLock(PowerManager.FULL_WAKE_LOCK, "AlwaysOn_BL");
mAlwyasOnWakeLock.acquire();
[Android] KeyEvent.KEYCODE_NOTIFICATION 을 Application으로 전달하지 않기
#Android KeyEvent.KEYCODE_NOTIFICATION 을 Application으로 전달하지 않기
1. 특정 KeyCode에 대해 POLICY_FLAG_PASS_TO_USER flag 제거
1.1 Flag 정의
path : frameworks/native/include/input/input.h
// Indicates that the event should be dispatched to applications.
// The input event should still be sent to the InputDispatcher so that it can see all
// input events received include those that it will not deliver.
POLICY_FLAG_PASS_TO_USER = 0x40000000,
1.2 수정사항
path : rk3066/frameworks/base/services/jni/com_android_server_input_InputManagerService.cpp
void NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) {
......
handleInterceptActions(wmActions, when, /byref/ policyFlags);
......
if (keyEvent->getKeyCode() == /KeyEvent.KEYCODE_NOTIFICATION/83 )
policyFlags &= ~POLICY_FLAG_PASS_TO_USER;
}
void NativeInputManager::handleInterceptActions(jint wmActions, nsecs_t when,
uint32_t& policyFlags) {
if (wmActions & WM_ACTION_GO_TO_SLEEP) {
#if DEBUG_INPUT_DISPATCHER_POLICY
ALOGD("handleInterceptActions: Going to sleep.");
#endif
android_server_PowerManagerService_goToSleep(when);
}
if (wmActions & WM_ACTION_WAKE_UP) {
#if DEBUG_INPUT_DISPATCHER_POLICY
ALOGD("handleInterceptActions: Waking up.");
#endif
android_server_PowerManagerService_wakeUp(when);
}
if (wmActions & WM_ACTION_PASS_TO_USER) {
policyFlags |= POLICY_FLAG_PASS_TO_USER;
} else {
#if DEBUG_INPUT_DISPATCHER_POLICY
ALOGD("handleInterceptActions: Not passing key to user.");
#endif
}
}
2. Error case
- 현상 : KeyEvent 제거 -> Wakeup 불가.
path : rk3066/frameworks/base/core/jni/android_view_KeyEvent.cpp
jobject android_view_KeyEvent_fromNative(JNIEnv* env, const KeyEvent* event) {
if ( event->getKeyCode() == XXX )
return NULL;
}
1. 특정 KeyCode에 대해 POLICY_FLAG_PASS_TO_USER flag 제거
1.1 Flag 정의
path : frameworks/native/include/input/input.h
// Indicates that the event should be dispatched to applications.
// The input event should still be sent to the InputDispatcher so that it can see all
// input events received include those that it will not deliver.
POLICY_FLAG_PASS_TO_USER = 0x40000000,
1.2 수정사항
path : rk3066/frameworks/base/services/jni/com_android_server_input_InputManagerService.cpp
void NativeInputManager::interceptKeyBeforeQueueing(const KeyEvent* keyEvent, uint32_t& policyFlags) {
......
handleInterceptActions(wmActions, when, /byref/ policyFlags);
......
if (keyEvent->getKeyCode() == /KeyEvent.KEYCODE_NOTIFICATION/83 )
policyFlags &= ~POLICY_FLAG_PASS_TO_USER;
}
void NativeInputManager::handleInterceptActions(jint wmActions, nsecs_t when,
uint32_t& policyFlags) {
if (wmActions & WM_ACTION_GO_TO_SLEEP) {
#if DEBUG_INPUT_DISPATCHER_POLICY
ALOGD("handleInterceptActions: Going to sleep.");
#endif
android_server_PowerManagerService_goToSleep(when);
}
if (wmActions & WM_ACTION_WAKE_UP) {
#if DEBUG_INPUT_DISPATCHER_POLICY
ALOGD("handleInterceptActions: Waking up.");
#endif
android_server_PowerManagerService_wakeUp(when);
}
if (wmActions & WM_ACTION_PASS_TO_USER) {
policyFlags |= POLICY_FLAG_PASS_TO_USER;
} else {
#if DEBUG_INPUT_DISPATCHER_POLICY
ALOGD("handleInterceptActions: Not passing key to user.");
#endif
}
}
2. Error case
- 현상 : KeyEvent 제거 -> Wakeup 불가.
path : rk3066/frameworks/base/core/jni/android_view_KeyEvent.cpp
jobject android_view_KeyEvent_fromNative(JNIEnv* env, const KeyEvent* event) {
if ( event->getKeyCode() == XXX )
return NULL;
}
[Android] seekbar control sample
android seekbar control
- https://mindfiremobile.wordpress.com/2014/05/20/seekbar-customization-for-android-development/
- https://mindfiremobile.wordpress.com/2014/05/20/seekbar-customization-for-android-development/
[Android] Switch widget control
android Switch widget control sample
import android.widget.Switch;
private Switch mySwitch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mySwitch = (Switch) findViewById(R.id.mySwitch);
//set the switch to ON
mySwitch.setChecked(true);
//attach a listener to check for changes in state
mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if(isChecked){
// switch on
}else{
// switch off
}
}
});
}
import android.widget.Switch;
private Switch mySwitch;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mySwitch = (Switch) findViewById(R.id.mySwitch);
//set the switch to ON
mySwitch.setChecked(true);
//attach a listener to check for changes in state
mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if(isChecked){
// switch on
}else{
// switch off
}
}
});
}
[Android] system 시간 관련 함수
android system 시간 관련 함수.
System.currentTimeMillis()
The wall clock can be set by the user or the phone
* network (see {@link#setCurrentTimeMillis}), so the time may jump
* backwards or forwards unpredictably. This clock should only be used
* when correspondence with real-world dates and times is important, such
* as in a calendar or alarm clock application.
* {@link android.content.Intent#ACTION_TIME_TICK ACTION_TIME_TICK},
* {@link android.content.Intent#ACTION_TIME_CHANGED ACTION_TIME_CHANGED}
* and {@link android.content.Intent#ACTION_TIMEZONE_CHANGED
* ACTION_TIMEZONE_CHANGED} {@link android.content.Intent Intent}
* broadcasts to find out when the time changes.
*
System.uptimeMillis()
counted in milliseconds since the
* system was booted. This clock stops when the system enters deep
* sleep (CPU off, display dark, device waiting for external input),
* but is not affected by clock scaling, idle, or other power saving
* mechanisms.
System.elapsedRealtime() / System.elapsedRealtimeNanos()
* <li> <p> {@link#elapsedRealtime} and {@link#elapsedRealtimeNanos}
* return the time since the system was booted, and include deep sleep.
* This clock is guaranteed to be monotonic, and continues to tick even
* when the CPU is in power saving modes, so is the recommend basis
* for general purpose interval timing.
System.currentTimeMillis()
The wall clock can be set by the user or the phone
* network (see {@link#setCurrentTimeMillis}), so the time may jump
* backwards or forwards unpredictably. This clock should only be used
* when correspondence with real-world dates and times is important, such
* as in a calendar or alarm clock application.
* {@link android.content.Intent#ACTION_TIME_TICK ACTION_TIME_TICK},
* {@link android.content.Intent#ACTION_TIME_CHANGED ACTION_TIME_CHANGED}
* and {@link android.content.Intent#ACTION_TIMEZONE_CHANGED
* ACTION_TIMEZONE_CHANGED} {@link android.content.Intent Intent}
* broadcasts to find out when the time changes.
*
System.uptimeMillis()
counted in milliseconds since the
* system was booted. This clock stops when the system enters deep
* sleep (CPU off, display dark, device waiting for external input),
* but is not affected by clock scaling, idle, or other power saving
* mechanisms.
System.elapsedRealtime() / System.elapsedRealtimeNanos()
* <li> <p> {@link#elapsedRealtime} and {@link#elapsedRealtimeNanos}
* return the time since the system was booted, and include deep sleep.
* This clock is guaranteed to be monotonic, and continues to tick even
* when the CPU is in power saving modes, so is the recommend basis
* for general purpose interval timing.
[Android] NDK standalone toolchain을 생성하기
#android #ndk #standalon #toolchain
Android 7.x 기준으로 NDK standalone toolchain을 생성하는 방법을 정리한다.
1. Android NDK 다운로드 후 압축
: 문서를 작성중인 현재 stable 버전은 r16b이다.
- https://developer.android.com/ndk/downloads/
2. standalone toolchain 생성
$ cd android-ndk
$ make-standalone-toolchain.sh --verbose --toolchain=arm-linux-androideabi-4.9 --package-dir=/home/sisbsoma/toolchain --platform=android-26 --arch=arm
HOST_OS=linux
HOST_EXE=
HOST_ARCH=x86_64
HOST_TAG=linux-x86_64
HOST_NUM_CPUS=8
BUILD_NUM_CPUS=16
## COMMAND: python /opt/android-sdk/ndk-bundle/build/tools/make_standalone_toolchain.py --arch arm --api 26 --stl gnustl --package-dir=/home/sisbsoma/toolchain
정상적으로 생성된 경우 아래와 같은 로그가 출력된다.
Package installed to /home/sisbsoma/toolchain.
생성된 이미지는 tar.bz2 형태로 압축되어 있다.
$ cd /home/sisbsoma/toolchain && ls
arm-linux-androideabi.tar.bz2
-----------------------------------------------------------------------------------------------------------------------
ex) FFTW-3.3.3 을 standalone toolchain 을 사용하여 컴파일 하는 방법
configure -> make -> make install
$ ./configure CC=$HOME/ndk-toolchain-gingerbread/bin/arm-linux-androideabi-gcc CXX=$HOME/ndk-toolchain-gingerbread/bin/arm-linux-androideabi-g++ CPPFLAGS=-I$HOME/ndk-toolchain-gingerbread/include LDFLAGS="-Wl,-rpath-link=$HOME/ndk-toolchain/lib -L$HOME/ndk-toolchain-gingerbread/lib" --host=arm-eabi --disable-fortran --prefix=$HOME/Downloads/fftw-3.3.3/lib-out
$make
$make install
Android 7.x 기준으로 NDK standalone toolchain을 생성하는 방법을 정리한다.
1. Android NDK 다운로드 후 압축
: 문서를 작성중인 현재 stable 버전은 r16b이다.
- https://developer.android.com/ndk/downloads/
2. standalone toolchain 생성
$ cd android-ndk
$ make-standalone-toolchain.sh --verbose --toolchain=arm-linux-androideabi-4.9 --package-dir=/home/sisbsoma/toolchain --platform=android-26 --arch=arm
HOST_OS=linux
HOST_EXE=
HOST_ARCH=x86_64
HOST_TAG=linux-x86_64
HOST_NUM_CPUS=8
BUILD_NUM_CPUS=16
## COMMAND: python /opt/android-sdk/ndk-bundle/build/tools/make_standalone_toolchain.py --arch arm --api 26 --stl gnustl --package-dir=/home/sisbsoma/toolchain
정상적으로 생성된 경우 아래와 같은 로그가 출력된다.
Package installed to /home/sisbsoma/toolchain.
생성된 이미지는 tar.bz2 형태로 압축되어 있다.
$ cd /home/sisbsoma/toolchain && ls
arm-linux-androideabi.tar.bz2
-----------------------------------------------------------------------------------------------------------------------
ex) FFTW-3.3.3 을 standalone toolchain 을 사용하여 컴파일 하는 방법
configure -> make -> make install
$ ./configure CC=$HOME/ndk-toolchain-gingerbread/bin/arm-linux-androideabi-gcc CXX=$HOME/ndk-toolchain-gingerbread/bin/arm-linux-androideabi-g++ CPPFLAGS=-I$HOME/ndk-toolchain-gingerbread/include LDFLAGS="-Wl,-rpath-link=$HOME/ndk-toolchain/lib -L$HOME/ndk-toolchain-gingerbread/lib" --host=arm-eabi --disable-fortran --prefix=$HOME/Downloads/fftw-3.3.3/lib-out
$make
$make install
-ref : https://plus.google.com/109848742745880085168/posts/QHawrqbfMFA
[rockchip] Rockchip Batch Tool V1.5 실행오류 관련 정리
rockchip Binary Download Tool 설정
1. 현상
- Rockchip Batch Tool V1.5.exe 실행시 장치 인식 안됨
2. 수정사항
- config.ini 수정
- SUPPORTLOWUSB=TRUE 추가
#选择工具语言:Selected=1(中文);Selected=2(英文)
[Language]
Kinds=2
Selected=2
LangPath=Language\
Lang1File=Chinese.ini
Lang1FontName=宋体
Lang1FontSize=9
Lang1Tag=CHN
Lang1CHNTitle=中文
Lang1ENGTitle=English
Lang2File=English.ini
Lang2FontName=Arial
Lang2FontSize=9
Lang2Tag=ENG
Lang2CHNTitle=英文
Lang2ENGTitle=English
[System]
#下面是设备rockusb设备和msc设备的vendor id和product id,一般情况下这些ID不用设置可以使用默#认的,由于msc设备的VID和PID是可以修改定制的,设置例子如下:
#MSC_VID=0x0BB4,MSC_PID=0x0C01
RKUSB_VID=2207
RKUSB_PID=300A
MSC_VID=
MSC_PID=
FORCEFLAG=FALSE
#设置用户盘操作,
#FORMATFLAG=TRUE时,在升级后会对用户盘格式化,磁盘卷标可以通过设置DISKVOLUME项来指定
FORMATFLAG=
DISKVOLUME=USER_DISK
#COPYFLAG=TRUE时,在升级后会将DEFAULT_COPYPATH指定的目录或者文件拷贝到用户盘根目录
COPYFLAG=
DEFAULT_COPYPATH=
FORMATDATADISKFLAG=
DATADISKVOLUME=DATA_DISK
COPYDATADISKFLAG=
DEFAULT_DATADISK_COPYPATH=
LOGFLAG=TRUE
#SUPPORTLOWUSB=TRUE时,扫描支持full speed usb设备,默认只支持high speed usb设备
SUPPORTLOWUSB=TRUE
#通过设置CHECK_MACHINE_MODEL项,可以在升级前校验固件是否允许升级,允许的条件是设备中的值要跟#固件中parameter文件里MACHINE_MODEL的值匹配
CHECK_MACHINE_MODEL=
#QUICK_CHECK_MODE=TRUE时,开启快速校验模式,可以提高校验速度,但是也存在一些校验不完全的风险
QUICK_CHECK_MODE=
#通过设置DEFAULT_FIRMWARE项,等于默认加载固件的路径,可以在程序启动时自动打开此位置的固件
DEFAULT_FIRMWARE=
UID_STRING=ROCKCHIP
FW_VERSION_MODE=
#Android固件,可以通过指定MISC_MODIFY_MODE为WIPE_DATA和WIPE_ALL来修改misc分区数据,#WIPE_DATA时不擦除用户空间数据,WIPE_ALL则全部擦除
MISC_MODIFY_MODE=
MSC_WAITTIME=30
RKUSB_WAITTIME=30
1. 현상
- Rockchip Batch Tool V1.5.exe 실행시 장치 인식 안됨
2. 수정사항
- config.ini 수정
- SUPPORTLOWUSB=TRUE 추가
#选择工具语言:Selected=1(中文);Selected=2(英文)
[Language]
Kinds=2
Selected=2
LangPath=Language\
Lang1File=Chinese.ini
Lang1FontName=宋体
Lang1FontSize=9
Lang1Tag=CHN
Lang1CHNTitle=中文
Lang1ENGTitle=English
Lang2File=English.ini
Lang2FontName=Arial
Lang2FontSize=9
Lang2Tag=ENG
Lang2CHNTitle=英文
Lang2ENGTitle=English
[System]
#下面是设备rockusb设备和msc设备的vendor id和product id,一般情况下这些ID不用设置可以使用默#认的,由于msc设备的VID和PID是可以修改定制的,设置例子如下:
#MSC_VID=0x0BB4,MSC_PID=0x0C01
RKUSB_VID=2207
RKUSB_PID=300A
MSC_VID=
MSC_PID=
FORCEFLAG=FALSE
#设置用户盘操作,
#FORMATFLAG=TRUE时,在升级后会对用户盘格式化,磁盘卷标可以通过设置DISKVOLUME项来指定
FORMATFLAG=
DISKVOLUME=USER_DISK
#COPYFLAG=TRUE时,在升级后会将DEFAULT_COPYPATH指定的目录或者文件拷贝到用户盘根目录
COPYFLAG=
DEFAULT_COPYPATH=
FORMATDATADISKFLAG=
DATADISKVOLUME=DATA_DISK
COPYDATADISKFLAG=
DEFAULT_DATADISK_COPYPATH=
LOGFLAG=TRUE
#SUPPORTLOWUSB=TRUE时,扫描支持full speed usb设备,默认只支持high speed usb设备
SUPPORTLOWUSB=TRUE
#通过设置CHECK_MACHINE_MODEL项,可以在升级前校验固件是否允许升级,允许的条件是设备中的值要跟#固件中parameter文件里MACHINE_MODEL的值匹配
CHECK_MACHINE_MODEL=
#QUICK_CHECK_MODE=TRUE时,开启快速校验模式,可以提高校验速度,但是也存在一些校验不完全的风险
QUICK_CHECK_MODE=
#通过设置DEFAULT_FIRMWARE项,等于默认加载固件的路径,可以在程序启动时自动打开此位置的固件
DEFAULT_FIRMWARE=
UID_STRING=ROCKCHIP
FW_VERSION_MODE=
#Android固件,可以通过指定MISC_MODIFY_MODE为WIPE_DATA和WIPE_ALL来修改misc分区数据,#WIPE_DATA时不擦除用户空间数据,WIPE_ALL则全部擦除
MISC_MODIFY_MODE=
MSC_WAITTIME=30
RKUSB_WAITTIME=30
피드 구독하기:
글 (Atom)