tag:blogger.com,1999:blog-85426743545729225892024-02-20T12:44:03.120-06:00路一直都在Unknownnoreply@blogger.comBlogger69125tag:blogger.com,1999:blog-8542674354572922589.post-22846623901304919352019-12-26T12:00:00.001-06:002020-01-02T14:13:10.321-06:00Root Pixel2 with Magisk<br />
<div>
<br /></div>
<div>
<b>Root steps</b></div>
<ol>
<li>head to Google's firmware download page for Pixel devices and select your model from the menu on the right.</li>
<li>Unzip the file, original rom</li>
<li>Looking for "image-walleye" or "image-taimen"</li>
<li>Looking for "boot.img"</li>
<li>Put "boot.img" to phone</li>
<li>Install Magisk Manager app. Tap "Install" then "Patch boot image File"\</li>
<li>Magisk Manager app should generate file "patched_boot.img". Copy file to computer</li>
<li>Restart device to boot loader mode "adb reboot bootloader"</li>
<li>Refresh boot img by command "fastboot flash boot "PATH_TO_PATCHED_BOOT.IMG"</li>
<li>Relaunch device "Fastboot reboot" and magick manager. Should see Magisk SU</li>
</ol>
<br />
<br />
<br />
<b>Put back factory boot.img for receive system OTA</b><br />
<br />
<ol>
<li>Restart device to boot loader mode</li>
<li>Refresh boot img by command "fastboot flash boot "PATH_TO_FACTORY_BOOT.IMG"</li>
<li>Relaunch device with "Fastboot reboot" </li>
</ol>
<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-26686596072271120872018-05-17T14:22:00.001-05:002018-05-17T14:22:38.861-05:00Add Stub module on Android studio1. Create java library module, not Android library.<br />
apply plugin: 'java'<br />
Write stub code in this module<span style="white-space: pre;"> </span><br />
<br />
2. Add reference Stub in build.gradle in app module<br />
<span style="white-space: pre;"> </span><br />
<span style="white-space: pre;"> </span>android {<br />
<span style="white-space: pre;"> </span><br />
<span style="white-space: pre;"> </span>allprojects {<br />
gradle.projectsEvaluated {<br />
tasks.withType(JavaCompile) {<br />
doFirst {<br />
options.fork = true<br />
options.compilerArgs.add("-Xbootclasspath/p:$project.rootDir/stub/build/libs/stub.jar")<br />
}<br />
}<span style="white-space: pre;"> </span><br />
}<br />
}<br />
<span style="white-space: pre;"> </span>}<br />
<span style="white-space: pre;"> </span>dependencies {<br />
<span style="white-space: pre;"> </span>compileOnly project(':stub')<br />
<span style="white-space: pre;"> </span>}Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-16430617758976461732018-05-16T10:34:00.002-05:002018-08-13T16:13:34.904-05:00system app on Android O+1. push APK on /system/priv-app/<br />
2. APK needs to target SDK as device<br />
3. chomd +r XXX.apk<br />
4. create permission file on /etc/permissions/<br />
5. permission file name should be "<span style="background-color: white;"><span style="font-family: "monaco"; font-size: 14px;">privapp-permissions-PACKAGE_NAMW.xml</span>"</span><br />
<span style="background-color: white;">6. permission file content depends APK. Example:</span><br />
<span style="background-color: white;"><br /></span>
<br />
<permissions></permissions><br />
<privapp-permissions package="PACKAGE_NAME"></privapp-permissions><br />
<span style="background-color: white;"></span><br />
<permission name="android.permission.INTERNET"></permission><br />
<br />
<br />
<br />
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Monaco; color: #f4f4f4; background-color: #000000; background-color: rgba(0, 0, 0, 0.98)}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-47284389959437471442014-10-24T14:05:00.006-05:002014-10-24T14:05:59.626-05:00Run AOSP in Nexus devices<div class="p1">
1. Download AOSP </div>
<div class="p2">
<span class="s1">2. Download driver from <a href="https://developers.google.com/android/nexus/drivers"><span class="s2">Google's Nexus driver page</span></a></span>.</div>
<div class="p2">
3. unzip those drivers and put *.sh to root folder of AOSP</div>
<div class="p2">
4. run each *.sh. Should get extract files to ./vendor</div>
<div class="p2">
5.</div>
<pre class="prettyprint" style="background: rgb(247, 247, 247); border: 1px solid rgb(221, 221, 221); color: #006600; font-size: 13px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 1em;"><code style="line-height: 14px;"><span class="pln" style="color: black;">$ </span></code><span style="background-color: transparent;">source ./build/envsetup.sh</span></pre>
<div class="p2">
6. lunch. then choose flavor. (aosp_hammerhead-userdebug)</div>
<pre class="prettyprint" style="background: rgb(247, 247, 247); border: 1px solid rgb(221, 221, 221); color: #006600; font-size: 13px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 1em;"><code style="line-height: 14px;"><span class="pln" style="color: black;">$ </span></code><span style="background-color: transparent;">lunch</span></pre>
<div class="p2">
7. go to root folder of AOSP then make -j4</div>
<pre class="prettyprint" style="background: rgb(247, 247, 247); border: 1px solid rgb(221, 221, 221); color: #006600; font-size: 13px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 1em;"><code style="line-height: 14px;"><span class="pln" style="color: black;">$ make -j4</span></code></pre>
<div class="p2">
8. Device goes to ‘’fast boot” mode. </div>
<pre class="prettyprint" style="background: rgb(247, 247, 247); border: 1px solid rgb(221, 221, 221); color: #006600; font-size: 13px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 1em;"><code style="line-height: 14px;"><span class="pln" style="color: black;">$ </span></code><span style="background-color: transparent;">adb reboot bootloader</span></pre>
<div class="p3">
<span class="s2">9. Go to </span>./out/target/product/hammerhead</div>
<pre class="prettyprint" style="background: rgb(247, 247, 247); border: 1px solid rgb(221, 221, 221); color: #006600; font-size: 13px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 1em;"><code style="line-height: 14px;"><span class="pln" style="color: black;">$ cd ./</span></code><span style="background-color: transparent;">out/target/product/hammerhead</span></pre>
<br />
<div class="p3">
10. flash real devices</div>
<pre class="prettyprint" style="background: rgb(247, 247, 247); border: 1px solid rgb(221, 221, 221); color: #006600; font-size: 13px; line-height: 1.5; margin-bottom: 1em; overflow: auto; padding: 1em;"><code style="line-height: 14px;"><span class="pln" style="color: black;">$ fastboot </span><span class="pun" style="color: #666600;">-</span><span class="pln" style="color: black;">w flashall</span></code></pre>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-68016261627887430872014-09-25T17:14:00.003-05:002014-09-25T17:38:09.599-05:00AOSP Keys convert to Eclipse KeyStore<span style="background-color: white; color: #384739; font-family: 'Century Gothic', Arial, Helvetica, sans-serif; font-size: 14px;"> AOSP put keys in build/target/product/security </span><br />
<span style="background-color: white; color: #384739; font-family: 'Century Gothic', Arial, Helvetica, sans-serif; font-size: 14px;"><br /></span>
<span style="color: #384739; font-family: Century Gothic, Arial, Helvetica, sans-serif;"><span style="font-size: 14px;">testkey -- a generic key for packages that do not otherwise specify a key.</span></span><br />
<span style="color: #384739; font-family: Century Gothic, Arial, Helvetica, sans-serif;"><span style="font-size: 14px;">platform -- a test key for packages that are part of the core platform.</span></span><br />
<span style="color: #384739; font-family: Century Gothic, Arial, Helvetica, sans-serif;"><span style="font-size: 14px;">shared -- a test key for things that are shared in the home/contacts process.</span></span><br />
<span style="color: #384739; font-family: Century Gothic, Arial, Helvetica, sans-serif;"><span style="background-color: white; font-size: 14px;"></span></span><br />
<span style="color: #384739; font-family: Century Gothic, Arial, Helvetica, sans-serif;"><span style="font-size: 14px;">media -- a test key for packages that are part of the media/download system.</span></span><br />
<span style="color: #384739; font-family: Century Gothic, Arial, Helvetica, sans-serif;"><span style="font-size: 14px;"><br /></span></span>
<span style="color: #384739; font-family: Century Gothic, Arial, Helvetica, sans-serif;"><span style="font-size: 14px;">Example of "Platform"</span></span><br />
<div class="p1">
<div class="p1">
java<span class="s1">的</span>keystore(jks)<span class="s1">算是</span>pkcs12<span class="s1">的部分</span></div>
<div class="p1">
<span class="s1">但由於</span>jks<span class="s1">是</span>sun<span class="s1">的</span>proprietary<span class="s1">的</span>format</div>
<div class="p1">
<span class="s1">所以</span>openssl<span class="s1">沒法處理</span>jks <span class="s1">要先把他轉成</span>pkcs12<span class="s1">再用</span>keytool<span class="s1">來轉</span></div>
<br />
<div class="p2">
<span class="s2">首先要先把</span> private key (pkcs8) <span class="s2">從</span>DER format<span class="s2">轉成</span>PEM format</div>
</div>
<pre class="default prettyprint prettyprinted" style="background: rgb(238, 238, 238); border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.63636302947998px; line-height: 17.804800033569336px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><span style="font-family: Times; font-size: small; line-height: normal; white-space: normal;">#openssl pkcs8 -inform DER -nocrypt -in platform.pk8 -out platform.pem</span></pre>
<br />
<br />
<div class="p1">
<span class="s1">然後要把</span>private key <span class="s1">跟</span>public key <span class="s1">轉成</span>pkcs12. 輸入之後會跳出提示"輸入密碼"</div>
<div class="p2">
<pre class="default prettyprint prettyprinted" style="background: rgb(238, 238, 238); border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.63636302947998px; line-height: 17.804800033569336px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><span style="font-family: Times; font-size: small; line-height: normal; white-space: normal;">#openssl pkcs12 -export -in platform.x509.pem -inkey platform.pem -out platform.pkcs12</span></pre>
</div>
<div class="p2">
<span style="background-color: #eeeeee;">
</span>
<span style="background-color: #eeeeee;"></span><br />
<div class="p1">
<span class="s1"><br /></span></div>
<div class="p1">
<span class="s1">最後用</span>keytool<span class="s1">把他轉成</span>jks. 如不輸入 "srcstorepass"或"deststorepass" 輸入之後會跳出提示"輸入密碼"</div>
<pre class="default prettyprint prettyprinted" style="background: rgb(238, 238, 238); border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.63636302947998px; line-height: 17.804800033569336px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><span style="font-family: Times; font-size: small; line-height: normal; white-space: normal;">#keytool -importkeystore -srckeystore platform.pkcs12 -srcstoretype </span><span class="s1" style="font-family: Times; font-size: small; line-height: normal; white-space: normal;">pkcs12 </span><span style="font-family: Times; font-size: small; line-height: normal; white-space: normal;"> </span><span style="font-family: Times; font-size: small; line-height: normal; white-space: normal;"> -destkeystore platform.jks -deststoretype JKS </span><span style="font-family: Times; font-size: small; line-height: normal; white-space: normal;">[</span><span style="font-family: Times; font-size: small; line-height: normal; white-space: normal;">-srcstorepass </span><span style="font-family: Times; font-size: small; line-height: normal; white-space: normal;">PASSWORD </span><span style="font-family: Times; font-size: small; line-height: normal; white-space: normal;">-deststorepass PASSWORD]</span></pre>
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;"></span><br />
<span style="background-color: #eeeeee;"><span style="background-color: white; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 13.63636302947998px; line-height: 17.804800033569336px;">verify that the key has been added to the keystore.</span></span><br />
<pre class="default prettyprint prettyprinted" style="background: rgb(238, 238, 238); border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.63636302947998px; line-height: 17.804800033569336px; margin-bottom: 10px; max-height: 600px; overflow: auto; padding: 5px; vertical-align: baseline; width: auto; word-wrap: normal;"><code style="background-attachment: initial; background-clip: initial; background-image: initial; background-origin: initial; background-position: initial; background-repeat: initial; background-size: initial; border: 0px; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Courier New', monospace, serif; font-size: 13.63636302947998px; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;"><span class="pln" style="background: transparent; border: 0px; font-size: 13.63636302947998px; margin: 0px; padding: 0px; vertical-align: baseline;">#keytool </span><span class="pun" style="background: transparent; border: 0px; font-size: 13.63636302947998px; margin: 0px; padding: 0px; vertical-align: baseline;">-</span><span class="pln" style="background: transparent; border: 0px; font-size: 13.63636302947998px; margin: 0px; padding: 0px; vertical-align: baseline;">list </span><span class="pun" style="background: transparent; border: 0px; font-size: 13.63636302947998px; margin: 0px; padding: 0px; vertical-align: baseline;">-</span><span class="pln" style="background: transparent; border: 0px; font-size: 13.63636302947998px; margin: 0px; padding: 0px; vertical-align: baseline;">v </span><span class="pun" style="background: transparent; border: 0px; font-size: 13.63636302947998px; margin: 0px; padding: 0px; vertical-align: baseline;">-</span><span class="pln" style="background: transparent; border: 0px; font-size: 13.63636302947998px; margin: 0px; padding: 0px; vertical-align: baseline;">keystore </span><span class="pun" style="background: transparent; border: 0px; font-size: 13.63636302947998px; margin: 0px; padding: 0px; vertical-align: baseline;">.</span><span class="pln" style="background: transparent; border: 0px; font-size: 13.63636302947998px; margin: 0px; padding: 0px; vertical-align: baseline;">keystore</span></code></pre>
<span style="background-color: #eeeeee;"><br /></span>
<span style="background-color: #eeeeee;"><br /></span><br />
ref: <a href="http://allstarschh.blogspot.com/2009/08/blog-post.html">ALLSTART's BLOG</a></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-61531834337939014032014-08-27T15:20:00.004-05:002014-10-02T16:10:17.816-05:00Android setting file<br />
Android launch by default app<br />
<div class="p1">
/data/system/users/0/package-restrictions.xml<br />
<br />
Map Uid and permission<br />
<br />
<div class="p1">
/data/system/package.xml</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-67961479494361872492014-05-08T12:30:00.003-05:002014-05-08T12:30:30.737-05:00Android partition backupPartition info can be found in "/dev/block/...". But it is not readable, most of devices have readable info in "/dev/block/platform/msm_sdcc.1/by-name".<br />
<br />
Backup:<br />
dd if=/dev/block/platform/msm_sdcc.1/by-name/recovery of=/sdcard/Backup/recovery-backup.img<br />
<br />
Restore:<br />
dd if=/dev/zero of=/dev/block/platform/msm_sdcc.1/by-name/recovery<br />
dd if=/sdcard/Backup/recovery-backup.img of=/dev/block/platform/msm_sdcc.1/by-name/recoveryUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-16775010308164592572014-03-27T16:27:00.005-05:002014-03-27T16:27:55.428-05:00Compile APK with static java lib or java lib in AOSP 1. Create a folder("Myproject") under ANDROID_ROOT/packages/apps/<br />
2. Before compile APK. Make sure compile all reference library first.<br />
3.1 Part of make file example with local_java_library<br />
<br />
LOCAL_JAVA_LIBRARIES := com.sample.mylocallib<br />
<br />
3.2 Part of make file example with local_static_java_library<br />
<br />
LOCAL_STATIC_JAVA_LIBRARIES := com.sample.mystaticlib<br /> LOCAL_PROGUARD_ENABLED := disabled<br />
<br />
4. Proguard will remove unreferenced code by default. So if APK want keep all code, it may need to set proguard disabled. Or enable proguard and keep class in proguard setting<br />
<br />
Make file example:<br /> LOCAL_PROGUARD_ENABLED := custom<br />
LOCAL_PROGUARD_FLAG_FILES := proguard.flags<br />
<br />
proguard.flags example:<br />
-keep class com.sample.mystaticlib.** { *; }<br />
-keep interface com.sample.mystaticlib.interface.** { *; }<br />
<br />
5. If get error "can't find xxxx/classes.jar" when compile APK. It may add classpath in make file<br />
<br />
Make file example:<br />
LOCAL_CLASSPATH := out/target/common/obj/JAVA_LIBRARIES/libmyinterface_intermediates/classes.jarUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-88986309375119315032014-03-27T16:03:00.003-05:002014-03-27T16:05:31.238-05:00create static JAVA lib jar for other APK referencestatic_java_library 和 java_library不同點:<br />
1. java_library 編譯完會output到 ANDROID_ROOT/out/target/product/generic/system/framework,而static_java_library不會。<br />
2. 當APK reference到java_library時,不會把jar source編譯進APK。但是static_java_library會編譯進去, 所以執行該APK的機器不需要有static_java_library存在。<br />
3. 編譯兩種library的方法一樣,只差在make file<br />
<br />
Make file example:<br />
<br />
ifneq ($(TARGET_BUILD_JAVA_SUPPORT_LEVEL),)<br />
LOCAL_PATH := $(call my-dir)<br />
# the library<br />
# ============================================================<br />
include $(CLEAR_VARS)<br />
LOCAL_SRC_FILES := $(call all-subdir-java-files)<br />
LOCAL_MODULE_TAGS := optional<br />
# This is the target being built.<br />
LOCAL_MODULE:= com.mylib.staticlibrary<br />
include $(BUILD_STATIC_JAVA_LIBRARY)<br />
<div>
# the documentation<br />
# ============================================================<br />
include $(CLEAR_VARS)<br />
LOCAL_SRC_FILES := $(call all-subdir-java-files) $(call all-subdir-html-files)<br />
LOCAL_MODULE:= mystaticlibraryDoc<br />
LOCAL_DROIDDOC_OPTIONS := com.mylib.staticlibrary<br />
LOCAL_MODULE_CLASS := JAVA_LIBRARIES<br />
LOCAL_DROIDDOC_USE_STANDARD_DOCLET := true<br />
include $(BUILD_DROIDDOC)<br />
endif # JAVA_SUPPORT</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-5777071376578045732014-03-14T16:23:00.002-05:002014-03-27T15:49:53.745-05:00custom JAVA library JAR in Android devicesUse custom library JAR in Android devices(Kitkat)<br />
1. Create "MySystemLib"folder under AOSP_ROOT/device/sample/frameworks/MySystemLib<br />
2. Put JAR source code in AOSP_ROOT/device/sample/frameworks//MySystemLib<br />
Should include forder "java", Android.mk, com.my.internal.lib.xml<br />
<br />
Android.mk:<br />
ifneq ($(TARGET_BUILD_JAVA_SUPPORT_LEVEL),)<br />
LOCAL_PATH := $(call my-dir)<br />
include $(CLEAR_VARS)<br />
LOCAL_SRC_FILES := \<br />
$(call all-subdir-java-files)<br />
LOCAL_MODULE_TAGS := optional<br />
# This is the target being built.<br />
LOCAL_MODULE:= com.my.internal.lib<br />
include $(BUILD_JAVA_LIBRARY)<br />
include $(CLEAR_VARS)<br />
LOCAL_SRC_FILES := $(call all-subdir-java-files) $(call all-subdir-html-files)<br />
LOCAL_MODULE:= LauncherFacadeInterface<br />
LOCAL_DROIDDOC_OPTIONS := com.sprint.internal.idinterface<br />
LOCAL_MODULE_CLASS := JAVA_LIBRARIES<br />
LOCAL_DROIDDOC_USE_STANDARD_DOCLET := true<br />
include $(BUILD_DROIDDOC)<br />
endif # JAVA_SUPPORT<br />
<br />
3. "make com.my.internal.lib" or "mm -B"<br />
4. com.my.internal.lib.jar is generated in 'out/target/product/generic/system/framework'<br />
5. Put com.my.internal.lib.jar in /system/framework in android devices<br />
6. Put com.my.internal.lib.xml in /system/framework/etc/permission in android devices<br />
7. Reboot device to refresh system lib<br />
8. Declare lib in manifest.xml<br />
<uses-library p="">
</uses-library><br />
<div class="p2">
<span class="s1"> </span><span class="s2">android:name</span><span class="s3">=</span>"com.my.internal.lib"</div>
<div class="p3">
<span class="s1"> </span><span class="s1"> </span><span class="s5">/></span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-30732791971720317052014-03-07T15:42:00.004-06:002014-03-20T13:15:45.049-05:00ClassLoader in AndroidPathClassLoader:<br />
Load class from Android system. So those classes have to be registered in system. They may be a installable APK. And the class(dex files) would storage in /data/dalvik-cache<br />
<br />
<br />
<div class="p1">
<span class="s1"> <span style="background-color: #cccccc;"> </span><span style="background-color: white;">String</span></span><span style="background-color: white;"><span class="s2"> </span><span class="s3">packageName</span><span class="s2"> </span><span class="s4">=</span><span class="s2"> </span>"com.android.calculator2"<span class="s4">;</span></span></div>
<div class="p1">
<span style="background-color: white;"><span class="s2"> </span><span class="s1">String</span><span class="s2"> </span><span class="s3">className</span><span class="s2"> </span><span class="s4">=</span><span class="s2"> </span>"com.android.calculator.sample.class"<span class="s4">;</span></span></div>
<div class="p2">
<span style="background-color: white;"><br /></span></div>
<div class="p3">
<span style="background-color: white;"><span class="s2"> </span><span class="s1">String</span><span class="s2"> </span>apkSourcePath<span class="s4">;</span></span></div>
<div class="p5">
<span style="background-color: white;"><span class="s2"> </span><span class="s3">apkSourcePath</span><span class="s2"> </span><span class="s4">=</span>getPackageManager<span class="s6">()</span><span class="s4">.</span>getApplicationInfo<span class="s6">(</span><span class="s3">packageName</span><span class="s4">,</span><span class="s2"> </span><span class="s7">0</span><span class="s6">)</span><span class="s4">.</span><span class="s8">sourceDir</span><span class="s4">;</span></span></div>
<div class="p2">
<span style="background-color: white;"><br /></span></div>
<div class="p4">
<span style="background-color: white;"> <span class="s1">PathClassLoader</span> <span class="s3">pathClassLoader</span> <span class="s4">=</span> <span class="s5">new</span> dalvik<span class="s4">.</span>system<span class="s4">.</span><span class="s9">PathClassLoader</span><span class="s6">(</span><span class="s3">apkSourcePath</span><span class="s4">,</span></span></div>
<div class="p4">
<span style="background-color: white;"> <span class="s1">ClassLoader</span><span class="s4">.</span><span class="s10">getSystemClassLoader</span><span class="s6">())</span><span class="s4">;</span></span></div>
<div class="p6">
<span style="background-color: white;"><span class="s2"> </span><span class="s1">Class</span><span class="s4"></span><span class="s2"> </span>clazz<span class="s2"> </span><span class="s4">=</span><span class="s2"> </span>pathClassLoader<span class="s4">.</span><span class="s9">loadClass</span><span class="s6">(</span>className<span class="s6">)</span><span class="s4">;</span></span></div>
<div class="p4">
<span style="background-color: white;"> <span class="s1">Method</span><span class="s6">[]</span> <span class="s3">methods</span> <span class="s4">=</span> <span class="s3">clazz</span><span class="s4">.</span><span class="s9">getMethods</span><span class="s6">()</span><span class="s4">;</span></span></div>
<div class="p4">
<span style="background-color: white;"> <span class="s5">for</span> <span class="s6">(</span><span class="s1">Method</span> <span class="s3">m</span> <span class="s4">:</span> <span class="s3">methods</span><span class="s6">)</span> <span class="s6">{</span></span></div>
<div class="p4">
<span style="background-color: white;"> L<span class="s11">og</span><span class="s4">.</span>i("",<span class="s12">"method name:"</span> <span class="s4">+</span> <span class="s3">m</span><span class="s4">.</span><span class="s9">getName</span><span class="s6">())</span><span class="s4">;</span></span></div>
<span style="background-color: white;"> }</span><br />
<br />
<br />
<div class="p1">
DexClassLoader:</div>
<div class="p1">
Load class from jar, apk file. Those file is stored in accessible storage, such as internal storage or sd card. When class loader loads jar file, it will generate dex file. Then load class from dex file.<br />
<br />
Example:<br />
Put <span style="background-color: white;">com.android.calculator.</span>jar in /data/data/MY_APP_PACKAGE/files </div>
<div class="p1">
<br /></div>
<div class="p1">
<span class="s1"> </span><span style="background-color: white;"><span class="s2">File</span><span class="s1"> </span><span class="s3">jarFile</span><span class="s1"> </span><span class="s4">=</span><span class="s1"> </span><span class="s5">new</span><span class="s1"> </span>File<span class="s6">(</span>getFilesDir<span class="s6">()</span><span class="s4">.</span>getAbsoluteFile<span class="s6">()</span><span class="s1"> </span><span class="s4">+</span><span class="s1"> </span><span class="s2">File</span><span class="s4">.</span><span class="s7">separator</span></span></div>
<div class="p2">
<span style="background-color: white;"><span class="s1"> </span><span class="s4">+</span><span class="s1"> </span>"com.android.calculator.jar"<span class="s6">)</span><span class="s4">;</span></span></div>
<div class="p3">
<span style="background-color: white;"><span class="s1"> </span><span class="s5">final</span><span class="s1"> </span><span class="s2">File</span><span class="s1"> </span>optimizedDexOutputPath<span class="s1"> </span><span class="s4">=</span><span class="s8">getDir</span><span class="s6">(</span><span class="s9">"outdex"</span><span class="s4">,</span><span class="s1"> </span><span class="s2">Context</span><span class="s4">.</span><span class="s7">MODE_PRIVATE</span><span class="s6">)</span><span class="s4">;</span></span></div>
<div class="p4">
<span style="background-color: white;"> <span class="s2">DexClassLoader</span><span class="s1"> </span><span class="s3">dexClassLoader</span><span class="s1"> </span><span class="s4">=</span><span class="s1"> </span><span class="s5">new</span><span class="s1"> </span>DexClassLoader<span class="s6">(</span><span class="s3">jarFile</span><span class="s4">.</span>getAbsolutePath<span class="s6">()</span><span class="s4">,</span></span></div>
<div class="p3">
<span style="background-color: white;"><span class="s1"> </span>optimizedDexOutputPath<span class="s4">.</span><span class="s8">getAbsolutePath</span><span class="s6">()</span><span class="s4">,</span></span></div>
<div class="p4">
<span style="background-color: white;"> <span class="s5">null</span><span class="s4">,</span></span></div>
<div class="p4">
<span style="background-color: white;"> <span class="s2">ClassLoader</span><span class="s4">.</span><span class="s12">getSystemClassLoader</span><span class="s6">())</span><span class="s4">;</span></span></div>
<div class="p2">
<span style="background-color: white;"><span class="s1"> </span><span class="s2">Class</span><span class="s4"></span><span class="s1"> </span><span class="s3">clazz</span><span class="s1"> </span><span class="s4">=</span><span class="s1"> </span><span class="s3">dexClassLoader</span><span class="s4">.</span><span class="s8">loadClass</span><span class="s6">(</span>"com.android.calculator.sample.class"<span class="s6">)</span><span class="s4">;</span></span></div>
<div class="p2">
<span style="background-color: white;"><span class="s1"> </span><span class="s2">Method</span><span class="s6">[]</span> <span class="s3">methods</span> <span class="s4">=</span> <span class="s3">clazz</span><span class="s4">.</span><span class="s8">getMethods</span><span class="s6">()</span><span class="s4">;</span></span></div>
<div class="p4">
<span style="background-color: white;"> <span class="s5">for</span> <span class="s6">(</span><span class="s2">Method</span> <span class="s3">m</span> <span class="s4">:</span> <span class="s3">methods</span><span class="s6">)</span> <span class="s6">{</span></span></div>
<div class="p4">
<span style="background-color: white;"> L<span class="s11">og</span><span class="s4">.</span>i("",<span class="s12">"method name:"</span> <span class="s4">+</span> <span class="s3">m</span><span class="s4">.</span><span class="s9">getName</span><span class="s6">())</span><span class="s4">;</span></span></div>
<div class="p4">
<span style="background-color: white;"> <span class="s6">}</span></span></div>
<div class="p7">
<span style="background-color: white;"><span class="s1"> </span>Constructor<span class="s4"></span><span class="s1"> </span><span class="s3">constructor</span><span class="s1"> </span><span class="s4">=</span><span class="s1"> </span><span class="s3">clazz</span><span class="s4">.</span><span class="s8">getConstructor</span><span class="s6">(</span>Context<span class="s4">.</span><span class="s5">class</span><span class="s6">)</span><span class="s4">;</span></span></div>
<div class="p2">
<span style="background-color: white;"><span class="s1"> </span><span class="s2">Object</span><span class="s1"> </span>instance<span class="s1"> </span><span class="s4">=</span><span class="s1"> </span>constructor<span class="s4">.</span><span class="s8">newInstance</span><span class="s6">(</span><span class="s6">)</span><span class="s4">;</span></span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-11778259824026119122014-01-15T12:12:00.002-06:002014-01-15T12:12:55.227-06:00Start Service return type<div class="p1">
<span class="s1"><b>START_NOT_STICKY</b></span></div>
<div class="p2">
<span class="s1">啟動之後,如果service被kill by system,service不會自動啟動,也不會自動重新傳入intent. 除非開發者有程式呼叫startService(intent)</span></div>
<div class="p3">
<span class="s1"></span><br /></div>
<div class="p1">
<span class="s1"> <b>START_REDELIVER_INTENT</b></span></div>
<div class="p2">
<span class="s1">啟動之後,如果service被kill by system,service會自動啟動,也會自動重新傳入最後一個intent.</span></div>
<div class="p3">
<span class="s1"></span><br /></div>
<div class="p1">
<span class="s1"><b>START_STICKY</b></span></div>
<div class="p2">
<span class="s1">啟動之後,如果service被kill by system,service會自動啟動,但不會自動重新傳入intent. 如果再kill期間,開發者有程式呼叫startService(intent), 才會傳入intent.</span></div>
<div class="p3">
<span class="s1"></span><br /></div>
<div class="p1">
<span class="s1"><b>START_STICKY_COMPATIBILITY</b></span></div>
<br />
<div class="p2">
<span class="s1">啟動之後,如果service被kill by system,service不一定會自動啟動, 如果啟動的話,模式與START_STICKY一樣。</span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-29169222386806107412013-09-23T11:42:00.001-05:002014-03-10T16:59:15.296-05:00Decompile APK1. Change .APK to .ZIP and unzip it. There is classes.dex in the folder.<br />
2. Download <span style="background-color: white; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">dex2jar(</span><a href="http://code.google.com/p/dex2jar/" style="background-color: white; border: 0px; color: #4a6b82; cursor: pointer; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px; margin: 0px; padding: 0px; text-decoration: none; vertical-align: baseline;">http://code.google.com/p/dex2jar/</a><span style="background-color: white; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">) to convert classes.dex to classes.</span><br />
<span style="background-color: white; font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"> </span><span style="font-family: Arial, Liberation Sans, DejaVu Sans, sans-serif;"><span style="font-size: 14px; line-height: 18px;">. dex2jar.sh PATH_TO_CLASSES_DEX/classes.dex</span></span><br />
<span style="font-family: Arial, Liberation Sans, DejaVu Sans, sans-serif;"><span style="font-size: 14px; line-height: 18px;"> </span></span><br />
<span style="font-family: Arial, Liberation Sans, DejaVu Sans, sans-serif;"><span style="font-size: 14px; line-height: 18px;"> The command should generate classes_dex2jar.jar</span></span><br />
<span style="font-family: Arial, Liberation Sans, DejaVu Sans, sans-serif;"><span style="font-size: 14px; line-height: 18px;">3. Download </span></span>jdgui<span style="font-family: Arial, Liberation Sans, DejaVu Sans, sans-serif;"><span style="font-size: 14px; line-height: 18px;">(http://mac.softpedia.com/dyn-postdownload.php?p=48710&t=4&i=1</span></span><span style="font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">) to unzip jar file.</span><br />
<span style="font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"> Open jdgui and choose classes_dex2.jar.jar. All folder and java file should be browsed in JDGUI. </span><br />
<span style="font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"> Save all source.</span><br />
<span style="font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;"><br /></span>
<span style="font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">4. Download android-apktool(</span><span style="font-family: Arial, Liberation Sans, DejaVu Sans, sans-serif;"><span style="font-size: 14px; line-height: 18px;">https://code.google.com/p/android-apktool/downloads/list</span></span><span style="font-family: Arial, 'Liberation Sans', 'DejaVu Sans', sans-serif; font-size: 14px; line-height: 18px;">). Choose "</span><a href="https://code.google.com/p/android-apktool/downloads/detail?name=apktool1.5.2.tar.bz2&can=2&q=" style="color: purple; font-family: arial, sans-serif; font-size: 13px; white-space: nowrap;">apktool1.5.2.tar.bz2</a>" and "<a href="https://code.google.com/p/android-apktool/downloads/detail?name=apktool-install-macosx-r05-ibot.tar.bz2&can=2&q=" style="color: purple; font-family: arial, sans-serif; font-size: 13px; white-space: nowrap;">apktool-install-macosx-r05-ibot.tar.bz2</a>"(This depends on platform).<br />
. apktool d PATH_TO_APK/xxx.apk<br />
All resource and xml file are generated in APK_NAME folder<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-49562191780795085282013-06-14T15:06:00.003-05:002013-06-14T15:36:21.182-05:00Compile Android AppsCommand<br />
1. make: compile all Android system<br />
2. make [package name]: the package name can be found in packages/apps/xx/Android.mk<br />
or<br />
mmm packages/apps/Package_name<br />
The APK and odex will generate in out/target/product/generic/system/app/xxx.apk<br />
<br />
3. make snod: this command will regenerate system.img<br />
4. Remove default sign key<br />
<br />
<div class="p1">
<span class="s1">zip</span> –d xxx.apk <launcher apk="" filename="">META-INF/*</launcher></div>
<br />
Put 3rd apk into system.img<br />
1. put apk into out/target/product/generic/system/app/<br />
2. make snod<br />
<br />
<br />Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-29709541869951199972013-05-28T12:45:00.000-05:002016-02-12T16:35:59.256-06:00Run GCM demo by app engine server<b><span style="font-family: "times" , "times new roman" , serif;">GCM api</span></b><br />
<span style="font-family: "times" , "times new roman" , serif;">1. Create google api project about GCM</span><br />
<span style="font-family: "times" , "times new roman" , serif;">2. Create server key. This api key will be used fot setting up server application.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br /></span>
<b><span style="font-family: "times" , "times new roman" , serif;">Create App Engine project</span></b><br />
<span style="font-family: "times" , "times new roman" , serif;">1. Apply one project in app engine. Input project name and project url name.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"> Peoject url name will be used in Android application.</span><br />
<span style="font-family: "times" , "times new roman" , serif;">2. Download App engine SDK for JAVA</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><br /></span>
<span style="font-family: "times" , "times new roman" , serif;"> </span><br />
<b><span style="font-family: "times" , "times new roman" , serif;">Set up Server Application</span></b><br />
<span style="font-family: "times" , "times new roman" , serif;">1. Android <span style="background-color: #f9f9f9; color: #222222; line-height: 19px;">SDK Manager, install </span><strong style="background-color: #f9f9f9; color: #222222; line-height: 19px;">Extras > Google Cloud Messaging for Android Library</strong><span style="background-color: #f9f9f9; color: #222222; line-height: 19px;">.</span></span><br />
<span style="font-family: "times" , "times new roman" , serif;"><span style="background-color: #f9f9f9; color: #222222; font-family: "times" , "times new roman" , serif; line-height: 19px;">2. </span><span style="background-color: #f9f9f9; color: #222222; font-family: "times" , "times new roman" , serif; line-height: 19px;">In a text editor, edit </span><span style="color: #38761d; font-family: "times" , "times new roman" , serif;"><span style="background-color: #f9f9f9; font-family: Georgia, Times New Roman, serif; line-height: 19px;">PATH_TO_ANDOIRD_SDK/</span></span></span><span style="color: #38761d;"><span style="font-family: Georgia, Times New Roman, serif;">extras/google/gcm</span><span style="font-family: Arial, Helvetica, sans-serif;">/<code style="background-color: #f9f9f9; line-height: 14px;">samples/gcm-demo-appengine/src/com/google/android/gcm/demo/server/ApiKeyInitializer.java</code></span></span><span style="background-color: #f9f9f9; color: #222222; font-family: "times" , "times new roman" , serif; line-height: 19px;"> and replace the existing text with the API key obtained above.</span><br />
<span style="font-family: "times" , "times new roman" , serif;"><span style="background-color: #f9f9f9; color: #222222; line-height: 19px;">3. </span><span style="background-color: #f9f9f9; color: #222222; line-height: 19px;">In a shell window, go to the </span><span style="color: #38761d;"><span style="background-color: #f9f9f9; line-height: 19px;">PATH_TO_ANDOIRD_SDK/extras/google/gcm/</span><code style="background-color: #f9f9f9; line-height: 14px;">samples/gcm-demo-appengine</code></span><span style="background-color: #f9f9f9; color: #222222; line-height: 19px;"> </span><span style="background-color: #f9f9f9; color: #222222; line-height: 19px;">directory.</span></span><br />
<span style="color: #222222; font-family: "times" , "times new roman" , serif;"><span style="line-height: 19px;"><span style="color: #222222;">4. ant -Dsdk.dir=</span><span style="color: #38761d;">PATH_APP_ENGINE_SDK/</span><span style="color: #222222;">appengine-java-sdk-1.8.0/ compile</span></span></span><br />
<div>
<span style="font-family: "times" , "times new roman" , serif;"> It will generate WebContent/. The code will be upload to App engine, so we don't need to launch server in our local side.</span></div>
<div>
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div>
<b><span style="font-family: "times" , "times new roman" , serif;">Upload Server Application to App Engine</span></b></div>
<div>
<span style="font-family: "times" , "times new roman" , serif;">1. From the appengine-java-sdk directory, run:</span></div>
<div>
<span style="font-family: "times" , "times new roman" , serif;"> bin\appcfg.cmd update </span><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"><span style="background-color: #f9f9f9; color: #38761d; line-height: 19px;">PATH_TO_ANDOIRD_SDK</span><span style="font-family: times, 'times new roman', serif;"><span style="color: #38761d;">/extras/google/gcm/samples/gcm-demo-appengine/WebContent/</span></span></span></div>
<div>
<span style="font-family: "times" , "times new roman" , serif;">2. Open http://<project-name>appspot.com </project-name></span></div>
<div>
<span style="font-family: "times" , "times new roman" , serif;">3. It should show "no devices registered" page.</span></div>
<div>
<span style="font-family: "times" , "times new roman" , serif;"><br /></span></div>
<div>
<span style="font-family: "times" , "times new roman" , serif;">Set up Android Application</span></div>
<ol style="background-color: #f9f9f9; color: #222222; line-height: 19px; margin: 0px 0px 15px 18px; padding: 0px;">
<li style="margin: 0px 0px 5px;"><span style="font-family: "times" , "times new roman" , serif;"><span style="font-family: times, times new roman, serif;">Using a text editor, open </span><code style="color: #006600; line-height: 14px;"><span style="font-family: Georgia, Times New Roman, serif;"><span style="color: #38761d; line-height: 19px;">PATH_TO_ANDOIRD_SDK</span><span style="color: black; line-height: normal;"><span style="color: #38761d;">/extras/google/gcm/</span></span>samples/gcm-demo-client/src/com/google/android/gcm/demo/app/CommonUtilities.java</span></code><span style="font-family: Helvetica Neue, Arial, Helvetica, sans-serif;"> </span></span><span style="font-family: "times" , "times new roman" , serif;">and set the proper values for the <code style="color: #006600; line-height: 14px;">SENDER_ID</code> and <code style="color: #006600; line-height: 14px;">SERVER_URL</code> constants.</span></li>
<li style="margin: 0px 0px 5px;"><span style="font-family: "times" , "times new roman" , serif;">In a shell window, go to the <code style="color: #006600; line-height: 14px;">gcm-demo-client</code> directory.</span></li>
<li style="margin: 0px 0px 5px;"><span style="font-family: "times" , "times new roman" , serif;">Use the SDK's <code style="color: #006600; line-height: 14px;">android</code> tool to generate the <code style="color: #006600; line-height: 14px;">ant</code> build files:</span></li>
<li style="margin: 0px 0px 5px;"><pre class="prettyprint" style="background-color: #f7f7f7; border: 1px solid rgb(221, 221, 221); color: #006600; margin-bottom: 1em; overflow: auto; padding: 1em;"><span style="font-family: "times" , "times new roman" , serif;"><span class="pln" style="color: black;">android update project </span><span class="pun" style="color: #666600;">--</span><span class="pln" style="color: black;">name </span><span class="typ" style="color: #660066;">GCMDemo</span><span class="pln" style="color: black;"> </span><span class="pun" style="color: #666600;">-</span><span class="pln" style="color: black;">p </span><span class="pun" style="color: #666600;">.</span><span class="pln" style="color: black;"> </span><span class="pun" style="color: #666600;">--</span><span class="pln" style="color: black;">target android</span><span class="pun" style="color: #666600;">-</span><span class="lit" style="color: #006666;">16</span></span></pre>
</li>
</ol>
<div>
<span style="font-family: "times" , "times new roman" , serif;">4. <span style="background-color: #f7f7f7; line-height: 19px;">ant clean debug</span></span></div>
<div>
<span style="background-color: #f7f7f7; line-height: 19px;"><span style="font-family: "times" , "times new roman" , serif;">5. It will generate </span></span><span style="font-family: "times" , "times new roman" , serif;"><span style="line-height: 19px;">GCMDemo-debug.apk in bin/ folder</span></span></div>
<div>
<span style="font-family: "times" , "times new roman" , serif;"><span style="line-height: 19px;">6. Install APK in devices.</span></span></div>
<div>
<span style="font-family: "times" , "times new roman" , serif;"><span style="line-height: 19px;">7. Done.</span></span></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-54090417836162469102012-06-26T15:43:00.001-05:002012-06-26T15:43:24.303-05:00Git ignore<br />
<ol style="background-color: white; border: 0px; color: #333333; font-family: Georgia, 'Bitstream Charter', serif; font-size: 16px; line-height: 24px; list-style-image: initial; list-style-position: initial; margin: 0px 0px 24px 1.5em; padding: 0px; vertical-align: baseline;">
<li style="background-color: transparent; background-position: initial initial; background-repeat: initial initial; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Keep your .gitignore file.</li>
<li style="background-color: transparent; background-position: initial initial; background-repeat: initial initial; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Clear your GIT cache. Don’t worry, this won’t delete any of your local files, just what GIT is tracking.<br /><code style="background-color: transparent; background-position: initial initial; background-repeat: initial initial; border: 0px; font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; font-size: 13px; margin: 0px; padding: 0px; vertical-align: baseline;">git rm -r --cached .</code></li>
<li style="background-color: transparent; background-position: initial initial; background-repeat: initial initial; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Add everything in your project. Your .gitignore file will exclude what you want to ignore now and start tracking the good stuff.<br /><code style="background-color: transparent; background-position: initial initial; background-repeat: initial initial; border: 0px; font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; font-size: 13px; margin: 0px; padding: 0px; vertical-align: baseline;">git add .</code></li>
<li style="background-color: transparent; background-position: initial initial; background-repeat: initial initial; border: 0px; margin: 0px; padding: 0px; vertical-align: baseline;">Commit your changes.<br /><code style="background-color: transparent; background-position: initial initial; background-repeat: initial initial; border: 0px; font-family: Monaco, Consolas, 'Andale Mono', 'DejaVu Sans Mono', monospace; font-size: 13px; margin: 0px; padding: 0px; vertical-align: baseline;">git commit -m "Now my .gitignore file works correctly!"</code></li>
</ol>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-29636794126096036862012-04-03T10:41:00.004-05:002014-02-27T16:14:06.884-06:00compile Android AppsCommand<br />
1. make: compile all Android system<br />
2. make [package name]: the package name can be found in packages/apps/xx/Android.mk<br />
or<br />
mmm packages/apps/Package_name<br />
The APK and odex will generate in out/target/product/generic/system/app/xxx.apk<br />
3. make snod: this command will regenerate system.img<br />
<br />
Put 3rd apk into system.img<br />
1. put apk into out/target/product/generic/system/app/<br />
2. make snod<br />
or<br />
1. mkdir packages/apps/MyApp<br />
2. vi Android.mk<br />
LOCAL_PATH:=$(call my-dir)<br />
include $(CLEAR_VARS)<br />
LOCAL_POST_PROCESS_COMMAND:=$(shell cp -r $(LOCAL_PATH)/*.apk $TARGET_OUT)/app/)<br />
3. make<br />
<br />
<br />
Generate AIDL stub<br />
1. make: compile all Android system<br />
2. All system AIDL will convert java code in android_source/out/target/common/obj/JAVA_LIBRARIES/.....Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-59570027794919901892012-02-17T12:28:00.001-06:002012-02-17T12:30:55.718-06:00gimapuse telnet to connect gimap.<br />1. openssl s_client -crlf -connect imap.gmail.com:993<br />2. . login xxx@gmail.com PASSWORD<br />3. . list "" "*"<br />4. use other command. such as close, store, create, delete....Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-42278585771018442272012-01-16T18:14:00.000-06:002012-01-16T18:18:15.068-06:00Git- Can't locate Error.pm : on Mac OS Xinstall Git on Mac. When I put "git add -i", then show "Can't locate Error.pm in @INC ....."<br /><br />I found the answer on internet as below<a href="http://tamsler.blogspot.com/">Tamsler</a>:<br /><br /> sudo perl -MCPAN -e 'install Error'Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-79504326626365441982011-12-20T12:03:00.000-06:002012-01-16T18:18:56.725-06:00Add external lib in Android.mk1. add LOCAL_STATIC_JAVA_LIBRARIES += jar'sFileName . This line must be added above "include $(BUILD_PACKAGE)"<br /><br />2. add LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := pathtoyourlib.jar This line must be added after "include $(BUILD_PACKAGE)"<br /><br />3. add include $(BUILD_MULTI_PREBUILT)<br /><br /><br />then compile itUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-76180112716490878622011-11-16T17:35:00.000-06:002013-02-01T15:46:27.711-06:00android remove preload appget root permission<br />
<br />
check which is target APK<br />
pm path com.xxx.packagename<br />
<br />
remount partition to let permission to be read/write<br />
mount -o remount,rw -t yaffs2 /dev/block/mtdblk3 /system<br />
<br />
we need get partition info from <br />
cat /proc/mountsUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-44825277802125014282011-11-14T15:20:00.000-06:002012-01-16T18:14:52.228-06:00android keycodeutf area code <br />android/external/icu4c/data/unidata/Blocks.txtUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-74546097127539983292011-10-28T13:56:00.000-05:002012-01-25T23:47:31.578-06:00access UI threadSome ways to access ui thread from other thread<br /><br />1.Activity.runOnUiThread(Runnable)<br />2.View.post(Runnable)<br />3.View.postDelayed(Runnable, long)<br />4.Handler<br /> when start service, we can use handler+message to access UI thread. Create a Handler in UI thread, and register this Handler in service. Send message to Handler in service, so we can access UI thread by Handler.<br /><br />5.AsyncTask<br /><br />Make sure that you access the Android UI toolkit only on the UI thread. 另外service也是run在UI thread之中,所以可以access UI.<br /><br />service life cycle<br />1. if start service by Context.startService().<br /> onCreate()->onStartCommand()->onDestroy(). 直到呼叫Context.stopService or stopSelf(). 如果多次呼叫startService. 只要呼叫一次stopService, 則所有呼叫的service都會停止。但service所create的thread不會停止,記得要在onDestroy中停止自己create的thread。<br /><br />2. if start service by Context.bindService()<br /> onCreate()(只有第一次啟動該service時才會呼叫)-> onDestroy()Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-16803043793657446692011-10-13T11:14:00.001-05:002013-03-28T16:52:31.833-05:00Android Logmain log $adb shell logcat -b main -v threadtime<br />
system log $ adb shell logcat -b system -d *:i<br />
kernel log $ adb shell dmesg (or adb shell cat /proc/kmsg)<br />
<br />
<br />
system app<br />
/system/app<br />
user app(internal storage)<br />
/data/app<br />
user app(external)<br />
/mnt/asec<br />
/mnt/secure/asec<br />
<br />
set system log level per application<br />
<br />
<div class="p1">
adb shell setprop log.tag.XXXX VERBOSE</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-8542674354572922589.post-33877884321312679332011-09-06T13:53:00.011-05:002013-06-13T12:51:45.035-05:00complie Android source to emulator依照android source的指示, 但安裝所需套件時, 參考以下套件<br />
Ubuntu Linux (32-bit x86):<br />
sudo apt-get install git-core gnupg sun-java5-jdk flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl libncurses5-dev zlib1g-dev<br />
<br />
Ubuntu Linux (64-bit x86):<br />
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl sun-java5-jdk zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev<br />
<br />
java5 is for Froyo, java6 is for gingerbread<br />
complie完之後,if we want to run emulator. 在environment path中加上"ANDROID_PRODUCT_OUT=target/product/generic"<br />
and exec "./out/host/linux-x86/bin/emulator"<br />
<br />
if use gcc4.6 to compile Donut, also need to change some things.reference <a href="http://endroid.blogspot.com/2011/07/android-development-notes.html">Here</a><br />
change ./frameworks/base/libs/utils/Android.mk<br />
from<br />
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS)<br />
to<br />
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive<br />
<br />
change ./development/emulator/qtools/Android.mk<br />
from<br />
common_cflags := -O0 -g<br />
to<br />
common_cflags := -O0 -g -Wwrite-strings -fpermissive<br />
<br />
Change ./frameworks/base/tools/localize/Android.mk<br />
from<br />
LOCAL_LDLIBS += -lrt<br />
to<br />
LOCAL_LDLIBS += -lrt -lpthread<br />
<br />
change frameworks/base/tools/appt/Android.mk<br />
from<br />
LOCAL_LDLIBS += -lrt<br />
to<br />
LOCAL_LDLIBS += -lrt -lpthread<br />
<br />
host C++: obbtool <= frameworks/base/tools/obbtool/Main.cpp :0:0: error: "_FORTIFY_SOURCE" redefined [-Werror] :0:0: note: this is the location of the previous definition cc1plus: all warnings being treated as errors make: *** [out/host/linux-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1 To fix this, refer to this patch. https://github.com/CyanogenMod/android_build/commit/e9cbfa60c8dd60d04570d8bf7bd0d54a4304baf5 It will patch line 61 in build/core/combo/HOST_linux-x86.mk as following. -HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0 +HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libMesa_intermediates/src/glsl/linker.o] Error 1 change external/mesa3d/src/glsl/linker.cpp Adding a "#include <stddef .h=""><br />from<br /> unsigned output_index = offsetof(VertexOutput,varyings) / sizeof(Vector4); /*VERT_RESULT_VAR0*/;<br />to<br /> unsigned output_index = offsetof(VertexOutput,varyings) / sizeof(Vector4); /*VERT_RESULT_VAR0;*/<br /><br /><br />make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/liboprofile_pp_intermediates/arrange_profiles.o] Error 1<br />change external/oprofile/libpp/format_output.h<br />from<br /> mutable counts_t & counts;<br />to<br /> counts_t & counts;<br /><br />make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libgtest_host_intermediates/gtest-all.o] Error change external/gtest/include/gtest/internal/gtest-param-util.h<br />add<br /> #include <cstddef><br /><br />make: *** [out/host/linux-x86/obj/EXECUTABLES/test-librsloader_intermediates/test-librsloader] Error 1<br />change external/llvm/llvm-host-build.mk<br />add<br /> LOCAL_LDLIBS := -lpthread -ldl<br /><br />查看編譯版本等資訊<br />getprop<br /><br /><br /><br /><br />on Mac OS<br />Mac OS:10.6.6(snow leopard)<br />xCode: </stddef><span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;">4.3.3</span><span style="background-color: white; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20px;"> </span>(10G)<br />
<stddef .h="">macport:for snow leopard<br />gmake:3.81<br /><br />download and install package by step on Android source website.<br />1. need HFS+ disk format and disk size is suppose be bigger 25G.<br />2. download xCode.(4.2G). Build Android needs macOS.sdk 10.6. If download xCode4.5, it will not include MacOS10.6. It still need to download old version xCode to get 10.6SDK.<br />3. setup macport and install some packages (see Android source doc)<br />4. change gmake version to 3.81<br />5. Download source code in HFS disk<br />6. change <a href="http://wiki.oneswarm.org/index.php/OS_X_10.6_Snow_Leopard">JDK1.5</a>, snow leopard uses 1.6 by default.<br />7. Change the gcc alias. This is needed by Qemu.<br /><br />sudo rm /usr/bin/gcc<br />sudo ln -s /usr/bin/gcc-4.0 /usr/bin/gcc<br />8. To fix this error go to “external/qemu/” and open Makefile.Android file and edit the following line<br />MY_CC := $(HOST_CC)<br />to<br />MY_CC := gcc<br />9.</stddef>Unknownnoreply@blogger.com0