Android Things APP版本更新解决方案

AndroidThings中如果使用传统的Intent来安装APK,你将永远安装不上常见的应用内APK安装方法有以下两种方法1.Intent安装APK的方法如下:Intentintent=newInt

by
江江
on
2018/07/04
Android Things APP版本更新解决方案

AndroidThings中如果使用传统的Intent来安装APK,你将永远安装不上

常见的应用内APK安装方法有以下两种方法

1.Intent安装APK的方法如下:

Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileProvider", new File(path + "app-debug.apk"));
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
startActivity(intent);

同时添加权限:

2.通过install命令来安装

命令如下:

pm install -i 当前包名 --user 0 XX.apk

运行方法:

Runtime.getRuntime().exec("")

注意:以上两种方法在android 手机中没有问题,但截止目前在Android Things 1.0.1中是行不通的

为了能在Android Things系统中更新APP,故经过不断的探索发现,最终采用插件化的方案来解决此问题

经过评估测试,最终发现360出品的RePlugin框架满足我们的需求

https://github.com/Qihoo360/RePlugin

在RePlugin壳子中,必须申请完所有权限,因为壳子是不会更新的。我整理了所有的权限,在下面列出来

<br/><!--Android Things所有权限--><br/><uses-permission android:name="com.google.android.things.permission.MANAGE_BLUETOOTH" /><br/><uses-permission android:name="com.google.android.things.permission.PERFORM_UPDATE_NOW" /><br/><uses-permission android:name="com.google.android.things.permission.USE_PERIPHERAL_IO" /><br/><uses-permission android:name="com.google.android.things.permission.SET_TIME" /><br/><uses-permission android:name="com.google.android.things.permission.REBOOT" /><br/><br/><!--Android所有权限--><br/><uses-permission android:name="andriod.permission.ACCESS_CHECKIN_PROPERTIES"></uses-permission><br/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /><br/><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><br/><uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS"/><br/><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><br/><uses-permission android:name="android.permission.ACCESS_NOTIFICATION_POLICY"/><br/><uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/><br/><uses-permission android:name="android.permission.ADD_VOICEMAIL"/><br/><uses-permission android:name="android.permission.BLUETOOTH"/><br/><uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/><br/><uses-permission android:name="android.permission.BODY_SENSORS"/><br/><uses-permission android:name="android.permission.BROADCAST_STICKY"/><br/><uses-permission android:name="android.permission.CALL_PHONE"/><br/><uses-permission android:name="android.permission.CAMERA"/><br/><uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/><br/><uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE"/><br/><uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/><br/><uses-permission android:name="android.permission.DISABLE_KEYGUARD"></uses-permission><br/><uses-permission android:name="android.permission.EXPAND_STATUS_BAR"></uses-permission><br/><uses-permission android:name="android.permission.GET_ACCOUNTS"/><br/><uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/><br/><uses-permission android:name="android.permission.GET_TASKS"/><br/><uses-permission android:name="android.permission.INSTALL_SHORTCUT"/><br/><uses-permission android:name="android.permission.INTERNET"/><br/><uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/><br/><uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS"/><br/><uses-permission android:name="android.permission.NFC"></uses-permission><br/><uses-permission android:name="android.permission.PERSISTENT_ACTIVITY"></uses-permission><br/><uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"></uses-permission><br/><uses-permission android:name="android.permission.READ_CALENDAR"/><br/><uses-permission android:name="android.permission.READ_CALL_LOG"/><br/><uses-permission android:name="android.permission.READ_CONTACTS"/><br/><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/><br/><uses-permission android:name="android.permission.READ_PHONE_STATE"/><br/><uses-permission android:name="android.permission.READ_SMS"/><br/><uses-permission android:name="android.permission.READ_SYNC_SETTINGS"/><br/><uses-permission android:name="android.permission.READ_SYNC_STATS"/><br/><uses-permission android:name="android.permission.READ_VOICEMAIL"/><br/><uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/><br/><uses-permission android:name="android.permission.RECEIVE_MMS"/><br/><uses-permission android:name="android.permission.RECEIVE_SMS"/><br/><uses-permission android:name="android.permission.RECEIVE_WAP_PUSH"/><br/><uses-permission android:name="android.permission.RECORD_AUDIO"/><br/><uses-permission android:name="android.permission.REORDER_TASKS"/><br/><uses-permission android:name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS"/><br/><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/><br/><uses-permission android:name="android.permission.RESTART_PACKAGES"/><br/><uses-permission android:name="android.permission.SEND_SMS"/><br/><uses-permission android:name="android.permission.SET_ALARM"/><br/><uses-permission android:name="android.permission.SET_WALLPAPER"/><br/><uses-permission android:name="android.permission.SET_WALLPAPER_HINTS"/><br/><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/><br/><uses-permission android:name="android.permission.TRANSMIT_IR"/><br/><uses-permission android:name="android.permission.UNINSTALL_SHORTCUT"/><br/><uses-permission android:name="android.permission.USE_FINGERPRINT"/><br/><uses-permission android:name="android.permission.USE_SIP"/><br/><uses-permission android:name="android.permission.VIBRATE"/><br/><uses-permission android:name="android.permission.WAKE_LOCK"/><br/><uses-permission android:name="android.permission.WRITE_CALENDAR"/><br/><uses-permission android:name="android.permission.WRITE_CALL_LOG"/><br/><uses-permission android:name="android.permission.WRITE_CONTACTS"/><br/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><br/><uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS"/><br/><uses-permission android:name="android.permission.WRITE_VOICEMAIL"/><br/><br/><br/><!--所有系统权限--><br/><uses-permission android:name="android.permission.ACCOUNT_MANAGER"/><br/><uses-permission android:name="android.permission.BATTERY_STATS"/><br/><uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_CARRIER_MESSAGING_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_CARRIER_SERVICES"/><br/><uses-permission android:name="android.permission.BIND_CHOOSER_TARGET_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_DEVICE_ADMIN"/><br/><uses-permission android:name="android.permission.BIND_CONDITION_PROVIDER_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_DREAM_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_INCALL_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_INPUT_METHOD"/><br/><uses-permission android:name="android.permission.BIND_MIDI_DEVICE_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_NFC_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_PRINT_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_QUICK_SETTINGS_TILE"/><br/><uses-permission android:name="android.permission.BIND_REMOTEVIEWS"/><br/><uses-permission android:name="android.permission.BIND_SCREENING_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_TEXT_SERVICE"></uses-permission><br/><uses-permission android:name="android.permission.BIND_TV_INPUT"></uses-permission><br/><uses-permission android:name="android.permission.BIND_VOICE_INTERACTION"></uses-permission><br/><uses-permission android:name="android.permission.BIND_VPN_SERVICE"></uses-permission><br/><uses-permission android:name="android.permission.BIND_VR_LISTENER_SERVICE"/><br/><uses-permission android:name="android.permission.BIND_WALLPAPER"/><br/><uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED"/><br/><uses-permission android:name="android.permission.BROADCAST_PACKAGE_REMOVED"/><br/><uses-permission android:name="android.permission.BROADCAST_SMS"/><br/><uses-permission android:name="android.permission.BROADCAST_WAP_PUSH"/><br/><uses-permission android:name="android.permission.CALL_PRIVILEGED"/><br/><uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"/><br/><uses-permission android:name="android.permission.CAPTURE_SECURE_VIDEO_OUTPUT"/><br/><uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"/><br/><uses-permission android:name="android.permission.CHANGE_COMPONENT_ENABLED_STATE"/><br/><uses-permission android:name="android.permission.CHANGE_CONFIGURATION"/><br/><uses-permission android:name="android.permission.CLEAR_APP_CACHE"/><br/><uses-permission android:name="android.permission.CONTROL_LOCATION_UPDATES"/><br/><uses-permission android:name="android.permission.DELETE_CACHE_FILES"/><br/><uses-permission android:name="android.permission.DELETE_PACKAGES"/><br/><uses-permission android:name="android.permission.DIAGNOSTIC"/><br/><uses-permission android:name="android.permission.DUMP"></uses-permission><br/><uses-permission android:name="android.permission.FACTORY_TEST"></uses-permission><br/><uses-permission android:name="android.permission.GET_ACCOUNTS_PRIVILEGED"/><br/><uses-permission android:name="android.permission.GLOBAL_SEARCH"/><br/><uses-permission android:name="android.permission.INSTALL_LOCATION_PROVIDER"/><br/><uses-permission android:name="android.permission.INSTALL_PACKAGES"/><br/><uses-permission android:name="android.permission.LOCATION_HARDWARE"/><br/><uses-permission android:name="android.permission.MANAGE_DOCUMENTS"/><br/><uses-permission android:name="android.permission.MASTER_CLEAR"/><br/><uses-permission android:name="android.permission.MEDIA_CONTENT_CONTROL"/><br/><uses-permission android:name="android.permission.MODIFY_PHONE_STATE"/><br/><uses-permission android:name="android.permission.MOUNT_FORMAT_FILESYSTEMS"/><br/><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><br/><uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"></uses-permission><br/><uses-permission android:name="android.permission.READ_FRAME_BUFFER"/><br/><uses-permission android:name="android.permission.READ_INPUT_STATE"/><br/><uses-permission android:name="android.permission.READ_LOGS"/><br/><uses-permission android:name="android.permission.REBOOT"/><br/><uses-permission android:name="android.permission.SEND_RESPOND_VIA_MESSAGE"/><br/><uses-permission android:name="android.permission.SET_ALWAYS_FINISH"/><br/><uses-permission android:name="android.permission.SET_ANIMATION_SCALE"/><br/><uses-permission android:name="android.permission.SET_DEBUG_APP"/><br/><uses-permission android:name="android.permission.SET_PREFERRED_APPLICATIONS"></uses-permission><br/><uses-permission android:name="android.permission.SET_PROCESS_LIMIT"></uses-permission><br/><uses-permission android:name="android.permission.SET_TIME"></uses-permission><br/><uses-permission android:name="android.permission.SET_TIME_ZONE"></uses-permission><br/><uses-permission android:name="android.permission.SIGNAL_PERSISTENT_PROCESSES"/><br/><uses-permission android:name="android.permission.STATUS_BAR"/><br/><uses-permission android:name="android.permission.UPDATE_DEVICE_STATS"/><br/><uses-permission android:name="android.permission.WRITE_APN_SETTINGS"/><br/><uses-permission android:name="android.permission.WRITE_GSERVICES"/><br/><uses-permission android:name="android.permission.WRITE_SECURE_SETTINGS"/><br/><uses-permission android:name="android.permission.WRITE_SETTINGS"/><br/>

