/data/data/
为 app 包路径/data/app/
下为用户安装的 app/system/app/
下为系统原装 apppm list packages -f
可列出 app 包及关联文件/data/data/com.android.providers.settings/databases/settings.db
/system/bin/boot_logo_updater
; 图片位置存疑: 可能在 /dev/logo ? 或者就是与动画同一处 /system/media/bootanimation.zip
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
adb shell shell@***:/ $ # 如果已 root , 则可以直接 su 获取 root 身份: su root@***:/ $
adb pull <remote> <local>
, adb push <local> <remote>
getprop ro.build.version.release
getprop ro.build.version.sdk
cat /proc/cpuinfo
netcfg
netstat
cat /proc/stat | grep btime
, 为 unixtime格式, 或者 cat /proc/uptime
, 第一个时间为开机至今运行秒数AndroidManifest.xml
中的 相应 Activity 下添加以下:<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter>
即表示该 Activity 为应用启动时加载的入口 Activity
this
; 整应用的 context 用 getApplicationContext()
, 前者生命期与该 Activity 同, 后者生命期随整个应用.Intent intent =new Intent(CurrentActivity.this,OtherActivity.class); startActivity(intent); // 启动 OtherActivity //finish(); // 结束 CurrentActivity
通讯用 Bundle
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
;on click
, 不过可以响应 on long click
. 或者直接重写 onTouchEvent
来模拟 click
;mywebview.setWebViewClient(new WebViewClient());
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] ... ...
setprop net.dns1 192.168.0.1
org.gradle.jvmargs=-Xmx512m -XX:MaxPermSize=512m
org.gradle.jvmargs=-DsocksProxyHost=<your-socks5-ip> -DsocksProxyPort=<your-socks5-port>
android.opengl.GLSurfaceView
来渲染. SurfaceView 独立于窗口绘制表面,即拥有单独的重绘机制,与父窗口脱离。详细见官方文档:图形架构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
file xxx.so
来查看是否带有符号); 未去掉符号的.so文件在 $PROJECT_PATH/obj/local/<abi>/
目录下; 详情可见 ndk-stack 使用说明-Dfile.encoding=UTF-8
pthread_mutex_lock_timeout_np returned 110
, 此时可以延时 destroy 来规避这个问题。这应该是 Android源码本身的问题