液晶輝度を変更する

液晶の輝度を変更するには?


例によって、1.6 の init.rc で起動している service は流用しておく事。(エラーがループするモノは切って良い)
今回は、
libutils.so
に含まれる、 Android::Mutex と Android::Condition の inline を削除する作業になる。
bin、libをmakeした後に libutils.so を変更し、cleanせずに mm した方が良いと思われる。
通常、bin、lib で libutils.so をリンクして Android::Mutex と Android::Condition を利用するモノは inline でリンクされているからだ。
また、bin、libに含まれる シンボルを表示する方法も(私にとっての覚え書きも含めて)一緒に解説する。
修正するファイルは、
$ANDROID_SRC/frameworks/base/include/utils/threads.h
$ANDROID_SRC/frameworks/base/libs/utils/Threads.cpp
である。
まず、デフォルトの状態のシンボル状態を nm で見てみる。
コマンド nm のオプションは次のサイトを参照するとよい。

$ $ANDROID_SRC/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-nm -D -C libutils.so
とすると、ライブラリに含まれる全シンボルが表示される。U と出てるのは’未定義のシンボル’(他のライブラリに含まれる)ので除外してみる。
$ $ANDROID_SRC/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-nm -D -C libutils.so | grep -v ' U '
等としてみると良い。

ソースを修正して、mm する。( source $ANDROID_SRC/build/envsetup.sh をしているのを前提とする )
完成した、lib ディレクトリにて、 nm した例を2つ
Mutex
$ $ANDROID_SRC/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-nm -D -C libutils.so | grep Mutex
0001bc28 T android::Mutex::lock()
0001bc20 T android::Mutex::unlock()
0001bc14 T android::Mutex::tryLock()
0001bde0 T android::Mutex::Mutex(char const*)
0001bebc T android::Mutex::Mutex(int, char const*)
0001be9c T android::Mutex::Mutex()
0001be8c T android::Mutex::Mutex(char const*)
0001bef4 T android::Mutex::Mutex(int, char const*)
0001beac T android::Mutex::Mutex()
0001bd48 T android::Mutex::~Mutex()
0001bdd4 T android::Mutex::~Mutex()
0001bb18 T android::Condition::waitRelative(android::Mutex&, long long)
0001bb60 T android::Condition::wait(android::Mutex&)
Condition
$ $ANDROID_SRC/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin/arm-eabi-nm -D -C libutils.so | grep Condition
0001bb18 T android::Condition::waitRelative(android::Mutex&, long long)
0001bb60 T android::Condition::wait(android::Mutex&)
0001bb0c T android::Condition::signal()
0001bb04 T android::Condition::broadcast()
0001bba4 T android::Condition::Condition(int)
0001bb84 T android::Condition::Condition()
0001bbdc T android::Condition::Condition(int)
0001bb94 T android::Condition::Condition()
0001bb6c T android::Condition::~Condition()
0001bb78 T android::Condition::~Condition()
と出てくれば成功。

あとは、libutils.so を実機に転送すれば完了。


実際の修正

一応、diff は載せたが、作業内容としては、threads.h の inline 部分をコメントアウトして、コメントアウトした範囲を Threads.cpp に挿入して inline を削除する。

$ diff -u /froyo_clean/frameworks/base/include/utils/threads.h ./threads.h
--- froyo_clean/frameworks/base/include/utils/threads.h	2010-12-31 04:48:59.319941941 +0900
+++ ./threads.h	2011-01-17 14:49:22.938400934 +0900
@@ -252,7 +252,7 @@
 };
 
 #if defined(HAVE_PTHREADS)
-
+/*
 inline Mutex::Mutex() {
     pthread_mutex_init(&mMutex, NULL);
 }
@@ -282,7 +282,7 @@
 inline status_t Mutex::tryLock() {
     return -pthread_mutex_trylock(&mMutex);
 }
-
+*/
 #endif // HAVE_PTHREADS
 
 /*
@@ -331,7 +331,7 @@
 };
 
 #if defined(HAVE_PTHREADS)
-
+/*
 inline Condition::Condition() {
     pthread_cond_init(&mCond, NULL);
 }
@@ -384,7 +384,7 @@
 inline void Condition::broadcast() {
     pthread_cond_broadcast(&mCond);
 }
-
+*/
 #endif // HAVE_PTHREADS

 /*****************************************************************************/

