====== Android ====== * Official developer site: [[https://developer.android.com]] 需翻墙. * 七牛的cdn [[http://androiddoc.qiniudn.com/develop/index.html| androiddoc.qiniudn.com]] ===== 系统修改 ===== ==== APP 路径 ==== * ''/data/data/''为 app 包路径 * ''/data/app/'' 下为用户安装的 app * ''/system/app/'' 下为系统原装 app * ''pm list packages -f'' 可列出 app 包及关联文件 * 在android设备设置界面上修改网络后,信息会保存在 ''/data/data/com.android.providers.settings/databases/settings.db'' ==== 刷机 ==== ==== 获取 root 权限 ==== ==== 开机 logo ==== * [[http://blog.sina.com.cn/s/blog_63f31f3401015r3b.html|android 开机logo详解]] * uboot logo; kernel logo; initlogo.rle; bootanimation.zip * 可通过屏蔽 init.rc 里相应的服务 bootlogoupdater bootanim 来屏蔽; 或设置属性 === mtk 一二屏logo === * [[http://blog.csdn.net/singleton1900/article/details/18655489|mtk logo 详解]] * [[http://helpadude.com/logobuilder_v1-6/|LogoBuilder_v1.6]] * 一屏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 制作: [[http://blog.sina.com.cn/s/blog_4960586c0100vu5v.html|制作]] * 解压后一般包含文件 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 === 备忘 === * https://github.com/bgcngm/mtk-tools * ''find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz'' ===== Articles ===== * [[https://github.com/Freelander/Android_Data|别人汇总的 Android 学习资料]] * [[https://www.runoob.com/w3cnote/android-tutorial-intro.html|Android 入门基础教程系列]], 看下来感觉很不错. * [[https://www.jianshu.com/p/33cc83941ecf|AndroidStudio 工程目录结构及简单使用]] * [[http://www.ibm.com/developerworks/cn/opensource/os-cn-android-actvt/index.html|详解 android 的 Activity]], 介绍了 Activity 以及它们之间怎么交互, 文章比较老. * [[http://www.cnblogs.com/oakpip/archive/2011/04/08/2009800.html|关于 webview]] * [[https://blog.coding.net/blog/understanding-marshmallow-runtime-permission| android 6.0 运行时权限]] * [[http://laobie.github.io/android/2016/02/14/android-studio-tips.html| android studio tips]] * [[https://github.com/jiang111/awesome-android-tips|awesome android tips]] * [[.:mediacodec]] * ^_^[[https://zhuanlan.zhihu.com/p/147322501|TextureView与UI主线程的干扰、帧率正常但卡顿抖动问题的解释]] * [[https://www.cnblogs.com/crazii/p/3875033.html|OpenSLES and AAC related]] * [[https://android.googlesource.com/platform/frameworks/wilhelm/+/master/tests/examples/slesTestDecodeAac.cpp|DecodeAAC example code]] * [[https://android.googlesource.com/platform/frameworks/wilhelm/+/master/include/SLES|OpenSLES header files]] * [[https://www.jianshu.com/p/38015afcdb58|Android事件分发机制详解]] ===== Libs ===== * [[https://code.google.com/p/androidsvg|AndroidSVG]] * [[https://github.com/greenrobot/EventBus|EventBus 消息分发库]] ===== ADB ===== * [[https://developer.android.com/studio/command-line/adb|Android Debug Bridge]] <--大部分命令行需求都可以从这个官方文档中获得,包括文件拷贝、应用管理、包管理、网络转发、截屏录屏及其它。 * 装完驱动,打开USB调试, 连接电脑后, 就可以用 adb 工具来连接内置shell adb shell shell@***:/ $ # 如果已 root , 则可以直接 su 获取 root 身份: su root@***:/ $ * 拷贝文件: ''adb pull '', ''adb push '' * 获取系统版本:''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 下添加以下: 即表示该 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= -DsocksProxyPort= * cocos2d-x 在安卓上使用的是 ''android.opengl.GLSurfaceView'' 来渲染. [[https://developer.android.com/reference/android/view/SurfaceView|SurfaceView]] 独立于窗口绘制表面,即拥有单独的重绘机制,与父窗口脱离。详细见[[https://source.android.com/devices/graphics/architecture|官方文档:图形架构]] * 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 [[https://developer.android.com/ndk/guides/asan#ndk-build|Address Sanitizer]] * ndk-build 默认会把生成的 .so 文件的debug符号给去掉(linux 下可用''file xxx.so'' 来查看是否带有符号); 未去掉符号的.so文件在 ''$PROJECT_PATH/obj/local//''目录下; 详情可见 [[https://developer.android.com/ndk/guides/ndk-stack|ndk-stack ]] 使用说明 * aar 打包也有个步骤是去掉 .so 文件的debug符号。 * Android Studio build窗口乱码[[https://blog.csdn.net/github_2011/article/details/109135258|解决办法]]: * 「Help」-> 「Edit Custom VM Options...」 * 添加 ''-Dfile.encoding=UTF-8'' * 重启 Android Studio * [[https://developer.android.com/ndk/guides/audio/opensl|OpenSLES ]]编程 destroy obj 时,有一定概率会死锁卡住,报错 ''pthread_mutex_lock_timeout_np returned 110'', 此时可以延时 destroy 来规避这个问题。这应该是 Android源码本身的问题