Android
- Official developer site: https://developer.android.com 需翻墙.
七牛的cdn androiddoc.qiniudn.com
系统修改
APP 路径
/data/data/
为 app 包路径/data/app/
下为用户安装的 app/system/app/
下为系统原装 apppm list packages -f
可列出 app 包及关联文件- 在android设备设置界面上修改网络后,信息会保存在
/data/data/com.android.providers.settings/databases/settings.db
刷机
获取 root 权限
开机 logo
- uboot logo; kernel logo; initlogo.rle; bootanimation.zip
- 可通过屏蔽 init.rc 里相应的服务 bootlogoupdater bootanim 来屏蔽; 或设置属性
mtk 一二屏logo
- 一屏logo:logo.bin, 使用 mtk 线刷 flash_tool 刷入
- 二屏为执行
/system/bin/boot_logo_updater
; 图片位置存疑: 可能在 /dev/logo ? 或者就是与动画同一处/system/media/bootanimation.zip
- 三屏为 andorid 通用的动画阶段
动画阶段
- 开机动画程序 bootanimation
- 代码位置: frameworks/base/cmds/bootanimation/BootAnimation.cpp
- 调用位置: 在init.rc中调用 bootanimation (/system/bin/bootanimation)
- bootanimation 加载文件流程
- 判断是否存在“/data/local/bootanimation.zip”或“/system/media/bootanimation.zip”,
- 若存在的话,则显示bootanimation.zip中的动画;
- 若不存在的话,则显示系统默认的 Android 闪动画面. (/system/framework/framework-res.apk)
- bootanimation.zip 制作: 制作
- 解压后一般包含文件 desc.txt 与文件夹 part0, part1;
- part0, part1 里包含动画帧图片, png 格式, 按名称排列顺序;
- 压缩格式是zip,压缩方式必须选择为“存储”;
- desc.txt 格式:
320 480 10 #宽 高 每秒帧数 p 1 0 part0 # 播放次数1 间隔0 指定文件夹part0 p 0 0 part1 # 无限播放 间隔0 指定文件夹part1
备忘
find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz
Articles
- Android 入门基础教程系列, 看下来感觉很不错.
- 详解 android 的 Activity, 介绍了 Activity 以及它们之间怎么交互, 文章比较老.
-
Libs
ADB
- Android Debug Bridge ←-大部分命令行需求都可以从这个官方文档中获得,包括文件拷贝、应用管理、包管理、网络转发、截屏录屏及其它。
- 装完驱动,打开USB调试, 连接电脑后, 就可以用 adb 工具来连接内置shell
adb shell shell@***:/ $ # 如果已 root , 则可以直接 su 获取 root 身份: su root@***:/ $
- 拷贝文件:
adb pull <remote> <local>
,adb push <local> <remote>
- 获取系统版本:
getprop ro.build.version.release
- 获取系统api版本:
getprop ro.build.version.sdk
- 获取cpu信息:
cat /proc/cpuinfo
- 获取网络IP配置:
netcfg
- 获取网络信息:
netstat
- 获取开机时间:
cat /proc/stat | grep btime
, 为 unixtime格式, 或者cat /proc/uptime
, 第一个时间为开机至今运行秒数
API
- 应用入口, 在
AndroidManifest.xml
中的 相应 Activity 下添加以下:<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
即表示该 Activity 为应用启动时加载的入口 Activity
- Context 运行环境上下文, 为 Activity 的父类之一, 本 Activity 的 Context 可直接用
this
; 整应用的 context 用getApplicationContext()
, 前者生命期与该 Activity 同, 后者生命期随整个应用. - 启动另一个 Activity
Intent intent =new Intent(CurrentActivity.this,OtherActivity.class); startActivity(intent); // 启动 OtherActivity //finish(); // 结束 CurrentActivity
通讯用
Bundle
- 系统通知 Notification
import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.content.Intent; public class MainActivity extends AppActivity { ...... private void mynotify() { NotificationManager manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); Intent intent = new Intent(MainActivity.this,MainActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity .this,0,intent,0); Notification notification = new Notification.Builder(getApplicationContext()) .setContentTitle("标题") .setAutoCancel(true) // 点击即消失 .setContentText("内容") .setSmallIcon(R.mipmap.c_launcher) .setDefaults(Notification.DEFAULT_SOUND) .setContentIntent(pendingIntent) .setWhen(System.currentTimeMillis()) .build(); manager.notify(1, notification);// 第一个参数为预定的 id , 应用可用此 id 删除通知. } }
注意, 此处的
PendingIntent.getActivity(MainActivity .this,0,intent,0);
第四个 flag 参数, 可能可以解决 PendingIntent 已经存在时的 putExtra 数据未更新问题. - 延迟执行
import android.os.Handler; ... private final Handler mDelayHandler = new Handler(); private final Runnable mDelayRunnable = new Runnable() { @Override public void run() { mynotify();// or whatever you what to do. } }; private void delayed(int delayMillis) { mDelayHandler.removeCallbacks(mDelayRunnable);// 清理上次 mDelayHandler.postDelayed(mDelayRunnable, delayMillis); } ...
- 异步任务 短时间异步任务可用
android.os.AsyncTask
(限定在UI线程里使用); 长时间异步任务使用java.util.concurrent
提供的Executor
,ThreadPoolExecutor
或FutureTask
;
Tips
- android.webkit.WebView 不响应
on click
, 不过可以响应on long click
. 或者直接重写onTouchEvent
来模拟click
; - android.webkit.WebView 加载的网页点击链接时会默认弹出浏览器加载,可以直接设置 WebViewClient 来在本WebView 打开:
mywebview.setWebViewClient(new WebViewClient());
- Android Emulator 模拟器默认上不了网, 基本原因是 DNS 设置不对, 可以采取以下步骤来设置:
- 开启模拟器运行;
- 打开windows命令行, 在 sdk 下载目录下找到
adb.exe
所在目录,进入目录, 命令行运行>cd c:\andorid\sdk\platform-tools >adb shell # 顺利进入会出现类似以下的提示符 root#generic_86:/ #
- 继续输入
getprop
, 可以看到 DNS 被默认设置为了10.0.2.3
getprop #结果显示: ... [net.dns1]: [10.0.2.3] ... ...
- 修改设置为你的 DNS, 大功告成
setprop net.dns1 192.168.0.1
- Android Studio 出现 “Gradle sync failed: Unable to start the daemon process.” 错误, 并带有java奔溃提示. 猜测可能原因是java虚拟机内存分配不够, 解决办法:
- 办法一: 以管理员身份运行 Android Studio;
- 办法二: 修改项目gradle.properties文件,添加下面一行代码:
org.gradle.jvmargs=-Xmx512m -XX:MaxPermSize=512m
- Gradle 的代理设置,如果是 socks5 代理, 得在项目 gradle.properties 添加如下设置
org.gradle.jvmargs=-DsocksProxyHost=<your-socks5-ip> -DsocksProxyPort=<your-socks5-port>
- cocos2d-x 在安卓上使用的是
android.opengl.GLSurfaceView
来渲染. SurfaceView 独立于窗口绘制表面,即拥有单独的重绘机制,与父窗口脱离。详细见官方文档:图形架构 - ubuntu交叉编译Android armv7 的
ethtool
工具备忘:# 编译依赖 libmnl git clone git://git.netfilter.org/libmnl cd libmnl ./autogen.sh ./configure --host=--host=arm-linux-gnueabi CC=/home/oak/work/tools/android-ndk-r22b/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi30-clang LDFLAGS=-static make sudo make install # 默认是安装到 /usr/local/lib/ # 编译 ethtool git clone https://kernel.googlesource.com/pub/scm/network/ethtool/ethtool # 需科学上网 PKG_CONFIG_PATH=/usr/local/lib/pkgconfig ./configure --host=arm-linux-gnueabi CC=/home/oak/work/tools/android-ndk-r22b/toolchains/llvm/prebuilt/linux-x86_64/bin/armv7a-linux-androideabi30-clang LDFLAGS=-static make
静态编译,需要使用大于28版本的ndk clang, 否则编译出来的ethtool运行时会报错
error: “ethtool”: executable's TLS segment is underaligned: alignment is 8, needs to be at least 32 for ARM Bionic
-
- ndk-build 默认会把生成的 .so 文件的debug符号给去掉(linux 下可用
file xxx.so
来查看是否带有符号); 未去掉符号的.so文件在$PROJECT_PATH/obj/local/<abi>/
目录下; 详情可见 ndk-stack 使用说明 - aar 打包也有个步骤是去掉 .so 文件的debug符号。
- Android Studio build窗口乱码解决办法:
- 「Help」→ 「Edit Custom VM Options…」
- 添加
-Dfile.encoding=UTF-8
- 重启 Android Studio
- OpenSLES 编程 destroy obj 时,有一定概率会死锁卡住,报错
pthread_mutex_lock_timeout_np returned 110
, 此时可以延时 destroy 来规避这个问题。这应该是 Android源码本身的问题