但是,光这些还不够,还需要解决两个坑

1.关于FileProvider的问题

我们需要提前在RePlugin中申请注册,Replugin是不会动态申请FileProvider

所以,需要在宿主程序中添加:

<br/><provider<br/> android:name="android.support.v4.content.FileProvider"<br/> android:authorities="宿主包名.fileProvider"<br/> android:exported="false"<br/> android:grantUriPermissions="true"><br/> <meta-data<br/> android:name="android.support.FILE_PROVIDER_PATHS"<br/> android:resource="@xml/file_paths" /><br/></provider><br/>

注意一点:此处填写宿主包名,当我们在插件中使用context.getPackageName()的时候,拿到的是宿主包名

2.在Android Things中APP默认是横屏,但当我们加载打开插件时,会发现APP被强制改为了竖屏

在这里,尝试反编译宿主APK,打开AndroidManifest文件后,发现screenOrientation的值为1,故RePlugin框架默认是将所有的Activity坑位默认设置的portrait竖屏

<br/><activity<br/> android:theme="@ref/0x01030006"<br/> android:name="com.xx.a.ActivityP2NRNTS1"<br/> android:exported="false"<br/> android:process=":p2"<br/> android:screenOrientation="1"<br/> android:configChanges="0x4b0" /><br/>

解决方案如下,修改RePlugin源码,找到replugin-host-gradle源码,修改ComponentsGenerator类,添加oriL变量,然后将所有的oriV改为oriL

江江江江于 2026-10-13 13:22:37 修改阅读 26054评论 0点赞 0