$ diff -ubB Threads.cpp.orig Threads.cpp
--- Threads.cpp.orig	2011-01-17 23:03:55.537337755 +0900
+++ Threads.cpp	2011-01-17 14:50:10.207440505 +0900
@@ -332,7 +332,36 @@
  */
 
 #if defined(HAVE_PTHREADS)
-// implemented as inlines in threads.h
+Mutex::Mutex() {
+    pthread_mutex_init(&mMutex, NULL);
+}
+Mutex::Mutex(const char* name) {
+    pthread_mutex_init(&mMutex, NULL);
+}
+Mutex::Mutex(int type, const char* name) {
+    if (type == SHARED) {
+        pthread_mutexattr_t attr;
+        pthread_mutexattr_init(&attr);
+        pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
+        pthread_mutex_init(&mMutex, &attr);
+        pthread_mutexattr_destroy(&attr);
+    } else {
+        pthread_mutex_init(&mMutex, NULL);
+    }
+}
+Mutex::~Mutex() {
+    pthread_mutex_destroy(&mMutex);
+}
+status_t Mutex::lock() {
+    return -pthread_mutex_lock(&mMutex);
+}
+void Mutex::unlock() {
+    pthread_mutex_unlock(&mMutex);
+}
+status_t Mutex::tryLock() {
+    return -pthread_mutex_trylock(&mMutex);
+}
+
 #elif defined(HAVE_WIN32_THREADS)
 
 Mutex::Mutex()
@@ -407,7 +437,59 @@
  */
 
 #if defined(HAVE_PTHREADS)
-// implemented as inlines in threads.h
+Condition::Condition() {
+    pthread_cond_init(&mCond, NULL);
+}
+Condition::Condition(int type) {
+    if (type == SHARED) {
+        pthread_condattr_t attr;
+        pthread_condattr_init(&attr);
+        pthread_condattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
+        pthread_cond_init(&mCond, &attr);
+        pthread_condattr_destroy(&attr);
+    } else {
+        pthread_cond_init(&mCond, NULL);
+    }
+}
+Condition::~Condition() {
+    pthread_cond_destroy(&mCond);
+}
+status_t Condition::wait(Mutex& mutex) {
+    return -pthread_cond_wait(&mCond, &mutex.mMutex);
+}
+status_t Condition::waitRelative(Mutex& mutex, nsecs_t reltime) {
+#if defined(HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE)
+    struct timespec ts;
+    ts.tv_sec  = reltime/1000000000;
+    ts.tv_nsec = reltime%1000000000;
+    return -pthread_cond_timedwait_relative_np(&mCond, &mutex.mMutex, &ts);
+#else // HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE
+    struct timespec ts;
+#if defined(HAVE_POSIX_CLOCKS)
+    clock_gettime(CLOCK_REALTIME, &ts);
+#else // HAVE_POSIX_CLOCKS
+    // we don't support the clocks here.
+    struct timeval t;
+    gettimeofday(&t, NULL);
+    ts.tv_sec = t.tv_sec;
+    ts.tv_nsec= t.tv_usec*1000;
+#endif // HAVE_POSIX_CLOCKS
+    ts.tv_sec += reltime/1000000000;
+    ts.tv_nsec+= reltime%1000000000;
+    if (ts.tv_nsec >= 1000000000) {
+        ts.tv_nsec -= 1000000000;
+        ts.tv_sec  += 1;
+    }
+    return -pthread_cond_timedwait(&mCond, &mutex.mMutex, &ts);
+#endif // HAVE_PTHREAD_COND_TIMEDWAIT_RELATIVE
+}
+void Condition::signal() {
+    pthread_cond_signal(&mCond);
+}
+void Condition::broadcast() {
+    pthread_cond_broadcast(&mCond);
+}
+
 #elif defined(HAVE_WIN32_THREADS)
 
 /*

間違い、わかりにくいところ等有ればコメントいただけると幸いです。
コメント
  • 2.3.1_r1だと無修正で対応してました。一応ご報告まで。 -- RO215IS01 (2011-01-29 18:22:33)
名前:
コメント:













(2011/01/18 0:03 公開)
最終更新:2011年01月29日 18:22
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。